특별한 매개변수가 제공되지 않기 때문에 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
하고 이를 들어오는 스트림에 연결하고 있다는 것입니다.
마법은 소켓과 서비스 간의 공유 이름에 있습니다.