Ubuntu에서 Nginx로 Django 배포
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;
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
Reference
이 문제에 관하여(Ubuntu에서 Nginx로 Django 배포), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/heinkhantzaw/django-deployment-with-nginx-in-ubuntu-1cin텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)