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
Если вы используете дистрибутив на основе 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 вы столкнётесь с ошибками segfaulting дочерних процессов, можете их безопасно проигнорировать. Просто перезапустите сервер.
Создание файла .wsgi
Для запуска вашего приложения вам нужен файл yourapplication.wsgi. Этот файл содержит код, который mod_wsgi выполняет при запуске, чтобы получить объект приложения. Объект, названный application в этом файле, затем используется в качестве приложения.
Для большинства приложений следующий файл должен быть достаточным:
from yourapplication import app as application
Если у вас нет функции-фабрики для создания приложения, но есть экземпляр синглтона, вы можете напрямую импортировать его как application.
Сохраните этот файл в месте, где вы его сможете найти (например: /var/www/yourapplication) и убедитесь, что yourapplication и все используемые библиотеки находятся на пути поиска Python. Если вы не хотите устанавливать его по всей системе, рассмотрите использование виртуальной среды Python 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.
Устранение неполадок
Если ваше приложение не работает, следуйте этому руководству для устранения неполадок:
- Проблема: приложение не запускается, в журнале ошибок отображается 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
- Проблема: доступ к ресурсам даёт ошибки ввода-вывода
-
Вероятно, ваше приложение представляет собой единственный файл .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/0.12.x/deploying/mod_wsgi/