Gunicornはシステムソケットに接続する方法をどうやって知ることができますか?

Gunicornはシステムソケットに接続する方法をどうやって知ることができますか?

特別なパラメータが提供されていないため、Gunicornがsystemdによって管理されているUnixソケットに接続する方法をどのように知っているかを理解したいと思います。

フォローするGunicorn のドキュメントはここにあります。ソケットファイルとサービスファイルでsystemd設定を作成してgunicorn.socket動作します。gunicorn.service/etc/systemd/system/

Unixソケットはファイル内のファイルであり、/run/gunicorn.sockソケット構成の行を介して構成されます。ListenStream=/run/gunicorn.sockただし、systemd 構成にはこれについての言及はありません。次の要求を実行すると、curl --unix-socket /run/gunicorn.sock http正しいHTTP応答が提供されます。

私の質問は、gunicornがこのソケットにバインドする必要があることをどうやって知ることができるかということです。

systemdまたはgunicornにはどのような魔法がありますか?

gunicornにパラメータを渡さなかったため、失敗すると予想しました--bind unix:/run/gunicorn.sock

参考までに私が使用するファイルは次のとおりです。

Gunicorn.socket:

[Unit]
Description=gunicorn socket

[Socket]
ListenStream=/run/gunicorn.sock
SocketUser=www-data

[Install]
WantedBy=sockets.target

グルニコンサービス:

[Unit]
Description=gunicorn daemon
Requires=gunicorn.socket
After=network.target

[Service]
Type=notify
User=elias
Group=elias
RuntimeDirectory=gunicorn
WorkingDirectory=/home/elias/backend

# question: how come does the command below know to bind to /run/gunicorn.sock ??
ExecStart=/home/elias/backend/current/bin/gunicorn  -k uvicorn.workers.UvicornWorker mini_app:app

ExecReload=/bin/kill -s HUP $MAINPID
KillMode=mixed
TimeoutStopSec=5
PrivateTmp=true
Restart=on-failure

[Install]
WantedBy=multi-user.target

ベストアンサー1

ソケット(および同じ方法でタイマー)は、明示的に言及されていない場合はsystemd常に同じ名前のサービスをデフォルトで使用します。Service=

~から手動

各ソケットユニットには、ソケット[...]からの着信トラフィックに対して開始されたサービスを記述する一致するサービスユニットが必要です。 .service ユニットの名前は、デフォルトで .socket ユニットと同じ名前で指定されますが、Service= オプション [...] を使用して変更できます。

/run/gunicorn.sockそれで、何が起こっているのか、ソケットが着信トラフィックを受信し、gunicorn.serviceそれを着信ストリームに接続しているということです。

魔法はソケットとサービスの間の共有名にあります。

おすすめ記事