Nginx gunicorn - VladimirFilonov/moscowdjango GitHub Wiki
Схема работы в данном случае такая:
- Nginx является frontend-ом, и браузеры общаются именно с ним. Мультидоменной конфигурацией рулит именно Nginx. Приняв запрос он решает какому backend-у его пробросить.
- Gunicorn - это WSGI веб-сервер. Каждый django-проект запускается на отдельном инстансе гуникорна. Именно ему будут приходить запросы от nginx-а
- Чтобы Gunicorn неожиданно не упал, а точнее, чтобы поднялся, если неожиданно упадет, запускать его будем с помощью supervisor. Вообще, есть несколько вариантов, но пока разберем только этот.
Установим все компоненты. На примере ubuntu:
$ sudo apt-get install nginx supervisor
$ sudo pip install gunicorn
Основной конфиг нгинкса (/etc/nginx/nginx.conf) мы трогать не будем. Проверим только, чтобы была такая конструкция:
include /etc/nginx/sites-enabled/*;
Конфиги для разных проектов мы будем делать в отдельных файлах в этой директории.
Каждый конфиг будет выглядеть примерно так:
# /etc/nginx/sites-enabled/project1.conf
upstream project1_server_djangoapp {
server localhost:8000 fail_timeout=0;
}
server {
listen 80;
server_name project1.com www.project1.com;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
location / {
proxy_pass http://project1_server_djangoapp;
}
location /static/ {
alias /home/projects/project1/static/;
expires max;
gzip on;
gzip_types text/css application/x-javascript;
}
}
Собственно, базово это все.
Опять не будем трогать основной конфиг /etc/supervisor/supervisord.conf, а для каждого проекта создадим отдельный файл
#/etc/supervisor/conf.d/project1_django.conf
[program:project1_django]
user=projects_user
autorestart=true
autostart=true
command=env PYTHONHASHSEED=random gunicorn project.wsgi:application -w 3 -t 90 -b 127.0.0.1:8000
directory=/home/projects/project1/
redirect_stderr=true
-w 3 - количество воркеров.
-t 90 - таймаут ожидания ответа от джанги
-b 127.0.0.1:8000 - адрес и порт на который биндится гуникорн. Именно на этот адрес и порт будет пробрасывать запросы нгинкс directory=/home/projects/project1 - папка в которой лежит manage.py
Теперь, собственно перезапустим все, и проверим, что оно работает
$ sudo service nginx reload
$ sudo supervisorctl update
$ sudo supervisorctl status
project1_django RUNNING pid 4828, uptime 0:00:03