06. NGINX 및 uWSGI 연동

Django 설정

접근 허용 호스트 지정

conf/settings.py 파일을 수정해 접근 허용 호스트를 지정해야 합니다.

ALLOWED_HOSTS = ['.example.com',]

uWSGI 연동을 위해서는 반드시 설정해야 하며 앞에 .을 표기하면 하위 도메인까지 모두 허용처리합니다.

STATIC_ROOT 디렉토리 지정

conf/settings.py 파일의 끝에 다음 줄을 추가합니다.

STATIC_ROOT = os.path.join(BASE_DIR, 'assets/')

정적파일 데이터 모으기

(venv) $ python manage.py collectstatic

/var/www/com.example/repo/assets 경로 위치에 정적 파일들이 위치합니다.

uWSGI 구동 테스트

독립된 가상환경에서 uwsgi 파이썬 패키지를 설치하여 테스트해볼 수 있습니다. (단, 테스트 과정을 생략하고 아래에서 바로 진행할 수 있습니다.)

uwsgi 패키지를 설치합니다.

(venv) $ pip install uwsgi

uwsgi로 Django 웹 애플리케이션을 실행합니다.

(venv) $ uwsgi --http :8000 --home /var/www/com.example.www/venv/ --chdir /var/www/com.example.www/repo/ --module conf.wsgi

주요 옵션의 내용은 다음과 같습니다.

  • --http 포트 번호를 지정한다.
  • --home virtualenv 가상환경 디렉토리를 지정한다.
  • --chdir manage.py가 들어있는 Django 프로젝트 디렉토리를 지정한다.
  • --module WSGI 모듈을 지정한다.

파이썬 WSGI HTTP 서버를 구동하여 마찬가지로 http://서버_아이피:8000/ 주소에 접속하여 내용이 잘 출력되는지 확인합니다.

uWSGI 서버가 올바로 동작하면 가상환경에서 이제 빠져나옵니다.

(venv) $ deatviate

그리고 독립된 가상환경에서 설치했던 uWSGI 패키지는 삭제합니다. 이후 전역적으로 설치된 uWSGI를 사용할 것이기 때문입니다.

한 서버에 여러 Django 애플리케이션

시스템 전역 uWSGI 설치

$ sudo apt-get install python3-dev python3-pip python3-setuptools
$ sudo -H pip3 install --upgrade pip
$ sudo -H pip3 install wheel
$ sudo -H pip3 install uwsgi

-H 옵션을 주지 않으면 아래와 같이 경고가 발생합니다.

The directory '/home/egg/.cache/pip/http' or its parent directory is not owned by the current user and the cache has been disabled. Please check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.

서비스 등록 스크립트 생성

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

[Unit]
Description=uWSGI Emperor service

[Service]
ExecStart=/usr/local/bin/uwsgi --emperor /etc/uwsgi/sites --uid ham --gid www-data
Restart=on-failure
KillSignal=SIGQUIT
Type=notify
NotifyAccess=all
StandardError=syslog

[Install]
WantedBy=multi-user.target

ExecStart 변수에서 --emperor /etc/uwsgi/sites 옵션을 두는 것이 핵심입니다.

--uid, --gid 옵션으로 알맞은 사용자와 그룹 권한으로 프로세스를 실행하도록 합니다.

emperor 모드 실행할 때 보통은 --master 옵션을 주지 않습니다.

그리고 시스템 전역의 uWSGI를 이용하므로 가상환경의 uWSGI는 굳이 설치하지 않습니다.

uWSGI 옵션 파일

여러 애플리케이션의 .ini 파일을 /etc/uwsgi/sites 디렉토리 한 곳에 저장할 것입니다. 따라서 /etc/uwsgi/sites 디렉토리를 생성합니다.

$ sudo mkdir -p /etc/uwsgi/sites

/etc/uwsgi/sites/com.example.www.ini 파일 생성합니다.

[uwsgi]
uid = ham
base = /var/www/com.example.www

home = %(base)/venv
chdir = %(base)/repo
module = conf.wsgi:application
env = DJANGO_SETTINGS_MODULE=conf.settings.production

master = true
processes = 5

pidfile = %(base)/run/uwsgi.pid
socket = %(base)/run/uwsgi.sock
logto = %(base)/logs/uwsgi.log
chown-socket = %(uid):www-data
chmod-socket = 660
vacuum = true
umask = 022

uid 변수와 base 변수를 계정 이름과 경로에 알맞게 수정합니다.

만약 단일 WSGI 서버만 구동할 것이라면 위 .ini 파일을 개별 프로젝트 디렉토리에 넣을 수도 있습니다.

그러나 여러 개의 WSGI 서버를 구동한다면 /etc/uwsgi/sites와 같은 시스템 설정 디렉토리에 여러 개의 .ini 파일을 모아놓을 수 있습니다.

uWSGI 서비스 등록

$ sudo systemctl enable uwsgi
$ sudo systemctl start uwsgi

enable 명령어는 심볼릭링크를 아래와 같이 생성합니다.

Created symlink from /etc/systemd/system/multi-user.target.wants/uwsgi.service to /etc/systemd/system/uwsgi.service.

uWSGI 서비스 구동 확인

sudo systemctl status uwsgi

만약 구동 실패시 에러 로그는 /var/log/syslog에서 확인할 수 있습니다.

파이썬 소스 코드 수정하면 uWSGI를 재기동해야 합니다.

sudo systemctl restart uwsgi

NGINX 설정

서버 블록 수정

/etc/nginx/sites-available/com.example.www 파일을 아래와 같은 내용으로 수정합니다.

upstream com-example-www-django {
    server unix:/var/www/com.example.www/run/uwsgi.sock;
}

server {
    listen 80;
    listen [::]:80;
    server_name example.com www.example.com;
    charset utf-8;

    access_log /var/www/com.example.www/logs/access.log;
    error_log /var/www/com.example.www/logs/error.log;

    location / {
        include         /etc/nginx/uwsgi_params;
        uwsgi_pass      com-example-www-django;
    }

    location /assets/ {
        root /var/www/com.example.www/repo;
        access_log   off;
        expires      30d;
    }

    location /media/ {
        root /var/www/com.example.www/repo;
        access_log   off;
    }
}

com.example.www 같은 디렉토리 경로와 example.com, www.example.com 같은 도메인 이름을 시스템 설정에 맞게 적당히 변경합니다.

NGINX 설정 문법 검사 및 재기동

$ sudo nginx -t
$ sudo systemctl restart nginx

최종 수정일시: 2019-02-15 13:02


blog comments powered by Disqus