Spec-Zone.ru › Flask 1.1

mod_wsgi (Apache)

Если вы используете веб-сервер Apache, рассмотрите использование mod_wsgi.

Обратите внимание

Пожалуйста, убедитесь, что все вызовы app.run() в вашем файле приложения находятся внутри блока if __name__ == '__main__': или перемещены в отдельный файл. Убедитесь, что они не вызываются, так как это всегда запускает локальный сервер WSGI, чего мы не хотим, если развертываем приложение на mod_wsgi.

Установка mod_wsgi

Если у вас ещё нет mod_wsgi, вам необходимо либо установить его через менеджер пакетов, либо скомпилировать самостоятельно. Инструкции по установке mod_wsgi покрывают установку из исходного кода на системах UNIX.

Если вы используете Ubuntu/Debian, вы можете установить его с помощью apt-get и активировать следующим образом:

$ apt-get install libapache2-mod-wsgi-py3

Если вы используете дистрибутив на базе yum (Fedora, OpenSUSE и т.д.), вы можете установить его следующим образом:

$ yum install mod_wsgi

В FreeBSD установите mod_wsgi, скомпилировав порт www/mod_wsgi или используя pkg_add:

$ pkg install ap24-py37-mod_wsgi

Если вы используете pkgsrc, вы можете установить mod_wsgi, скомпилировав пакет www/ap2-wsgi.

Если после первой перезагрузки Apache вы столкнётесь с ошибками segfaulting дочерних процессов, можете их безопасно игнорировать. Просто перезапустите сервер.

Создание файла .wsgi

Для запуска вашего приложения вам нужен файл yourapplication.wsgi. Этот файл содержит код, который mod_wsgi выполняет при запуске, чтобы получить объект приложения. Объект, называемый application в этом файле, затем используется в качестве приложения.

Для большинства приложений достаточен следующий файл:

from yourapplication import app as application

Если в файле __init__.py используется функция-фабрика, то функция должна быть импортирована:

from yourapplication import create_app
application = create_app()

Если у вас нет функции-фабрики для создания приложения, но есть одиночный экземпляр, вы можете напрямую импортировать его как application.

Сохраните этот файл в удобном для вас месте (например: /var/www/yourapplication) и убедитесь, что yourapplication и все используемые библиотеки находятся на пути поиска Python. Если вы не хотите устанавливать их на весь компьютер, рассмотрите использование виртуальной среды Python virtualenv. Имейте в виду, что вам также необходимо установить ваше приложение внутри виртуальной среды. В качестве альтернативы, вы можете просто изменить путь в файле .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.

Устранение неполадок

Если ваше приложение не работает, воспользуйтесь этим руководством для устранения неполадок:

Проблема: приложение не запускается, в журнале ошибок указана ошибка SystemExit ignored

В вашем файле приложения есть вызов app.run(), который не защищен условием if __name__ == '__main__':. Либо удалите вызов run() из файла и перенесите его в отдельный файл run.py, либо поместите его в такой блок if.

Проблема: приложение выдаёт ошибки доступа

Вероятно, вызвано тем, что ваше приложение запускается не от нужного пользователя. Убедитесь, что у папок, к которым приложение должно получить доступ, установлены соответствующие права доступа, и приложение запускается от правильного пользователя (параметр user и group директивы WSGIDaemonProcess)

Проблема: приложение завершается с ошибкой при печати

Помните, что mod_wsgi запрещает любые операции с sys.stdout и sys.stderr. Вы можете отключить эту защиту из конфигурации, установив WSGIRestrictStdout на off.

WSGIRestrictStdout Off

В качестве альтернативы, вы также можете заменить стандартный вывод в файле .wsgi другим потоком:

import sys
sys.stdout = sys.stderr
Проблема: доступ к ресурсам даёт ошибки IO

Вероятно, ваше приложение — это единственный файл .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))

Это устанавливает пути поиска в соответствии с настройками виртуальной среды. Имейте в виду, что путь должен быть абсолютным.

© 2007–2020 Pallets
Licensed under the BSD 3-clause License.
https://flask.palletsprojects.com/en/1.1.x/deploying/mod_wsgi/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API