사용자 도구

사이트 도구


python:django:nginx

차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

양쪽 이전 판이전 판
다음 판
이전 판
python:django:nginx [2023/10/26 14:30] – [uWSGI 옵션 설정] taekgupython:django:nginx [2025/04/15 10:05] (현재) – 바깥 편집 127.0.0.1
줄 1: 줄 1:
 +====== 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 실행 테스트 =====
 +<code bash>
 +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
 +</code>
 +  * --http :8000 [포트번호지정]
 +  * --home [virtualenv 가상환경 디렉토리를 지정]
 +  * --chdir [manage.py가 들어있는 Django 프로젝트 디렉토리를 지정]
 +  * --static-map [static 디렉토리 지정]
 +  * --module [WSGI 모듈을 지정]
 +==== uWSGI 옵션 설정 ====
 +
 +<code ini /home/foo/garam/run/maro_uwsgi.ini>
 +[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</code>
 +
 +
 +===== 서비스 등록 스크립트 생성 =====
 +
 +**/etc/systemd/system/uwsgi.service** 파일을 아래와 같은 내용으로 생성한다.
 +
 +
 +<code ini /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
 +
 +</code>
 +
 +**--emperor** 옵션으로 **uwsgi.ini** 파일이 들어있는 디렉토리를 지정한다.
 +
 +===== uWSGI 서비스 등록 =====
 +
 +<code bash>
 +sudo systemctl start uwsgi
 +sudo systemctl enable uwsgi
 +</code>
 +
 +===== uWSGI 서비스 구동 확인 =====
 +
 +<code bash>
 +systemctl status uwsgi
 +</code>
 +
 +만약 구동 실패시 에러 로그는 /var/log/syslog에서 확인할 수 있다.
 +
 +
 +===== Nginx 설정 =====
 +==== 사이트 설정 추가 ====
 +
 +**/etc/nginx/sites-available/django_test** 파일을 아래와 같은 내용으로 생성한다.
 +
 +
 +<code default /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;
 +        }
 +
 +}
 +</code>
 +
 +==== 사이트 추가 ====
 +
 +<code bash>
 +sudo ln -s /etc/nginx/sites-available/django_test /etc/nginx/sites-enabled
 +</code>
 +
 +==== nginx 설정 문법 검사 및 재기동 ====
 +
 +<code bash>
 +sudo nginx -t
 +sudo systemctl restart nginx
 +</code>
 +
 +==== 방화벽 해제 ====
 +
 +사용하는 Port에 대한 방화벽확인
 +<code bash>
 +sudo ufw delete allow 8000
 +sudo ufw allow 'Nginx Full'
 +</code>
 +
 +===== 한 서버에 여러 Django 애플리케이션 =====
 +==== 시스템 전역 uWSGI 설치 ====
 +
 +<code bash>
 +sudo apt-get install python3-dev python3-pip python3-setuptools
 +sudo -H pip3 install uwsgi
 +</code>
 +
 +==== uWSGI 설정 ====
 +여러 애플리케이션의 **.ini** 파일을 **/etc/uwsgi/sites** 디렉토리 한 곳으로 모은다.
 +
 +<code ini>
 +[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
 +</code>
 +
 +**ExecStart** 변수에서 **--emperor /etc/uwsgi/sites** 옵션을 두는 것이 핵심이다.
 +
 +시스템 전역적으로 동작하므로 **User**, **Group** 변수 설정을 없앤다.
 +
 +그리고 시스템 전역의 uWSGI를 이용하므로 가상환경의 uWSGI는 굳이 설치하지 않는다.
 +
 +==== Nginx 설정 ====
 +
 +**upstream** 정의 이름이 각 애플리케이션 서버마다 중복되지 않도록 주의한다.
 +
 +**server_name**에서 도메인 이름을 올바로 선언하고 정적파일, 로그파일 등의 절대경로를 정확히 지정한다.
 +
 +==== 참고문헌 ====
 +[[https://wikidocs.net/6611|Nginx, uWSGI 배포 - https://wikidocs.net/6611 ]]