사용자 도구

사이트 도구


python:django:nginx

Nginx / uWsgi / Django 연결하기

설정

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 옵션 설정

/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

서비스 등록 스크립트 생성

/etc/systemd/system/uwsgi.service 파일을 아래와 같은 내용으로 생성한다.

/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 파일을 아래와 같은 내용으로 생성한다.

/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에서 도메인 이름을 올바로 선언하고 정적파일, 로그파일 등의 절대경로를 정확히 지정한다.

참고문헌

python/django/nginx.txt · 마지막으로 수정됨: 2025/04/15 10:05 저자 127.0.0.1