Полезный блог о django, python

инструкции, руководства для изучающих django, python

Настройка связки nginx, supervisor, gunicorn для django

nginx, gunicorn, django logos

В предыдущих статьях я уже рассказывал как запустить встроенный в django сервер для разработки или developer server. Он удобен именно для разработки и тестирования ваших проектов. А вот как сервер для продакшена он не годится - он просто для этого не разрабатывался чего и не скрывают разработчики. Для боевого сервера нужно использовать другие приложения. Для django существуют несколько вариантов связок технологий.

Традиционные веб сервера типа nginx или apache не могут взаимодействовать с python программами напрямую. Поэтому был разработан стандарт такого взаимодействия wsgi. В качестве wsgi сервера сейчас популярен gunicorn - сервер написаный на python спецально для этого. Но в большинстве случаев его используют в связке с nginx или apache, которые занимаются раздачей статики, и лишь запросы непосредственно к django приложениям передают gunicorn. Именно такую связку мы и будем настраивать.

Установка и настройка gunicorn

Как и любая python программа gunicorn можно установить глобально. Но мы будем использовать виртуальное окружение, созданное в одной из предыдущих статей.

Переходим в директорию с виртуальным окружением и активируем его
pavel@pavel-udesktop:~/djprojects$ cd djangotest/
pavel@pavel-udesktop:~/djprojects/djangotest$ source bin/activate
(djangotest) pavel@pavel-udesktop:~/djprojects/djangotest$
устанавливаем gunicorn с помощью pip
(djangotest) pavel@pavel-udesktop:~/djprojects/djangotest$ pip install gunicorn
Collecting gunicorn
  Using cached gunicorn-19.4.5-py2.py3-none-any.whl
Installing collected packages: gunicorn
Successfully installed gunicorn-19.4.5
попробуем запустить сервер gunicorn
(djangotest) pavel@pavel-udesktop:~/djprojects/djangotest$ cd testproject/
(djangotest) pavel@pavel-udesktop:~/djprojects/djangotest/testproject$ gunicorn testproject.wsgi
[2016-03-17 17:30:55 +0600] [12023] [INFO] Starting gunicorn 19.4.5
[2016-03-17 17:30:55 +0600] [12023] [INFO] Listening at: http://127.0.0.1:8000 (12023)

Теперь по адресу http://127.0.0.1:8000 будет доступен наш сайт на django. Но доступен он будет только до тех пор пока открыт терминал, с которого мы запустили gunicorn. Стоит его закрыть и сервер остановится. Можно конечно запустить gunicorn в daemon режиме. Но тогда будет сложно и неудобно им управлять, например перезагружать его при необходимости. Выход это не запускать gunicorn напрямую, а доверить это специальной утилите под названием supervisor.

Установка и настройка supervisor

Supervisor - программа, а точнее клиент серверная система, для запуска и контроля различных процессов в unix среде. Для начала необходимо установить её с помощью вашего пакетного менеджера.

sudo apt-get install supervisor

дальше необходимо настроить автоматический запуск gunicorn. Для этого необходимо создать конфигурационный файл в каталоге /etc/supervisor/conf.d/

pavel@pavel-udesktop:~$ cd /etc/supervisor/conf.d/
pavel@pavel-udesktop:/etc/supervisor/conf.d$ sudo gedit testproject.conf


[program:gunicorn_testproject]
command=/home/pavel/djprojects/djangotest/bin/gunicorn --config='/home/pavel/djprojects/djangotest/gunicorn.conf.py' --pythonpath '/home/pavel/djprojects/djangotest/testproject/' --env DJANGO_SETTINGS_MODULE=testproject.settings testproject.wsgi
directory=/home/pavel/djprojects/djangotest/testproject/
user=pavel
autostart=true
autorestart=true
redirect_stderr=true

тут все пути к файлам и папкам необходимо заменить на ваши. Самые внимательные заметят что мы ссылаемся на некий файл gunicorn.conf.py из папки проекта, хотя его там нет. Ну значит самое время его создать.

pavel@pavel-udesktop:/etc/supervisor/conf.d$ cd /home/pavel/djprojects/djangotest/
pavel@pavel-udesktop:~/djprojects/djangotest$ gedit gunicorn.conf.py

это конфигурационный файл gunicorn. Он представляет собой обычный python модуль. Опции задаются как соответствующие переменные. Пока нам нужна только одна опция - порт, на котором будет отвечать gunicorn. Для удобства, вместо стандартного джанговского 8000, зададим например 8009

bind='127.0.0.1:8009'

перезагружаем сервер supervisor

pavel@pavel-udesktop:~/djprojects/djangotest$ sudo service supervisor restart

проверяем - по адресу 127.0.0.1:8009 должен быть доступен наш сайт

Установка nginx

Теперь установил nginx, чтобы именно он обрабатывал все запросы и перенаправлял к gunicorn только те что непосредственно к django приложению. Устанавливаем nginx с помощью вашего менеджера пакетов

sudo apt-get install nginx

теперь нужно настроить его. Мы можем, конечно, сделать так чтобы он обрабатывал запросы типа http://127.0.0.1:8009/post/1 , но гораздо удобней будет, если ваш сайт будет доступен по более понятному адресу. Например http://djangotest.loc . Я использую зону ~~loc~~ на локальном компьютере для тестирования. Для того, чтобы это сделать, необходимо отредактировать системный файл ~~/etc/hosts~~

sudo gedit /etc/hosts

дописываем в начале наш домен и ip адрес на который будет перенаправляться запрос. 127.0.0.1 - это специальный адрес, по нему нам будет отвечать nginx

127.0.0.1   djangotest.loc
127.0.0.1   localhost
127.0.1.1   pavel-udesktop

# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

Nginx настравается с помощью конфигурационных файлов в папке /etc/nginx/sites-available/ . Создадим там новый файл с каким нибудь "говорящим" названием

pavel@pavel-udesktop:~$ cd /etc/nginx/sites-available/
pavel@pavel-udesktop:/etc/nginx/sites-available$ sudo gedit djangotest.loc.conf

djangotest.loc.conf

server {
    listen 80;
    server_name djangotest.loc;
    location / {
        proxy_pass http://127.0.0.1:8009;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;
    }
}

обратите внимание. В опции proxy_pass мы задаём адрес по которому у нас работает gunicorn. Для того чтобы включить наш сайт, надо сделать символическую ссылку на этот конфиг в папку /etc/sites-enabled/

sudo ln -s /etc/nginx/sites-available/djangotest.loc.conf /etc/nginx/sites-enabled/

sudo service nginx restart
sudo service supervisor restart

Переходим в браузер. Открываем новый адреc djangotest.loc. Всё должно работать )

В этой статье не рассмотрена работа со статическим контентом, то для чего нам в принципе и нужен nginx. Эта тема будет раскрыта в одной из следующих записей