よく使うGunicorn設定ファイルについて

この記事は私がよく使うGunicornの設定をメモしたものです。Flaskで動かすことを前提に記載しています。Djangoなどは想定していません。設定の中身は最後に記載しています。
詳細は公式ドキュメントをご確認ください。
「Gunicornとは?」の説明は公式サイトご参照ください。

Contents

ファイル名について

公式ドキュメントに記載がある通り、デフォルトではgunicorn.conf.pyというファイル名の設定ファイルを探して読み込みます。設定ファイル名を変更したい場合はGunicorn起動時に-cまたは--configオプションを指定します。

# 起動例
gunicorn app:app    # この場合はgunicorn.conf.pyを読み込もうとする
gunicorn app:app -c <config file path>
gunicorn app:app -config <config file path>

一部設定についての補足

基本的に設定を確認していただければ何をやっているのか想像がつくと思いますが、一部補足します。

reload_extra_files

reload = Trueオプションをつけていても、プロジェクト内のどのファイルが更新されたら自動的にGunicornがリロードされるわけではありません。開発中に特に「それは監視してよぉ…」と思ったのはtemplates/配下のファイルでしたので設定を入れています。
以下の記載があるので、reloadオプションがTrueでないと有効にならないのかな。reloadオプションを外した時の挙動は未検証です。

Extends reload option to also watch and reload on additional files

https://docs.gunicorn.org/en/stable/settings.html

access_log_format

access_logのフォーマットですが、ボトルネックを探す際にリクエストの処理時間が必要になります。以下のようにいくつか選択できますが、私はミリ秒で出力しています。
LTCV(Labeled Tab separated Values)とかにするのがいいのかも。

T  time in seconds
M  request time in milliseconds
D  request time in microseconds
L  request time in decimal seconds

https://docs.gunicorn.org/en/stable/settings.html

ログローテートについて

設定ファイルの中身に記載する話ではないですが、Gunicorn自身にログローテートをする機能はないようです。Linux系OSの場合はlogrotatedなどでローテートするようにしましょう。
以下はサンプルとして記載しています。適宜修正してください。詳しくはman logrotate.confなどで確認してください。

<path to gunicorn log> {
    weekly
    rotate 4
    create
    compress
    dateext
    missingok
    create 0644 gunicorn gunicorn
}

設定ファイル全体

# See Also https://docs.gunicorn.org/en/stable/settings.html
bind = "<IP>:5000"
workers = 5
timeout = 90
daemon = True
reload = True
reload_extra_files = ["./templates/index.html"]
accesslog = "access_log.log"
errorlog = "error_log.log"
# access_log_format = '%(h)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s"'
access_log_format = '%(h)s %(l)s %(u)s %(t)s %(M) "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s"'

シェアする

  • このエントリーをはてなブックマークに追加

フォローする