Nginx 웹서버를 통해 django API server를 배포하는 방법에 대해 간단하게 소개하려고 합니다.
EC2 인스턴스발급은 생략하겠습니다. 오로지 우분투 내에서 django와 nginx,gunicorn 세팅에 대해서만 언급하겠습니다.
아키텍처는 다음과 같습니다.
클라이언트(브라우저) ⬅➡ 웹서버(Web Server - nginx)⬅➡ WSGI(Web Server Gateway Interface - gunicorn) ⬅➡ WAS(Web Application Server - django)
로컬에서 django 세팅이 일부 필요합니다.
(venv) $ pip freeze > requirements.txt
__init__.py
파링 생성settings.py
파일을 base.py
로 변경.local.py
, production.py
파일 생성.settings/
__init__.py
base.py
local.py
production.py
# settings/local.py
from .base import *
DEBUG = True
ALLOWED_HOSTS = []
from .base import *
DEBUG = False
ALLOWED_HOSTS = [
# public_ip 주소
# ex) 13.126.105.123
]
import os
...
os.environ.setdefault('DJANGO_SETTINGS_MODULE', '프로젝트폴더명.settings.production')
...
#!/usr/bin/env python
import os
import sys
if __name__ == '__main__':
os.environ.setdefault('DJANGO_SETTINGS_MODULE', '프로젝트폴더명.settings.local')
...
# settings/base.py
STATIC_URL = '/static/'
STATICFILES_DIRS = [
# 직접 만든 static 폴더의 경로를 적습니다.
# ex) BASE_DIR / 'static_폴더명'
]
STATIC_ROOT = BASE_DIR / 'staticfiles'
$ sudo apt install gunicorn
$ sudo apt-get install python3-dev python3-pip libpq-dev python3-venv python3-wheel -y
$ sudo apt-get install gcc libpq-dev -y
$ pip3 install wheel
$ cd backend
$ python3 -m venv venv
$ source venv/bin/activate
$ pip3 install -r requirements.txt
$ python3 manage.py makemigrations
$ python3 manage.py migrate
$ python3 manage.py collectstatic
$ deactivate
gunicorn, nginx 세팅이 필요합니다.
$ sudo vi /etc/systemd/system/gunicorn.service
[Unit]
Description= [프로젝트명]
After=network.target
[Service]
User=ubuntu
Group=www-data
WorkingDirectory=/home/ubuntu/루트폴더명
ExecStart=/home/ubuntu/프로젝트명/venv/bin/gunicorn --access-logfile - --workers 3 --bind unix:/home/ubuntu/루트폴더명/루트폴더명.sock 프로젝트폴더명.wsgi:application
[Install]
WantedBy=multi-user.target
$ sudo systemctl start gunicorn
$ sudo systemctl enable gunicorn
#ngixn 상태확인
$ sudo systemctl status gunicorn
# 에러발생시 gunicorn.service 수정 후
$ sudo systemctl daemon-reload
$ sudo systemctl restart gunicorn
$ sudo vim /etc/nginx/sites-enabled/default
server{
# 프론트엔드에서 한 부분은 놔두고!
...
# api로 url이 들어오면 nginx에서 api를 제거하고 서버로 보내주겠다!
location /api/ {
rewrite ^/api(/.*)$ $1 break;
includ proxy_params;
proxy_pass http://unix:/home/ubuntu/루트폴더명/루트폴더명.sock;
}
# static 관련해서는 staticfiles를 씁시다!
location /static/ {
alias /home/ubuntu/루트폴더명/staticfiles/;
}
}
$ sudo nginx -t
$ sudo systemctl restart nginx
# 에러발생시
$ sudo systemctl daemon-reload
$ sudo systemctl restart gunicorn
$ sudo systemctl restart nginx
#ngixn 상태확인
$ sudo systemctl status nginx
글쓸 때 참고 한것
관련된 글