Skip to content

Instantly share code, notes, and snippets.

@saippuakauppias
Forked from vgarvardt/nginx_gqunicorn.rst
Last active July 18, 2022 16:40
Show Gist options
  • Save saippuakauppias/4598401 to your computer and use it in GitHub Desktop.
Save saippuakauppias/4598401 to your computer and use it in GitHub Desktop.

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

Настройка upstart (/etc/init/gunicorn.conf)

Если по какой-то причине supervisor вам не подходит, то вот примерная команда для запуска гуникорна с upstart'а:

description "Gunicorn for project"

start on runlevel [2345]
stop on runlevel [06]

kill timeout 5
respawn

script
    exec su -c '/home/project/.env/bin/gunicorn_django --preload --workers=17 --log-file=/home/project/log/gunicorn.log --pid=/home/project/run/gunicorn.pid --bind=127.0.0.1:8888 /home/project/current/project/settings' project
end script
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment