- en
- Language: ru
- Documentation version: 1.1.x
mod_wsgi (Apache)¶
Если вы используете веб-сервер Apache, подумайте об использовании mod_wsgi.
Осторожно
Пожалуйста, убедитесь заранее, что все вызовы app.run()
, которые могут быть в вашем файле приложения, находятся внутри блока if __name__ == '__main__':
или перенесены в отдельный файл. Просто убедитесь, что это не вызывается, потому что это всегда будет запускать локальный сервер WSGI, чего мы не хотим, если мы развернем это приложение на mod_wsgi.
Установка mod_wsgi¶
Если у вас нет mod_wsgi installed yet you have to either install it using a package manager or compile it yourself. The mod_wsgi installation instructions, покройте установку исходников на UNIX-системах.
Если вы используете Ubuntu/Debian, вы можете apt-get и активировать его следующим образом:
$ apt-get install libapache2-mod-wsgi
Если вы используете дистрибутив на основе yum (Fedora, OpenSUSE и т.д.), вы можете установить его следующим образом:
$ yum install mod_wsgi
На FreeBSD установите mod_wsgi, скомпилировав порт www/mod_wsgi или используя pkg_add:
$ pkg install ap22-mod_wsgi2
Если вы используете pkgsrc, вы можете установить mod_wsgi, скомпилировав пакет www/ap2-wsgi.
Если после первой перезагрузки apache вы столкнулись с ошибками в дочерних процессах, вы можете смело игнорировать их. Просто перезапустите сервер.
Создание файла .wsgi¶
Для запуска вашего приложения вам необходим файл yourapplication.wsgi
. Этот файл содержит код, который mod_wsgi выполняет при запуске для получения объекта приложения. Объект под названием application в этом файле затем используется в качестве приложения.
Для большинства приложений будет достаточно следующего файла:
from yourapplication import app as application
Если фабричная функция используется в файле __init__.py
, то функция должна быть импортирована:
from yourapplication import create_app
application = create_app()
Если у вас нет фабричной функции для создания приложения, а есть экземпляр singleton, вы можете напрямую импортировать его как application.
Сохраните этот файл в таком месте, где вы сможете найти его снова (например: /var/www/yourapplication
) и убедитесь, что экземпляр yourapplication and all the libraries that are in use are on the python load path. If you don’t want to install it system wide consider using a virtual python. Имейте в виду, что вам также придется установить ваше приложение в виртуальную среду. В качестве альтернативы есть возможность просто изменить путь в файле .wsgi
перед импортом:
import sys
sys.path.insert(0, '/path/to/the/application')
Конфигурирование Apache¶
Последнее, что вам нужно сделать, это создать конфигурационный файл Apache для вашего приложения. В этом примере мы указываем mod_wsgi выполнять приложение под другим пользователем в целях безопасности:
<VirtualHost *>
ServerName example.com
WSGIDaemonProcess yourapplication user=user1 group=group1 threads=5
WSGIScriptAlias / /var/www/yourapplication/yourapplication.wsgi
<Directory /var/www/yourapplication>
WSGIProcessGroup yourapplication
WSGIApplicationGroup %{GLOBAL}
Order deny,allow
Allow from all
</Directory>
</VirtualHost>
Примечание: WSGIDaemonProcess не реализован в Windows, и Apache откажется запускаться с приведенной выше конфигурацией. В системе Windows исключите эти строки:
<VirtualHost *>
ServerName example.com
WSGIScriptAlias / C:\yourdir\yourapp.wsgi
<Directory C:\yourdir>
Order deny,allow
Allow from all
</Directory>
</VirtualHost>
Примечание: В конфигурацию контроля доступа для Apache 2.4 были внесены некоторые изменения.
Наиболее заметным является то, что синтаксис разрешений для каталогов изменился по сравнению с httpd 2.2
Order allow,deny
Allow from all
к синтаксису httpd 2.4
Require all granted
Для получения дополнительной информации обратитесь к mod_wsgi documentation.
Устранение неполадок¶
Если ваше приложение не запускается, следуйте этому руководству для устранения неполадок:
- Проблема: приложение не запускается, журнал ошибок показывает, что SystemExit игнорируется
В файле приложения есть вызов
app.run()
, который не защищен условиемif __name__ == '__main__':
. Либо удалите этот вызовrun()
из файла и перенесите его в отдельный файлrun.py
, либо поместите его в такой блок if.- Проблема: приложение выдает ошибки разрешения
Возможно, причина в том, что ваше приложение запущено от имени неправильного пользователя. Убедитесь, что папки, к которым приложение имеет доступ, имеют соответствующие привилегии, и приложение запускается от имени правильного пользователя (
user
иgroup
параметр директивы WSGIDaemonProcess).- Проблема: приложение умирает с ошибкой при печати
Помните, что mod_wsgi запрещает делать что-либо с
sys.stdout
иsys.stderr
. Вы можете отключить эту защиту из конфигурации, установив WSGIRestrictStdout в значениеoff
:WSGIRestrictStdout Off
Также вы можете заменить стандартный out в файле .wsgi на другой поток:
import sys sys.stdout = sys.stderr
- Проблема: при доступе к ресурсам возникают ошибки ввода-вывода
Ваше приложение, вероятно, представляет собой один файл .py, который вы поместили в папку site-packages. Обратите внимание, что это не работает, вместо этого вам нужно либо поместить папку в pythonpath, в котором хранится файл, либо преобразовать ваше приложение в пакет.
Причина этого в том, что для неустановленных пакетов имя файла модуля используется для поиска ресурсов, а для симлинков подбирается неверное имя файла.
Поддержка автоматической перезарядки¶
Чтобы помочь инструментам развертывания, вы можете активировать поддержку автоматической перезагрузки. Всякий раз, когда что-то изменяет файл .wsgi
, mod_wsgi будет перезагружать все процессы демона за нас.
Для этого просто добавьте следующую директиву в раздел Directory:
WSGIScriptReloading On
Работа с виртуальными средами¶
Преимущество виртуальных сред в том, что они никогда не устанавливают необходимые зависимости по всей системе, поэтому вы можете лучше контролировать, что и где используется. Если вы хотите использовать виртуальное окружение с mod_wsgi, вы должны немного изменить ваш файл .wsgi
.
Добавьте следующие строки в начало вашего файла .wsgi
:
activate_this = '/path/to/env/bin/activate_this.py'
execfile(activate_this, dict(__file__=activate_this))
Для Python 3 добавьте следующие строки в начало вашего файла .wsgi
:
activate_this = '/path/to/env/bin/activate_this.py'
with open(activate_this) as file_:
exec(file_.read(), dict(__file__=activate_this))
Это устанавливает пути загрузки в соответствии с настройками виртуальной среды. Помните, что путь должен быть абсолютным.