Apache2를 사용하여 Django 애플리케이션 배포

8748 단어 djangoubuntu
django 애플리케이션 생성을 완료한 후 사용할 수 있도록 배포할 수 있습니다. 여러 가지 방법이 있습니다. 이 게시물에서는 Apache2를 사용하여 django 응용 프로그램을 배포하는 방법을 보여줍니다.

나는 다음을 사용할 것이다:
  • 장고
  • 아나콘다3
  • AWS EC2
  • 우분투 18.04
  • 아파치2
  • 암호화하자

  • 시작하기 전에 매우 간단한 django 애플리케이션을 만들었습니다. 현재 localhost, 포트 8000에서 실행 중입니다.

    requirements.txt 만들기

    $ pip freeze > requirements.txt
    


    1. EC2 설정



    아나콘다3 설치



    가상 환경을 만들기 위해 먼저 anaconda3를 설치합시다.

    $ sudo apt-get update && sudo apt-get upgrade
    
    $ sudo apt-get install curl
    
    $ curl -O https://repo.anaconda.com/archive/Anaconda3-2020.02-Linux-x86_64.sh
    


    (다른 버전here을 찾을 수 있습니다.)

    $ bash Anaconda3-2020.02-Linux-x86_64.sh
    


    이 명령의 경우

    $ conda env list
    


    오류를 반환하려면 이 명령을 실행하십시오.

    $ export PATH=(path to anaconda3 directory)/anaconda3/bin:$PATH
    $ source ~/.bashrc
    


    그런 다음 가상 환경을 만듭니다.

    $ conda create -n (any name you want) python=(python version)
    


    Django 개발 환경 설정



    생성한 가상 환경을 활성화한 후 django를 설치합니다. 그런 다음 로컬 django 파일을 EC2 인스턴스로 전송합니다. git 또는 FTP를 사용할 수 있습니다.

    $ pip install -r /path/to/requirements.txt
    


    필요한 모든 패키지가 설치되도록 이 명령을 실행하십시오.

    이제 애플리케이션이 EC2 공개 IP에서 실행 중입니다.

    2. 애플리케이션 배포



    아파치2 설치

    $ sudo apt-get install apache2
    


    apache2가 설치되면 HTTP 포트에서 EC2 인스턴스에 연결을 시도할 때 이 페이지가 표시됩니다.


    애플리케이션에 도메인 이름 연결



    Apache 서버에 도메인 이름을 설정하려면 apache.conf 파일을 편집하십시오./etc/apache2에 있습니다.

    $ sudo vim apache2.conf
    


    이 줄을 추가하십시오.

    LoadModule proxy_module modules/mod_proxy.so
    LoadModule proxy_http_module modules/mod_proxy_http.so
    
    
    <VirtualHost *:80>
        ServerAdmin (your contact address)
        ServerName (your domain)
    
        ProxyRequests Off
        ProxyPreserveHost On
        ProxyPass / http://localhost:8000/
        ProxyPassReverse / http://localhost:8000/
    
        <Directory (path to your django root - where wsgi.py is)>
            <Files wsgi.py>
                Require all granted
            </Files>
        </Directory>
    </VirtualHost>
    


    가상 호스트는 ServerName을 사용하여 이름 기반이 될 수 있습니다. http 서버는 일반적으로 포트 80을 사용하며 '*:80'은 포트 80의 모든 IP 주소를 의미합니다. 누군가가 ServerName으로 작성한 도메인을 사용하여 웹 브라우저로 서버에 액세스하면 apache2 서버는 localhost:8000으로 리디렉션됩니다.

    이 명령으로 서버를 시작하십시오.

    $ sudo systemctl restart apache2
    


    명령이 오류를 반환하면 다음을 실행하여 오류 메시지를 확인하십시오.

    $ sudo systemctl status apache2
    


    또는/var/log/apache2/error.log에서 오류 로그를 확인할 수 있습니다.

    /etc/apache2 내부에 'modules' 디렉토리가 없으면/usr/lib/apache2에 있습니다. 디렉토리를 찾아/etc/apache2에 복사합니다.

    $ sudo cp -r /usr/lib/apache2/modules /etc/apache2/modules
    


    모든 오류가 수정되었으면 서버를 다시 시작하십시오.



    SSL 설정



    이제 배포가 완료되었지만 주소 표시줄에 '안전하지 않음' 경고가 표시됩니까? 즉, HTTPS 대신 HTTP 프로토콜을 사용하기 때문에 연결에 대한 보안이 부족합니다. HTTPS는 암호화 및 인증을 제공하므로 HTTP보다 더 안전합니다.

    아파치2 설정



    Let's Encrypt는 무료 SSL 인증서를 제공합니다. Certbot은 Let's Encrypt 인증서를 자동으로 사용하여 HTTPS를 활성화하기 위한 것입니다.

    $ sudo snap install --classic certbot
    $ sudo certbot --apache
    


    /etc/letsencrypt/live/(귀하의 도메인)에서 pem 파일을 찾을 수 있으면 준비가 된 것입니다.
    이제 apache2.conf 파일을 다시 편집하십시오.
    에 다음 줄을 추가하여 HTTP를 HTTPS로 리디렉션합니다.

    <VirtualHost *:80>
    ...
            RewriteEngine On
            RewriteCond %{SERVER_NAME} =(your domain)
            RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
    ...
    </VirtualHost>
    


    Let's Encrypt를 설치하면/etc/apache2에서 apache2-le-ssl.conf 파일을 찾을 수 있습니다. 이 파일을 편집하십시오.

    <IfModule mod_ssl.c>
    <VirtualHost *:443>
            ServerAdmin (your contact address)
            ServerName (your domain)
            ProxyRequests Off
            ProxyPreserveHost On
            SSLProxyEngine on
            SSLProxyVerify none
            SSLProxyCheckPeerCN off
            SSLProxyCheckPeerName off
            SSLProxyCheckPeerExpire off
            ProxyPass / https://localhost:8001/
            ProxyPassReverse / https://localhost:8001/
    
            <Directory (path to your django root - where wsgi.py is)>
                    <Files wsgi.py>
                            Require all granted
                    </Files>
            </Directory>
    
    
    SSLCertificateFile /etc/letsencrypt/live/(your domain)/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/(your domain)/privkey.pem
    Include /etc/letsencrypt/options-ssl-apache.conf
    </VirtualHost>
    </IfModule>
    


    장고 설정



    runserver는 HTTP에서만 작동하므로 django-sslserver를 설치합니다.

    $ pip install django-sslserver
    


    settings.py 편집

    # settings.py
    INSTALLED_APPS = [
        ...
        'sslserver',
        ...
    ]
    
    SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTOCOL', 'https')
    SECURE_SSL_REDIRECT = True
    SESSION_COOKIE_SECURE = True
    CSRF_COOKIE_SECURE = True
    SECURE_HSTS_PRELOAD = True
    SECURE_HSTS_INCLUDE_SUBDOMAINS = True
    


    그런 다음 이 명령을 실행합니다.

    $ python manage.py runsslserver 0:8001
    


    gunicorn을 사용하여 서버를 실행하려면 이것을 실행하십시오.

    $ nohup gunicorn --certfile=/home/ubuntu/anaconda3/envs/(your conda virtual environment name)/lib/python3.9/site-packages/sslserver/certs/development.crt --keyfile=/home/ubuntu/anaconda3/envs/(your conda virtual environment name)/lib/python3.9/site-packages/sslserver/certs/development.key --bind 0.0.0.0:8001 (your django project name).wsgi &
    



    저 자물쇠 보이시죠? 귀하의 사이트는 이제 암호화되었습니다.

    좋은 웹페이지 즐겨찾기