====== Nginx / uWsgi / Django 연결하기 ======
* [[https://wikidocs.net/7387|nginx 및 uWSGI연동]]
* [[https://uwsgi-docs.readthedocs.io/en/latest/tutorials/Django_and_nginx.html|uWSGI와 nginx를 사용하여 Django와 웹 서버 설정하기]]
* [[https://twowix.me/85|runserver로 실제 서버를 돌리면 안되는 이유]]
===== 설정 =====
==== uWSGI 실행 테스트 =====
uwsgi --http :8000 --home /home/mama/.pyenv/versions/maro --chdir /home/mama/garam/maro \
--static-map /static=/home/mama/garam/maro/gov/static --module conf.wsgi
* --http :8000 [포트번호지정]
* --home [virtualenv 가상환경 디렉토리를 지정]
* --chdir [manage.py가 들어있는 Django 프로젝트 디렉토리를 지정]
* --static-map [static 디렉토리 지정]
* --module [WSGI 모듈을 지정]
==== uWSGI 옵션 설정 ====
[uwsgi]
uid=foo
base=/home/%(uid)/garam
# the virtualenv (full path)
home=/home/%(uid)/.pyenv/versions/maro
chdir=/home/%(uid)/garam/maro
module=conf.wsgi:application
env=DJANGO_SETTINGS_MODULE=conf.settings.product
# process-related settings
# uWSGI 프로세스를 master로 돌아가게 해줍니다.
master=true
# maximum number of worker processes
processes=5
max-requests=5000
daemonize=/var/log/garam/maro_uwsgi.log
# UNIX socket 파일의 위치입니다. socket file의 위치를 잡아줘도 되며 localhost와 port를 명시해줘도 됩니다.
socket=/var/log/garam/maro.sock
# UNIX socket 소유자
chown-socket=%(uid):www-data
# UNIX socket에 대한 권한 설정입니다. 666을 해야 실행이 가능합니다.
chmod-socket=660
# uWSGI를 통해서 생성된 파일들은 삭제하는 옵션입니다.
vacuum=true
# thread 사용을 앱(uWSGI) 내에서 가능하게 해줍니다.
enable-threads = true
# 단일한 python interpreter를 사용하게 하는 옵션입니다.
single-interpreter = true
# master말고 각각의 worker에(master에서 spawn한 자식들) 앱을 로드하는 설정입니다.
lazy-apps = true
===== 서비스 등록 스크립트 생성 =====
**/etc/systemd/system/uwsgi.service** 파일을 아래와 같은 내용으로 생성한다.
[Unit]
Description=uWSGI Emperor service
[Service]
ExecStart=/home/foo/django_test/venv/bin/uwsgi \
--emperor /home/foo/django_test/run
User=foo
Group=www-data
Restart=on-failure
KillSignal=SIGQUIT
Type=notify
NotifyAccess=all
StandardError=syslog
[Install]
WantedBy=multi-user.target
**--emperor** 옵션으로 **uwsgi.ini** 파일이 들어있는 디렉토리를 지정한다.
===== uWSGI 서비스 등록 =====
sudo systemctl start uwsgi
sudo systemctl enable uwsgi
===== uWSGI 서비스 구동 확인 =====
systemctl status uwsgi
만약 구동 실패시 에러 로그는 /var/log/syslog에서 확인할 수 있다.
===== Nginx 설정 =====
==== 사이트 설정 추가 ====
**/etc/nginx/sites-available/django_test** 파일을 아래와 같은 내용으로 생성한다.
upstream django {
server unix:///usr/local/share/pythonblog/config/pythonblog.sock;
}
server {
listen 80 default_server;
listen [::]:80 default_server;
#server_name www.xxxxxx.com
charset utf-8;
location / {
uwsgi_pass django;
include /etc/nginx/uwsgi_params;
}
location /static {
alias /usr/local/share/pythonblog/staticfiles;
}
}
==== 사이트 추가 ====
sudo ln -s /etc/nginx/sites-available/django_test /etc/nginx/sites-enabled
==== nginx 설정 문법 검사 및 재기동 ====
sudo nginx -t
sudo systemctl restart nginx
==== 방화벽 해제 ====
사용하는 Port에 대한 방화벽확인
sudo ufw delete allow 8000
sudo ufw allow 'Nginx Full'
===== 한 서버에 여러 Django 애플리케이션 =====
==== 시스템 전역 uWSGI 설치 ====
sudo apt-get install python3-dev python3-pip python3-setuptools
sudo -H pip3 install uwsgi
==== uWSGI 설정 ====
여러 애플리케이션의 **.ini** 파일을 **/etc/uwsgi/sites** 디렉토리 한 곳으로 모은다.
[Unit]
Description=uWSGI Emperor service
[Service]
ExecStart=/usr/local/bin/uwsgi --emperor /etc/uwsgi/sites
Restart=on-failure
KillSignal=SIGQUIT
Type=notify
NotifyAccess=all
StandardError=syslog
[Install]
WantedBy=multi-user.target
**ExecStart** 변수에서 **--emperor /etc/uwsgi/sites** 옵션을 두는 것이 핵심이다.
시스템 전역적으로 동작하므로 **User**, **Group** 변수 설정을 없앤다.
그리고 시스템 전역의 uWSGI를 이용하므로 가상환경의 uWSGI는 굳이 설치하지 않는다.
==== Nginx 설정 ====
**upstream** 정의 이름이 각 애플리케이션 서버마다 중복되지 않도록 주의한다.
**server_name**에서 도메인 이름을 올바로 선언하고 정적파일, 로그파일 등의 절대경로를 정확히 지정한다.
==== 참고문헌 ====
[[https://wikidocs.net/6611|Nginx, uWSGI 배포 - https://wikidocs.net/6611 ]]