FastCGI
FastCGIは、 nginx 、 lighttpd 、チェロキーなどのサーバーでの展開オプションです。 その他のオプションについては、 uWSGI およびスタンドアロンWSGIコンテナーを参照してください。 WSGIアプリケーションをそれらのいずれかで使用するには、最初にFastCGIサーバーが必要になります。 最も人気のあるものは、このガイドで使用する flup です。 従うためにそれがインストールされていることを確認してください。
気を付けて
アプリケーションファイルで発生する可能性のあるapp.run()
呼び出しが、if __name__ == '__main__':
ブロック内にあるか、別のファイルに移動されていることを事前に確認してください。 呼び出されていないことを確認してください。これにより、アプリケーションをFastCGIにデプロイした場合に、不要なローカルWSGIサーバーが常に開始されます。
.fcgi ファイルの作成
まず、FastCGIサーバーファイルを作成する必要があります。 それを yourapplication.fcgi と呼びましょう:
#!/usr/bin/python
from flup.server.fcgi import WSGIServer
from yourapplication import app
if __name__ == '__main__':
WSGIServer(app).run()
Apacheが機能するにはこれで十分ですが、nginxおよび古いバージョンのlighttpdでは、FastCGIサーバーと通信するためにソケットを明示的に渡す必要があります。 これを機能させるには、ソケットへのパスをWSGIServer
に渡す必要があります。
WSGIServer(application, bindAddress='/path/to/fcgi.sock').run()
パスは、サーバー構成で定義したものとまったく同じパスである必要があります。
yourapplication.fcgi
ファイルをもう一度見つけられる場所に保存します。 /var/www/yourapplication
などにそれを含めるのは理にかなっています。
サーバーが実行できるように、そのファイルに実行可能ビットを設定してください。
# chmod +x /var/www/yourapplication/yourapplication.fcgi
Apacheの構成
上記の例は、基本的なApacheデプロイメントには十分ですが、 .fcgi ファイルがアプリケーションのURLに表示されます。 example.com/yourapplication.fcgi/news/
。 yourapplication.fcgiがURLに表示されないようにアプリケーションを構成する方法はいくつかあります。 推奨される方法は、ScriptAliasおよびSetHandler構成ディレクティブを使用して、要求をFastCGIサーバーにルーティングすることです。 次の例では、FastCgiServerを使用して、すべての着信要求を処理するアプリケーションの5つのインスタンスを起動します。
LoadModule fastcgi_module /usr/lib64/httpd/modules/mod_fastcgi.so
FastCgiServer /var/www/html/yourapplication/app.fcgi -idle-timeout 300 -processes 5
<VirtualHost *>
ServerName webapp1.mydomain.com
DocumentRoot /var/www/html/yourapplication
AddHandler fastcgi-script fcgi
ScriptAlias / /var/www/html/yourapplication/app.fcgi/
<Location />
SetHandler fastcgi-script
</Location>
</VirtualHost>
これらのプロセスはApacheによって管理されます。 スタンドアロンのFastCGIサーバーを使用している場合は、代わりにFastCgiExternalServerディレクティブを使用できます。 以下では、パスは実際のものではなく、AliasMatchなどの他のディレクティブの識別子として使用されているだけであることに注意してください。
FastCgiServer /var/www/html/yourapplication -host 127.0.0.1:3000
共有WebホストなどでScriptAliasを設定できない場合は、WSGIミドルウェアを使用してURLからapplication.fcgiを削除できます。 .htaccessを設定します。
<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 ^(.*)$ yourapplication.fcgi/$1 [QSA,L]
</IfModule>
yourapplication.fcgiを設定します。
#!/usr/bin/python
#: optional path to your local python site-packages folder
import sys
sys.path.insert(0, '<your_local_path>/lib/python<your_python_version>/site-packages')
from flup.server.fcgi import WSGIServer
from yourapplication import app
class ScriptNameStripper(object):
def __init__(self, app):
self.app = app
def __call__(self, environ, start_response):
environ['SCRIPT_NAME'] = ''
return self.app(environ, start_response)
app = ScriptNameStripper(app)
if __name__ == '__main__':
WSGIServer(app).run()
lighttpdの設定
lighttpdの基本的なFastCGI構成は次のようになります。
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、エイリアス、および書き換えモジュールを有効にすることを忘れないでください。 この構成は、アプリケーションを/yourapplication
にバインドします。 アプリケーションをURLルートで動作させたい場合は、LighttpdCGIRootFix
ミドルウェアでlighttpdのバグを回避する必要があります。
アプリケーションをURLルートでマウントする場合にのみ適用してください。 また、 FastCGIおよびPython の詳細については、Lightyのドキュメントを参照してください(run()にソケットを明示的に渡す必要がなくなったことに注意してください)。
nginxの構成
デフォルトではFastCGIパラメータが転送されないため、nginxへのFastCGIアプリケーションのインストールは少し異なります。
nginxの基本的なFlaskFastCGI構成は次のようになります。
location = /yourapplication { rewrite ^ /yourapplication/ last; }
location /yourapplication { try_files $uri @yourapplication; }
location @yourapplication {
include fastcgi_params;
fastcgi_split_path_info ^(/yourapplication)(.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_pass unix:/tmp/yourapplication-fcgi.sock;
}
この構成は、アプリケーションを/yourapplication
にバインドします。 PATH_INFO
とSCRIPT_NAME
の計算方法を理解する必要がないため、URLルートに含める場合は少し簡単です。
location / { try_files $uri @yourapplication; }
location @yourapplication {
include fastcgi_params;
fastcgi_param PATH_INFO $fastcgi_script_name;
fastcgi_param SCRIPT_NAME "";
fastcgi_pass unix:/tmp/yourapplication-fcgi.sock;
}
FastCGIプロセスの実行
nginxなどはFastCGIアプリをロードしないため、自分でロードする必要があります。 スーパーバイザーはFastCGIプロセスを管理できます。他のFastCGIプロセスマネージャーを探したり、起動時に .fcgi ファイルを実行するスクリプトを記述したりできます。 SysV init.d
スクリプトを使用します。 一時的な解決策として、GNU画面内でいつでも.fcgi
スクリプトを実行できます。 詳細については、man screen
を参照してください。これは手動の解決策であり、システムを再起動しても持続しないことに注意してください。
$ screen
$ /var/www/yourapplication/yourapplication.fcgi
デバッグ
FastCGIデプロイメントは、ほとんどのWebサーバーでデバッグするのが難しい傾向があります。 多くの場合、サーバーログからわかるのは、「ヘッダーの終わりが早すぎる」という行に沿ったものだけです。 アプリケーションをデバッグするために、アプリケーションが壊れた理由を実際に理解できる唯一のことは、正しいユーザーに切り替えて、アプリケーションを手動で実行することです。
この例では、アプリケーションの名前が application.fcgi であり、Webサーバーのユーザーが www-data であると想定しています。
$ su www-data
$ cd /var/www/yourapplication
$ python application.fcgi
Traceback (most recent call last):
File "yourapplication.fcgi", line 4, in <module>
ImportError: No module named yourapplication
この場合、エラーは「yourapplication」がPythonパス上にないことのようです。 一般的な問題は次のとおりです。
- 使用されている相対パス。 現在の作業ディレクトリに依存しないでください。
- Webサーバーによって設定されていない環境変数に依存するコード。
- 使用されているさまざまなPythonインタープリター。