仕事では、時々簡単な内部ウェブアプリ用にcgi-binディレクトリを使ってる。シンプルに保てば、使い勝手はすごくいいよ。cgiだからって、http/1.0を標準出力に手動で出力する必要はないし。例えば、Pythonの組み込みのwsgiref.handlers.CGIHandlerを使えば、どんなwsgiアプリもcgiスクリプトとして実行できる:
import wsgiref.handlers
import flask
app = flask.Flask(__name__)
wsgiref.handlers.CGIHandler().run(app)
スクリプトの実行はuwsgiとそのcgiプラグインでやってる。mod_cgiのためだけにApacheやlighttpdを動かすより、シンプルで柔軟だと思う。uwsgiはsystemdユニットとして動くから、systemdのハードニングやサンドボックス機能も使えるのが便利。mod_cgiにはない、特定のファイルタイプのインタープリターを設定する機能もある:
cgi = /cgi-bin=/webapps/cgi-bin/src
cgi-allowed-ext = .py
cgi-helper = .py=/webapps/cgi-bin/venv/bin/python3
依存関係はここに全部入る。最初のバイトまでの時間は250-350msで、私たちのユースケースには許容範囲だね。