Nginx gunicorn - VladimirFilonov/moscowdjango GitHub Wiki

Nginx+gunicorn

Схема работы в данном случае такая:

  1. Nginx является frontend-ом, и браузеры общаются именно с ним. Мультидоменной конфигурацией рулит именно Nginx. Приняв запрос он решает какому backend-у его пробросить.
  2. Gunicorn - это WSGI веб-сервер. Каждый django-проект запускается на отдельном инстансе гуникорна. Именно ему будут приходить запросы от nginx-а
  3. Чтобы Gunicorn неожиданно не упал, а точнее, чтобы поднялся, если неожиданно упадет, запускать его будем с помощью supervisor. Вообще, есть несколько вариантов, но пока разберем только этот.

Установим все компоненты. На примере ubuntu:

$ sudo apt-get install nginx supervisor
$ sudo pip install gunicorn

Настроим nginx

Основной конфиг нгинкса (/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;
    }
}

Собственно, базово это все.

Настроим supervisor

Опять не будем трогать основной конфиг /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
⚠️ **GitHub.com Fallback** ⚠️