CGIとFastCGIでPythonフレームワーク(FastAPI, Flask)を実行する方法
はじめに
本記事では、CGI(Common Gateway Interface)とFastCGI(Fast Common Gateway Interface)を使用してPythonフレームワーク(FastAPIやFlask)を実行する方法について解説します。CGIやFastCGIはWebサーバーと外部プログラムとの間で情報をやり取りするための仕組みであり、Pythonフレームワークをこれらのインターフェースを介して実行することで、Webアプリケーションを動作させることができます。
想定読者
スケールを想定しない個人開発などの小規模な開発の簡易的なデプロイ先としてレンタルサーバー(XSERVER)を活用しようと考えている方向けです。
また、本記事はlinuxbrewなどでPythonの実行環境は構築済みの前提で必要最低限の設定のみを記載します。
各種設定
ディレクトリ構成
.
├── .htaccess
├── main.py
└── index.cgi or index.fcgi
共通設定
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} !on
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /subdomain/index.cgi/$1 [L]
</IfModule>
CGI、FastCGIを実行するためにファイルのパーミッションを変更する必要があります。
chmod 700 index.cgi
動作環境別設定
Flask + CGI
#!../../../.linuxbrew/bin/python3.9
from wsgiref.handlers import CGIHandler
from main import app
if __name__ == '__main__':
CGIHandler().run(app)
FastAPI + CGI
pip install a2wsgi
#!../../../.linuxbrew/bin/python3.9
import os
import a2wsgi
import wsgiref.handlers
from main import app
if __name__ == '__main__':
os.environ.setdefault("PATH_INFO", "")
wsgi_app = a2wsgi.ASGIMiddleware(app)
wsgiref.handlers.CGIHandler().run(wsgi_app)
Flask + FastCGI
pip install flup
#!../../../.linuxbrew/bin/python3.9
from flup.server.fcgi import WSGIServer
from main import app
if __name__ == '__main__':
WSGIServer(app).run()
FastAPI + FastCGI
pip install a2wsgi flup
#!../../../.linuxbrew/bin/python3.9
import os
import a2wsgi
from flup.server.fcgi import WSGIServer
from main import app
if __name__ == '__main__':
os.environ.setdefault("PATH_INFO", "")
wsgi_app = a2wsgi.ASGIMiddleware(app)
WSGIServer(wsgi_app).run()
まとめ
Pythonフレームワークの全ての機能を実行できるわけではないと思いますが、CGIやFastCGIを使用してPythonフレームワークを実行することで、レンタルサーバー(XSERVER)などの環境でもWebアプリケーションを効率的に動作させることができます。
また、CGIやFastCGIで実行するために必要な設定も多くないため、Pythonのソースコードにほぼ変更を加えることなくデプロイ先を変更できることもメリットだと感じました。
さいごに
この記事では、CGIとFastCGIを使用してPythonフレームワークを実行する方法について解説しました。Webアプリケーションの開発や運用において、最新の技術を積極的に取り入れることも大切ですが、個人開発となると維持費も考慮にいれる必要があるため、スケール変更が必要なサービスか判断した上で適切な実行環境を選択することが重要だと考えています。CGIやFastCGIを適切に利用することで、レンタルサーバーなどの余剰リソースを活用しつつ、Pythonフレームワークを効率的に動作させることができるため、ぜひ活用してみてください!
参考サイト
Discussion