gunicorn 如何知道如何連接到 systemd 套接字?
我試圖了解 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
並將其連接到傳入流。神奇的是套接字和服務之間的共享名稱。