Systemd

gunicorn 如何知道如何連接到 systemd 套接字?

  • January 18, 2022

我試圖了解 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

gunicorn.service

[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

如果未明確提及,在systemd套接字(以及以相同方式計時器)中,始終預設使用具有相同名稱的服務。Service=

手冊

對於每個套接字單元,必須存在一個匹配的服務單元,描述服務在套接字上的傳入流量時啟動

$$ … $$. .service 單元的名稱預設與 .socket 單元的名稱相同,但可以使用 Service= 選項進行更改$$ … $$.

因此,發生的情況是套接字正在偵聽/run/gunicorn.sock傳入流量並啟動gunicorn.service並將其連接到傳入流。

神奇的是套接字和服務之間的共享名稱。

引用自:https://unix.stackexchange.com/questions/686827