我试图了解 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
并将其连接到传入流。
神奇之处在于套接字和服务之间的共享名称。