Статьи

Как настроить nginx и uWSGI для обслуживания проектов Django

На этот раз пост о Python … в последнее время я имел дело с проектом на основе Django. Одной из задач проекта было развертывание приложения с использованием nginx и uWSGI. Чтобы задокументировать процесс и помочь другим, я решил опубликовать краткое объяснение о том, как настроить nginx, uWSGI и Django для совместной работы. В отличие от большинства статей, которые я нашел в Интернете, я не просто устанавливаю окончательную конфигурацию, но пытаюсь объяснить, что происходит на каждом этапе — надеюсь, это будет полезно для других.

Nginx

 

Я начинаю с установки nginx, так как команда разработчиков nginx предоставляет репозиторий yum и дистрибутив rpm, этот шаг довольно прост, однако сначала он требует настройки репозитория nginx yum.

Настройка репозитория nginx yum

  1. Загрузите rpm для настройки хранилища, это доступно по адресу: http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm (уведомление что я использую CentOS 6, проверьте URL для других O / S)
  2. Установите обороты
  3. Импортировать ключи nginx
  4. Необязательно, но настоятельно рекомендуется: отредактируйте /etc/yum.repos.d/nginx.repo и измените значение gpgcheck на 1

Ниже приведены команды для выполнения шагов 1-3:

wget http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
rpm -ivH nginx-release-centos-6-0.el6.ngx.noarch.rpm
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-nginx

настройка nginx

Самое простое, как это может быть:

yum install nginx
# nginx can now be started using the following command:
/etc/init.d.nginx start

Чтобы убедиться, что все работает, перейдите на http: // ip, если все в порядке, должна появиться страница приветствия nginx.

uWSGI

Это немного более сложная история, uWSGI должен быть собран из исходного кода (по крайней мере, я не нашел для этого никаких оборотов в минуту). Однако это не так уж сложно:

Здание UWSGI

  1. Предварительные условия: поскольку я компилирую из исходного кода, вероятно, должны быть выполнены некоторые предварительные условия. У меня не было никаких проблем, но это не значит, что другие машины не будут пропускать некоторые из них. если сборка не удалась, я бы проверил наличие недостающих пакетов на основании сообщения об ошибке
  2. Скачать с сайта uWSGI (я использовал версию 1.0.1):
    wget http://projects.unbit.it/downloads/uwsgi-1.0.1.tar.gz
  3. Откройте файл tar и перейдите в новую папку
    tar xvzf uwsgi-1.0.1.tar.gz && cd uwsgi-1.0.1
  4. Настройте и запустите сборку
    python setup.py build 
    make
  5. Новый исполняемый файл с именем ‘uwsgi’ должен быть создан
  6. Чтобы проверить, что uwsgi построен правильно и может что-то делать, запустите его, используя встроенный HTTP-сервер (флаг -http), и попробуйте получить к нему доступ из браузера.
    1. Команда ‘uwsgi -http 127.0.0.1:8888’ запустит сервер, прослушивающий http на порту 8888. 
    2. При обращении к серверу по этому адресу должна появиться страница с ошибкой (жалоба на невозможность найти приложение Python), но это хороший знак. 
    3. Завершение работы сервера (kill -2 делает работу)

До сих пор мы устанавливали и запускали как nginx, так и uWSGI, но между ними нет никакой связи — каждый является автономным сервером. Следующим шагом будет создание этого соединения.

«Спаривание» nginx и uWSGI

uWSGI

Флаг ‘—help’ выводит подробную справку uWSGI, однако вот флаги, с которых я бы начал:

--socket the socket to bind to (to this nginx will connect)
--master enable master process, this is useful for an easy management of 
    the process pool
--workers <n> number of workers to start
--harakiri <n> when harakiri mode is enabled any request takes longer 
    than <n> seconds will be dropped and the corresponding worker 
    will be recycled
--disable-logging disable requests logging (useful for reducing the logging volume 
    - only errors are logged)
--daemonize <logfile> daemonize and log into the specified log file
--pidfile <path> where to write the master pid to
--vacuum clear the environment on exit (remove UNIX sockets and pidfiles).
    BTW: it didn't clean the pid file on my environment but it worth trying.
--max-requests maximum number of requests for each worker before recycling
--gid <id/name> setgid to <id/groupname>
--uid <id/name> setuid to <id/username>

Запустите uWSGI с помощью следующей команды (напоминание: она пока не сможет обслуживать любое приложение Django — в данный момент я просто «связываю» его с nginx), очевидно, что расположение uid, gid и файлов предназначено только для Например, команда ниже должна работать в любой среде:

uwsgi --socket 127.0.0.1:8889 --master --workers 1 --harakiri 30 
 --disable-logging --daemonize /tmp/daemonize.log 
 --pidfile /tmp/pidfile.txt --vacuum --max-requests 100 
 --gid 500 --uid 500 --vacuum

Обратите внимание, что uWSGI не предоставляет стартовый скрипт (/etc/init.d/uwsgi) в дистрибутиве, и я также не предоставляю его здесь, однако он должен быть достаточно простым, чтобы создать скрипт для запуска uWSGI с использованием флагов, описанных выше. ,

Nginx

Теперь я должен настроить nginx для маршрутизации запросов на сервер uWSGI, конфигурация nginx находится в папке /etc/nginx/conf.d. Создайте резервную копию файла default.conf в этой папке и замените его следующим файлом конфигурации, который настроит nginx для перенаправления запросов на сервер uWSGI, рассматриваемых на предыдущем шаге:

server {

 listen 80;
 server_name <replace with your hostname>;
 
 #Replace paths for real deployments...
 access_log /tmp/access.log; 
 error_log /tmp/error.log;

 location / {
 include uwsgi_params;
 uwsgi_pass 127.0.0.1:8889;
 }
}

Приведенная выше конфигурация направляет все запросы, принятые сервером nginx, на сервер uWSGI, прослушивающий порт 8889 на локальном хосте. Перезапустите nginx (/etc/init.d/nginx restart) и используйте браузер для доступа к nginx через порт 80. Мы должны получить ошибку, но заметим, что на этот раз ошибка генерируется uWSGI, а не nginx (даже если мы обращаемся к порту 80) — nginx и uWSGI теперь «спарены».

Джанго

Последний шаг — настроить uWSGI для выполнения моего проекта Django и указать nginx на местоположение статических ресурсов Django. В следующем разделе я приму следующее как конфигурацию моего проекта Django:

  • Мой сайт Django находится в / home / eyal / mysite
  • Этот сайт имеет одно приложение в каталоге / home / eyal / mysite / myapp и
  • Статические ресурсы приложения находятся в / home / eyal / mysite / myapp / static

Модуль настройки Django

Создайте новый модуль Python с именем uwsgiApp в папке сайта (это имя «uwsgiApp» не является обязательным, но оно будет тем, которое я собираюсь использовать ниже, поэтому, если вы изменили приведенную ниже команду запуска uWSGI, то также следует изменить); модуль должен быть похож на пример ниже (обратите особое внимание на путь и пакеты):

import os, sys
sys.path.append('/home/eyal')
os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'

import django.core.handlers.wsgi

application = django.core.handlers.wsgi.WSGIHandler()

Обратите внимание, что я использую папку выше «mysite» для добавления к пути и включения пакета «mysite» в переменную окружения DJANGO_SETTINGS_MODULE.

Nginx

Добавьте следующий раздел в конфигурацию вашего nginx для сопоставления статического ресурса (опять же: обратите особое внимание на путь и пакеты):

location /static {
 root /home/eyal/mysite/myapp;
}

Важно отметить, что я удалил «статический» элемент из пути файловой системы (подумайте об этом, как если бы он был перемещен в само определение местоположения). Теперь файл конфигурации nginx должен выглядеть так:

server {

 listen 80;
 server_name <replace with your hostname>;
 
 #Replace paths for real deployments...
 access_log /tmp/access.log; 
 error_log /tmp/error.log;

 location / {
   include uwsgi_params;
   uwsgi_pass 127.0.0.1:8889;
 }
 
 location /static {
   root /home/eyal/mysite/myapp;
 }

}

Перезапустите nginx, чтобы убедиться, что новая конфигурация применяется.

uWSGI

Приходится закрывать уже работающий uWSGI (убить -2 до pid главного процесса uWSGI). Добавьте два флага ниже к тем, которые использовались в предыдущих запусках uWSGI:

--pythonpath directory to add to the pythonpath
--module name of python config module

Используя приведенную выше конфигурацию Django, новая команда запуска будет:

uwsgi --socket 127.0.0.1:8889 --master --workers 1 --harakiri 30 
   --disable-logging --daemonize /tmp/daemonize.log --pidfile /tmp/pidfile.txt 
   --vacuum --max-requests 100 --gid 500 --uid 500 
   --pythonpath /home/eyal/mysite --module uwsgiApp

Вот и все — указание браузера на порт 80 теперь должно отображать ваше приложение Django через nginx и uWSGI.

Источник: http://blog.eyallupu.com/2012/01/how-to-configure-nginx-and-uwsgi-to.html