Ubuntu에서 Nginx로 Django 배포

12868 단어 djangonginxtutorial

This was just a note for myself as I faced several errors during my first deployment with Django. This note is for those who are facing problems during the deployment. I hope it helps!



먼저 Ubuntu 리포지토리에서 패키지를 설치합니다. Python 3에서 Django를 사용하는 경우 다음을 입력합니다.

sudo apt-get update
sudo apt-get install python3-pip python3-dev libpq-dev nginx


포스트그레SQL 설치




sudo apt-get update
sudo apt-get install python3-pip python3-dev libpq-dev postgresql postgresql-contrib nginx 


MySQL 설치




sudo apt-get update
sudo apt-get install mysql-server
mysql_secure_installation


데이터베이스 생성




CREATE DATABASE myproject;


  • 포스트그레스

  • CREATE USER myprojectuser WITH PASSWORD 'password'; 
    GRANT ALL PRIVILEGES ON DATABASE myproject TO myprojectuser;
    


  • MySQL

  • CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'password'; 
    GRANT ALL PRIVILEGES ON * . * TO 'newuser'@'localhost';
    


    Python VirtualEnv 생성




    sudo -H pip3 install --upgrade pip
    sudo -H pip3 install virtualenv
    cd ~/myproject
    virtualenv myprojectenv
    source myprojectenv/bin/activate 
    pip install django gunicorn psycopg2 (For Postgres)
    


    setting.py의 변경




    ALLOWED_HOSTS = [ * ]
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.postgresql_psycopg2',
            'NAME': 'myproject',
            'USER': 'myprojectuser',
            'PASSWORD': 'password',
            'HOST': 'localhost',
            'PORT': '',
        }
    }
    
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'myproject',
            'USER': 'myprojectuser',
            'PASSWORD': 'password',
        }
    }
    


    마이그레이션



    이제 관리 스크립트를 사용하여 초기 데이터베이스 스키마를 데이터베이스로 마이그레이션할 수 있습니다.

    python manage.py makemigrations
    python manage.py migrate
    


    다음을 입력하여 프로젝트의 관리 사용자를 만듭니다.

    python manage.py createsuperuser
    


    사용자 이름을 선택하고 이메일 주소를 제공하고 암호를 선택하고 확인해야 합니다.
    다음을 입력하여 구성한 디렉터리 위치에 모든 정적 콘텐츠를 수집할 수 있습니다.

    python manage.py collectstatic
    


    Gunicorn 시스템 서비스 파일 생성



    이제 Gunicorn을 사용하여 애플리케이션 서버를 시작하고 중지하는 보다 강력한 방법을 구현할 것입니다. 이를 달성하기 위해 systemd 서비스 파일을 만들 것입니다.

    텍스트 편집기에서 sudo 권한으로 Gunicorn용 시스템 서비스 파일을 생성하고 엽니다.

    sudo nano /etc/systemd/system/gunicorn.service
    


    gunicorn.service 파일




    [Unit]
    Description=gunicorn daemon
    Requires=gunicorn.socket
    After=network.target
    
    [Service]
    Type=notify
    # the specific user that our service will run as
    User=root
    Group=root
    # another option for an even more restricted service is
    # DynamicUser=yes
    # see http://0pointer.net/blog/dynamic-users-with-systemd.html
    RuntimeDirectory=gunicorn
    WorkingDirectory=/var/www/html/[ProjectName]
    ExecStart=/var/www/html/[ProjectName]/project_venv/bin/gunicorn config.wsgi
    ExecReload=/bin/kill -s HUP $MAINPID
    KillMode=mixed
    TimeoutStopSec=5
    PrivateTmp=true
    
    [Install]
    WantedBy=multi-user.target
    


    Gunicorn 소켓 파일 확인



    프로세스의 상태를 확인하여 시작할 수 있는지 확인하십시오.

    sudo systemctl status gunicorn
    


    gunicorn.socket 생성




    sudo nano /etc/systemd/system/gunicorn.socket
    


    gunicorn.socket 파일




    [Unit]
    Description=gunicorn socket
    
    [Socket]
    ListenStream=/run/gunicorn.sock
    # Our service won't need permissions for the socket, since it
    # inherits the file descriptor by socket activation
    # only the nginx daemon will need access to the socket
    User=www-data
    # Optionally restrict the socket permissions even more.
    # Mode=600
    
    [Install]
    WantedBy=sockets.target
    


    gunicorn 서비스 실행




    sudo systemctl start gunicorn
    sudo systemctl enable gunicorn
    sudo systemctl status gunicorn
    sudo systemctl daemon-reload
    sudo systemctl restart gunicorn
    


    Nginx를 Gunicorn에 대한 프록시 패스로 구성




    sudo nano /etc/nginx/sites-available/[ProjectName]
    


    그런 다음 입력

    upstream app_server {
        server unix:/run/gunicorn.sock fail_timeout=0;
    }
    
    server {
        listen 80;
        listen [::]:80;
        server_name 128.199.221.253;  # here can also be the IP address of the server
    
        keepalive_timeout 5;
        client_max_body_size 4G;
    
        access_log /var/www/html/[ProjectName]/logs/nginx-access.log;
        error_log /var/www/html/[ProjectName]/logs/nginx-error.log;
    
        location /static/ {
            autoindex on;
            alias /var/www/html/[ProjectName]/static/;
        }
    
        # checks for static file, if not found proxy to app
        location / {
            try_files $uri @proxy_to_app;
          }
    
        location @proxy_to_app {
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_set_header Host $http_host;
          proxy_redirect off;
          proxy_pass http://app_server;
        }
      }
    


    SSL 인증서 추가




    upstream app_server {
        server unix:/run/gunicorn.sock fail_timeout=0;
    }
    
    server {
        listen 80;
        listen [::]:80;
        server_name 128.199.79.246;  # here can also be the IP address of the server
        return 301 https://[DomainName]$request_uri;
      }
    
    server{
        # SSL configuration
        listen 443 ssl http2;
        listen [::]:443 ssl http2;
        server_name [DomainName];
    
        ssl        on;
        ssl_certificate         /etc/ssl/certs/cert.pem;
        ssl_certificate_key     /etc/ssl/private/key.pem;
        ssl_client_certificate /etc/ssl/certs/cloudflare.crt;
        ssl_verify_client on;
    
        keepalive_timeout 5;
        client_max_body_size 4G;
    
        access_log /home/[UserName]/logs/nginx-access.log;
        error_log /home/[UserName]/logs/nginx-error.log;
    
        location /static/ {
            autoindex on;
            alias /home/[UserName]/[ProjectName]/[DjangoAppName]/static/;
        }
    
        # checks for static file, if not found proxy to app
        location / {
            try_files $uri @proxy_to_app;
          }
    
        location @proxy_to_app {
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_set_header Host $http_host;
          proxy_redirect off;
          proxy_pass http://app_server;
        }
    }
    


    모든 서비스 다시 시작




    sudo systemctl daemon-reload
    sudo systemctl restart gunicorn
    sudo nginx -t && sudo systemctl restart nginx
    

    좋은 웹페이지 즐겨찾기