現在本サイトは単純にWordpressで動かしてますが、特定パス以下のページをflaskアプリに変更する予定があるので、少し試してみました。以下、忘れないうちにメモしておきます。

WEB接続経路

nginx reverse proxy server<ーーー別のホストサーバ https 認証局
|
apache2 <ーー80ポート
|
gunicorn<ーー80以外のポート:ここでは8088としておく。

とします。nginxから直接gunicornにいかないのはapache2で基本的なサイト設定(ドメイン管理)を終わらせたいからです。自分的には保守が楽なので。

apache2設定

virtual hostで動作しているものとします。https処理は上記nginxにまかせているので、nginxとは内部の80ポートでおしゃべりしているだけです。

ProxyRequests Off

ProxyPass /- http://127.0.0.1:8088/-
ProxyPassReverse /- http://127.0.0.1:8088/-

ProxyPass /static http://127.0.0.1:8088/static
ProxyPassReverse /static http://127.0.0.1:8088/static

/-はたまたま/-なだけで、flask側のルートパスを指定します。またstaticを指定しておかないとflaskのstaticファイルが読み込まれないので必須です。

gunicornのサービス化

gunicornのデーモン稼働は/etc/systemd/system/gunicorn.service設定だけでOKです。

[Unit]
Description=Gunicorn Service
After=network.target

[Service]
User=apache2と同じユーザが使いやすい
Group=apache2と同じグループが使いやすい
WorkingDirectory=ここはflaskのapp.pyのディレクトリを指定します
ExecStart=gunicorn実行ファイルパスに、-cオプションでgunicornのconfigファイルを指定したものを記載します
例えば、
/foo/bar/.local/bin/gunicorn -c /foo/bar/flask/gunicorn_config.py
という感じです。

Restart=always
RestartSec=3

[Install]
WantedBy=multi-user.target

プロセスが停止されたときに、リスタートさせるために
Restart=always
としていますが(デフォルトはno)、さすがにそれは、と思ったらそれは外し、かわりに
RemainAfterExit=yes
を入れるといいのかな。

なお、gunicornの公式によれば、socket接続起動のためのgunicorn.socketファイルを作ってそこから起動するように記述がありますが、TCP/IPソケットでサービス起動しても問題なさげなので、今回ドメインソケットは使いません(厳密なセキュリティとか速度とかにこだわらなければ)。

あとは自動起動できるように

systemctl enable gunicorn.service

としておきます。

手順前後となりますが、上記サービスが実働するためにはgunicorn configとflaskの設定をしておかなければなりません。

gunicorn のconfig設定

上記gunicorn.serviceの例ですと /foo/bar/flask/gunicorn_config.py にありますので、以下そのファイルのことです。

# Server Mechanics
#========================================
# current directory
chdir = 'ここにはflaskの実行ファイルapp.pyパスを書く'

# daemon mode
#daemon = False

# Server Socket
#========================================
bind = '127.0.0.1:8088'<ーードメインソケットからTCP/IPソケットに変更したので。うまく動かないようなら0.0.0.0:8088で動作させて、いろいろチェックすること

# Worker Processes
#========================================
workers = 8
threads = 8

#  Logging
#========================================
# access log
accesslog = 'flaskのログ保存パス/access.log'
access_log_format = '%({X-B-Cache}o)s %({X-Forwarded-For}i)s %(h)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s" "%(Referer)s" "%(User-Agent)s" %(X-Real-Ip)s'
nginx・apache2経由でアクセスしてきているので、ちょっとログフォーマットは複雑です。
X-B-Cache、X-Forwarded-For、X-Real-Ipを指定していますが、当方のnginx・apache側の変数設定に依存するので普遍性はなく、ここではその意味は省略します。

# gunicorn log
errorlog = 'flaskのログ保存パス/error.log'
loglevel = 'error'

flask側設定

上記gunicorn.serviceの例ですとflaskパスはgunicorn_config.pyと同じ/foo/bar/flask/パスに置くことを想定していますので、ここでは/foo/bar/flask/app.pyのことを指します。flask自体の環境設定については当記事では書きません。各種言語について昔から良質な情報を提供続けてくれている「とほほ」さんの「とほほのFlask入門」をご覧ください。

apache2側のパス設定にあわせて

@app.route(“/-/”)

だけを書けばいいです(staticパス名を変更したい場合は別途指定必要)。

なおflask側でも、logging.fileHandlerインスタンスでログをとったほうがいいですが、それは別の文脈になりますで当記事では書きません。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です