Gunicorn 如何知道如何连接到 systemd 套接字?

Gunicorn 如何知道如何连接到 systemd 套接字?

我试图了解 Gunicorn 如何知道连接到由 systemd 管理的 Unix 套接字,因为没有给出特殊的参数。

我跟着Gunicorn 文档在这里并使用套接字文件gunicorn.socket和服务文件创建了一个 systemd 配置,并且它可以工作。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并将其连接到传入流。

神奇之处在于套接字和服务之间的共享名称。

相关内容