FastCGI
Очень популярная настройка развертывания на серверах, таких как lighttpd и nginx, — FastCGI. Чтобы использовать ваше приложение WSGI с любым из них, вам сначала понадобится сервер FastCGI.
Самый популярный из них — flup, который мы будем использовать в этом руководстве. Убедитесь, что он установлен.
Создание файла .fcgi
Сначала вам нужно создать файл сервера FastCGI. Назовем его yourapplication.fcgi:
#!/usr/bin/python
from flup.server.fcgi import WSGIServer
from yourapplication import make_app
if __name__ == '__main__':
application = make_app()
WSGIServer(application).run()
Этого достаточно для работы Apache, однако ngingx и более старые версии lighttpd нуждаются в явном указании сокета для связи с сервером FastCGI. Для этого вам необходимо передать путь к сокету в WSGIServer:
WSGIServer(application, bindAddress='/path/to/fcgi.sock').run()
Путь должен быть точно таким же, как вы определяете в конфигурации сервера.
Сохраните файл yourapplication.fcgi в месте, где вы сможете его снова найти. Логично хранить его в /var/www/yourapplication или чем-то подобном.
Убедитесь, что для этого файла установлен исполняемый бит, чтобы серверы могли его выполнить:
# chmod +x /var/www/yourapplication/yourapplication.fcgi
Настройка lighttpd
Базовая конфигурация FastCGI для lighttpd выглядит следующим образом:
fastcgi.server = ("/yourapplication.fcgi" =>
((
"socket" => "/tmp/yourapplication-fcgi.sock",
"bin-path" => "/var/www/yourapplication/yourapplication.fcgi",
"check-local" => "disable",
"max-procs" -> 1
))
)
alias.url = (
"/static/" => "/path/to/your/static"
)
url.rewrite-once = (
"^(/static.*)$" => "$1",
"^(/.*)$" => "/yourapplication.fcgi$1"
Не забудьте включить модули FastCGI, alias и rewrite. Эта конфигурация привязывает приложение к /yourapplication.
Дополнительную информацию о FastCGI и Python см. в документации Lighttpd: FastCGI и Python.
Настройка nginx
Установка приложений FastCGI на nginx немного сложнее, потому что по умолчанию некоторые параметры FastCGI не передаются должным образом.
Базовая конфигурация FastCGI для nginx выглядит следующим образом:
location /yourapplication/ {
include fastcgi_params;
if ($uri ~ ^/yourapplication/(.*)?) {
set $path_url $1;
}
fastcgi_param PATH_INFO $path_url;
fastcgi_param SCRIPT_NAME /yourapplication;
fastcgi_pass unix:/tmp/yourapplication-fcgi.sock;
}
Эта конфигурация привязывает приложение к /yourapplication. Если вы хотите расположить его в корне URL, это немного проще, поскольку вам не нужно определять, как вычислить PATH_INFO и SCRIPT_NAME:
location /yourapplication/ {
include fastcgi_params;
fastcgi_param PATH_INFO $fastcgi_script_name;
fastcgi_param SCRIPT_NAME "";
fastcgi_pass unix:/tmp/yourapplication-fcgi.sock;
}
Поскольку Nginx не загружает приложения FastCGI, вы должны сделать это самостоятельно. Вы можете написать скрипт init.d для этого или выполнить его в сеансе screen:
$ screen $ /var/www/yourapplication/yourapplication.fcgi
Отладка
Развертывание FastCGI на большинстве веб-серверов часто затруднено при отладке. Очень часто единственное, что сообщает вам журналы сервера, — это что-то вроде «преждевременное завершение заголовков». Чтобы отладить приложение, единственное, что действительно может дать вам идеи о причинах его сбоя, — это переключиться на правильного пользователя и запустить приложение вручную.
Этот пример предполагает, что ваше приложение называется application.fcgi, а пользователь вашего веб-сервера — www-data:
$ su www-data $ cd /var/www/yourapplication $ python application.fcgi Traceback (most recent call last): File "yourapplication.fcg", line 4, in <module> ImportError: No module named yourapplication
В данном случае ошибка, похоже, заключается в том, что «yourapplication» не находится на пути Python. Распространённые проблемы:
- использование относительных путей. Не полагайтесь на текущую рабочую директорию
- зависимость кода от переменных среды, которые не заданы веб-сервером.
- использование разных интерпретаторов Python.
© 2007–2020 Pallets
Licensed under the BSD 3-clause License.
https://werkzeug.palletsprojects.com/en/0.16.x/deployment/fastcgi/