На этот раз пост о Python … в последнее время я имел дело с проектом на основе Django. Одной из задач проекта было развертывание приложения с использованием nginx и uWSGI. Чтобы задокументировать процесс и помочь другим, я решил опубликовать краткое объяснение о том, как настроить nginx, uWSGI и Django для совместной работы. В отличие от большинства статей, которые я нашел в Интернете, я не просто устанавливаю окончательную конфигурацию, но пытаюсь объяснить, что происходит на каждом этапе — надеюсь, это будет полезно для других.
Nginx
Я начинаю с установки nginx, так как команда разработчиков nginx предоставляет репозиторий yum и дистрибутив rpm, этот шаг довольно прост, однако сначала он требует настройки репозитория nginx yum.
Настройка репозитория nginx yum
- Загрузите rpm для настройки хранилища, это доступно по адресу: http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm (уведомление что я использую CentOS 6, проверьте URL для других O / S)
- Установите обороты
- Импортировать ключи nginx
- Необязательно, но настоятельно рекомендуется: отредактируйте /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
- Предварительные условия: поскольку я компилирую из исходного кода, вероятно, должны быть выполнены некоторые предварительные условия. У меня не было никаких проблем, но это не значит, что другие машины не будут пропускать некоторые из них. если сборка не удалась, я бы проверил наличие недостающих пакетов на основании сообщения об ошибке
- Скачать с сайта uWSGI (я использовал версию 1.0.1):
wget http://projects.unbit.it/downloads/uwsgi-1.0.1.tar.gz
- Откройте файл tar и перейдите в новую папку
tar xvzf uwsgi-1.0.1.tar.gz && cd uwsgi-1.0.1
- Настройте и запустите сборку
python setup.py build make
- Новый исполняемый файл с именем ‘uwsgi’ должен быть создан
- Чтобы проверить, что uwsgi построен правильно и может что-то делать, запустите его, используя встроенный HTTP-сервер (флаг -http), и попробуйте получить к нему доступ из браузера.
- Команда ‘uwsgi -http 127.0.0.1:8888’ запустит сервер, прослушивающий http на порту 8888.
- При обращении к серверу по этому адресу должна появиться страница с ошибкой (жалоба на невозможность найти приложение Python), но это хороший знак.
- Завершение работы сервера (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