Сервер разработки для Django запускается просто – командой runserver. Для запуска Django на prod сервере попотеть нужно немного больше. В этой статье я расскажу как это сделать, используя uwsgi и supervisor.
Создадим директорию для проекта
1 | mkdir ~/myproject && cd ~/myproject |
Полный путь в нашем случае будет /home/myuser/myproject
В эту директорию нужно скопировать файлы вашего проекта с рабочей машины, через scp, filezilla, sshfs или любым другим способом. Не забыть поменять в конфигурации проекта DEBUG на False и добавить в ALLOWED_HOSTS активный хост. Также нужно провести миграции и сделать collectstatic.
Теперь нужно создать виртуальное окружение. Это нужно для того, чтобы избежать конфликтов между пакетами с другим проектом или же с системными.
1 | virtualenv env |
Активируем его:
1 | source env/bin/activate |
Теперь с помощью pip установим пакеты, использованные в проекте. Для этого воспользуемся файлом requirements.txt (если таковой имеется).
1 | pip install -r requirements.txt |
Установим uwsgi.
1 | pip install uwsgi |
WSGI (Web Server Gateway Interface) — стандарт взаимодействия программ с веб-сервером, одной из реализаций этого стандарта является uWSGI. Взаимодействие между uwsgi и nginx происходит посредством unix-сокета.
Создадим в директории с проектом поддиректорию dpl, где будем хранить файлы конфигурации и логи.
1 | mkdir dpl |
Теперь там создадим файл uwsgi.ini и наполним его содержимым:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | [uwsgi] home=/home/myuser/myproject/env chdir=/home/myuser/myproject master=True disable-logging=True vacuum=True pidfile=/home/myuser/myproject/dpl/project.pid max-requests=5000 socket=/home/myuser/myproject/dpl/quiz.sock processes=2 pythonpath=/home/myuser/myproject env=DJANGO_SETTINGS_MODULE=myproject.settings module = myproject.wsgi:application touch-reload=/home/myuser/myproject/touch.reload |
В разделе module конфигурации нужно указать имя django-проекта, myproject в нашем случае. Параметр touch-reload – это файл, изменения в котором будут вызывать перезапуск uwsgi. Его удобно использовать, например, вместе с git. Home указывает на путь к виртуальному окружению, chdir – к директории с самим проектом. Uwsgi использует огромное число настраиваемых параметров, изучить полный список которых можно здесь http://uwsgi-docs.readthedocs.org/en/latest/Options.html
Установим supervisor. Он будет следить за состоянием проекта и в случае ошибок и падений – перезапускать его.
1 | sudo apt-get install supervisor |
Конфигурации проектов supervisor считывает из директории /etc/supervisor/conf.d
Создадим там файл myproject.conf с содержимым:
1 2 3 4 5 6 7 8 9 | [program:myproject] user = myuser directory = /home/myuser/myproject command = /home/myuser/myproject/env/bin/uwsgi /home/myuser/myproject/dpl/uwsgi.ini autostart = true autorestart = true stderr_logfile = /home/myuser/myproject/dpl/uwsgi-err.log stdout_logfile = /home/myuser/myproject/dpl/uwsgi-out.log stopsignal = QUIT |
В параметрах указан user – наш пользователь, directory – путь к проекту, command – команда запуска uwsgi. Укажем пути для логов, чтобы следить за ошибками.
Теперь нужно перечитать конфигурацию:
1 | sudo supervisorctl update |
Посмотреть статус процессов supervisor можно командой:
1 | sudo supervisorctl status |
Перезапустить наш проект после изменений:
1 | sudo supervisorctl restart myproject |
Пришло время веб-сервера. Установка nginx подробнее уже описана здесь. Установим его:
1 | sudo apt-get install nginx |
В директории /etc/nginx/sites-available создадим файл myproject.com.conf и пропишем в нем:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | server{ listen 80; server_name myproject.com www.myproject.com; client_max_body_size 75M; error_log /home/myuser/myproject/dpl/nginx-err.log; location / { uwsgi_pass unix:///home/myuser/myproject/dpl/myproject.sock; include /home/myuser/myproject/dpl/uwsgi_params; } location /static { alias /home/myuser/myproject/static; } location /media { alias /home/myuser/myproject/media; } } |
В uwsgi_pass указан путь до сокета, который мы создали для uwsgi. Далее, подключается файл с параметрами uwsgi_params. Он обязателен, его можно скачать отсюда https://github.com/phusion/nginx/blob/master/conf/uwsgi_params или просто создать пустой и наполнить содержимым:
1 2 3 4 5 6 7 8 9 10 11 12 13 | uwsgi_param QUERY_STRING $query_string; uwsgi_param REQUEST_METHOD $request_method; uwsgi_param CONTENT_TYPE $content_type; uwsgi_param CONTENT_LENGTH $content_length; uwsgi_param REQUEST_URI $request_uri; uwsgi_param PATH_INFO $document_uri; uwsgi_param DOCUMENT_ROOT $document_root; uwsgi_param SERVER_PROTOCOL $server_protocol; uwsgi_param HTTPS $https if_not_empty; uwsgi_param REMOTE_ADDR $remote_addr; uwsgi_param REMOTE_PORT $remote_port; uwsgi_param SERVER_PORT $server_port; uwsgi_param SERVER_NAME $server_name; |
Добавим ссылку на конфигурацию в sites-available:
1 | ln -s /etc/nginx/sites-available/myproject.com.conf /etc/nginx/sites-enabled/myproject.com.conf |
Перезапустим nginx:
1 | sudo service nginx reload |
Наконец то мы сделали все что нужно!
Если ошибок не возникло, наш проект будет доступен по своему адресу в браузере. Большинство ошибок связано, как правило, с некорректными путями в конфигурациях, рекомендую перепроверять их дважды. Также много ошибок возникает из-за несоответствия пользователей и прав доступа к файлам.