Gunicorn은 시스템 소켓에 연결하는 방법을 어떻게 알 수 있습니까?

Gunicorn은 시스템 소켓에 연결하는 방법을 어떻게 알 수 있습니까?

특별한 매개변수가 제공되지 않기 때문에 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하고 이를 들어오는 스트림에 연결하고 있다는 것입니다.

마법은 소켓과 서비스 간의 공유 이름에 있습니다.

관련 정보