特別なパラメータが提供されていないため、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
それを着信ストリームに接続しているということです。
魔法はソケットとサービスの間の共有名にあります。