.. _mod_wsgi-deployment:
Настройка mod_wsgi (Apache) для Flask
=====================================
Если у вас веб-сервер `Apache`_, рекомендуется использовать `mod_wsgi`_.
.. admonition:: Предварительная проверка
Удостоверьтесь, что все вызовы ``app.run()`` в файле приложения
находятся внутри блока ``if __name__ == '__main__':`` или вынесены в
отдельный файл. Просто убедитесь в отсутствии подобных вызовов,
потому что если вы решили воспользоваться mod_wsgi для запуска
приложения, то запускать локальный сервер WSGI не нужно.
.. _Apache: http://httpd.apache.org/
Установка `mod_wsgi`
--------------------
Если `mod_wsgi` ещё не установлен, его можно установить с помощью менеджера
пакетов или собрать самостоятельно. В `инструкции по установке`_ mod_wsgi
описывается установка из исходных текстов в UNIX-системах.
Если вы используете Ubuntu/Debian, можно воспользоваться apt-get:
.. sourcecode:: text
# apt-get install libapache2-mod-wsgi
На FreeBSD `mod_wsgi` можно установить сборкой из порта `www/mod_wsgi` или
при помощи pkg_add:
.. sourcecode:: text
# pkg_add -r mod_wsgi
Если используется pkgsrc, можно установить `mod_wsgi`, собрав из пакета
`www/ap2-wsgi`.
Если случится ошибка сегментации дочернего процесса после первой
перезагрузки apache, можно спокойно проигнорировать её. Просто
перезапустите сервер.
Создание файла `.wsgi`
----------------------
Для запуска приложения нужен файл `yourapplication.wsgi`. Этот файл
содержит код, выполняемый `mod_wsgi` для получения объекта приложения
Объект с именем `application` в этом файле будет использоваться в качестве
приложения.
Для большинства приложений будет достаточно такого файла::
from yourapplication import app as application
Если у вас нет фабричной функции для создания приложений, но есть
экземпляр-одиночка, можно просто импортировать его как `application`.
Сохраните этот файл где-нибудь, где сможете его найти (например, в
`/var/www/yourapplication`) и удостоверьтесь, что `yourapplication` и все
используемые им библиотеки находятся в списке путей загрузки python. Если
вы не хотите делать его общедоступным для всей системы, воспользуйтесь
`виртуальным экземпляром python`_. Помните, что при этом вам нужно будет
установить ваше приложение внутрь virtualenv. Или можно отредактировать
переменную path внутри `.wsgi` перед импортом::
import sys
sys.path.insert(0, '/path/to/the/application')
Настройка Apache
----------------
Наконец, нужно создать файл с настройками Apache для запуска приложения.
В следующем примере мы говорим `mod_wsgi` выполнить приложение от имени
отдельного пользователя в целях безопасности:
.. sourcecode:: apache
ServerName example.com
WSGIDaemonProcess yourapplication user=user1 group=group1 threads=5
WSGIScriptAlias / /var/www/yourapplication/yourapplication.wsgi
WSGIProcessGroup yourapplication
WSGIApplicationGroup %{GLOBAL}
Order deny,allow
Allow from all
Замечание: WSGIDaemonProcess не реализован в Windows и Apache не запустится
с указанной выше конфигурацией. В системе Windows эти строки нужно удалить:
.. sourcecode:: apache
ServerName example.com
WSGIScriptAlias / C:\yourdir\yourapp.wsgi
Order deny,allow
Allow from all
За более подробной информацией обратитесь к странице `mod_wsgi wiki`_.
.. _mod_wsgi: http://code.google.com/p/modwsgi/
.. _инструкции по установке: http://code.google.com/p/modwsgi/wiki/QuickInstallationGuide
.. _виртуальным экземпляром python: http://pypi.python.org/pypi/virtualenv
.. _mod_wsgi wiki: http://code.google.com/p/modwsgi/wiki/
Решение проблем
---------------
Если приложение не запускается, попробуйте следующие решения:
**Проблема:** приложение не запускается, в журнале ошибок появляется
сообщение SystemExit ignored
Произошёл вызов ``app.run()`` в файле вашего приложения, в котором не
было предохранительного условия ``if __name__ == '__main__':``. Либо
удалите из файла этот вызов :meth:`~flask.Flask.run`, либо поместите
его в отдельный файл `run.py`, либо поместите его в подобный блок if.
**Проблема:** приложение сообщает об ошибках доступа
Возможно это вызвано тем, что ваше приложение работает от неправильного
пользователя. Проверьте, что каталоги, к которым необходим доступ из
приложения, имеют правильные разрешения, а приложение запущено от
правильного пользователя (параметры ``user`` и ``group`` в директиве
`WSGIDaemonProcess`).
**Проблема:** приложение завершается с выводом сообщения об ошибке
Помните, что mod_wsgi запрещает делать что-либо с :data:`sys.stdout` и
:data:`sys.stderr`. Можно выключить эту защиту, прописав в
конфигурации следующую настройку:
.. sourcecode:: apache
WSGIRestrictStdout Off
Или можно заменить стандартный вывод в файле .wsgi на другой поток:
import sys
sys.stdout = sys.stderr
**Проблема:** доступ к ресурсам приводит к ошибкам ввода-вывода
Возможно ваше приложение является символической ссылкой на один из
файлов .py, находящихся в каталоге пакетов сайта. Такой приём не
работает, поэтому удостоверьтесь, что поместили каталог в пути поиска
python или преобразуйте ваше приложение в пакет.
Причина заключается в том, что имя файла модуля используется для
поиска ресурсов, а в случае символической ссылки будет использоваться
неправильное имя файла.
Поддержка автоматической перезагрузки
-------------------------------------
Чтобы облегчить работу инструментов установки, можно включить поддержку
автоматической перезагрузки. Когда файл `.wsgi` изменится, `mod_wsgi`
перезагрузит для нас все процессы демона.
Для этого просто добавьте следующие директивы в раздел `Directory`:
.. sourcecode:: apache
WSGIScriptReloading On
Работа с виртуальными окружениями
---------------------------------
Польза от виртуальных окружений заключается в том, что они позволяют не
устанавливать необходимые зависимости на уровне всей системы, что
позволяет достичь большего контроля над используемыми пакетами. Если вы
решили воспользоваться виртуальным окружением совместно с mod_wsgi, нужно
слегка изменить файл `.wsgi`.
Добавьте следующие строки в начало файла `.wsgi`::
activate_this = '/path/to/env/bin/activate_this.py'
execfile(activate_this, dict(__file__=activate_this))
Эти строки настроят пути загрузки в соответствии с настройками
виртуального окружения. Помните, что это должен быть абсолютный путь.
`Оригинал этой страницы `_