FastCGI —フラスコのドキュメント

提供:Dev Guides
< FlaskFlask/docs/1.0.x/deploying/fastcgi
移動先:案内検索

FastCGI

FastCGIは、 nginxlighttpdチェロキーなどのサーバーでの展開オプションです。 その他のオプションについては、 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_INFOSCRIPT_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インタープリター。