Настройка Flask FastCGI

У меня проблемы с развертыванием приложения Flask на сервере Apache с FastCGI (Uberspace). Мое приложение Hello World работает. Я установил переменную для представления индекса. Но шансы на переменную не обновят представление в браузере. При запуске процесса с python geoflask.fcgi отобразится обновленная версия (в терминале), но со следующими предупреждениями:

WSGIServer: missing FastCGI param REQUEST_METHOD required by WSGI!
WSGIServer: missing FastCGI param SERVER_NAME required by WSGI!
WSGIServer: missing FastCGI param SERVER_PORT required by WSGI!
WSGIServer: missing FastCGI param SERVER_PROTOCOL required by WSGI!
Status: 200 OK

Я использую virtualenv и мои файлы выглядят так:

мой fcgi-bin/geoflask.fcgi:

#!/home/usr/.virtualenvs/flaskenv/bin/python2.7

RELATIVE_WEB_URL_PATH = '/geoflask'
import os
LOCAL_APPLICATION_PATH = os.path.expanduser('~') + '/html/geoflask'

import sys
sys.path.insert(0, LOCAL_APPLICATION_PATH)

from flup.server.fcgi import WSGIServer
from app import app


class ScriptNamePatch(object):
    def __init__(self, app):
        self.app = app

    def __call__(self, environ, start_response):
        environ['SCRIPT_NAME'] = RELATIVE_WEB_URL_PATH
        return self.app(environ, start_response)

app = ScriptNamePatch(app)

if __name__ == '__main__':
    WSGIServer(app).run()

мои.htacces:

<IfModule mod_fcgid.c>
   AddHandler fcgid-script .fcgi
   <Files ~ (\.fcgi)>
       SetHandler fcgid-script
       Options +FollowSymLinks +ExecCGI
   </Files>
</IfModule>

<IfModule mod_rewrite.c>
   Options +FollowSymlinks
   RewriteEngine On
   RewriteBase /
   RewriteCond %{REQUEST_FILENAME} !-f
   RewriteRule ^(.*)$ /fcgi-bin/geoflask.fcgi/$1 [QSA,L]
</IfModule>

Любые намеки или предложения? Я борюсь с этим целый день...

1 ответ

Apache не перезагружает процесс сервера FastCGI немедленно. Глядя на документы для mod_fastcgi, кажется, что mod_fastcgi поддерживает перезагрузку только после периода простоя, после определенного количества запросов или после определенного периода времени. Вот почему ваше приложение не обновляется, даже если оно запускается из командной строки.

Чтобы получить желаемое поведение (перезагрузка при каждом изменении), кажется, вам нужно установить либо FcgidMaxRequestsPerProcess или же FcgidCmdOptions MaxRequestsPerProcess до 1 (по сути, превращая вашу настройку FastCGI в настройку CGI). Это будет перезагружать приложение при каждом запросе, поэтому его не следует использовать для производства, но это облегчит разработку.

Другие вопросы по тегам