systemd를 사용하여 gunicorn 및 uvicorn 배포

systemd를 사용하여 gunicorn 및 uvicorn 배포

작업자 클래스를 사용할 때 로드되지 않는 이유를 알려주실 수 있나요 uvicorn?gunicornsystemd

내가 gunicorn다음과 같이 시작할 때 :

/usr/local/bin/gunicorn --bind 127.0.0.1:5045 --forwarded-allow-ips="x.x.x.x" --workers 1 --worker-class uvicorn.workers.UvicornWorker --pid /home/xxx/ip-spotlight/run/pid/ip-spotlight.webapp.glass.pid --error-logfile /var/log/ip-spotlight/ip-spotlight.webapp.glass.error.log --access-logfile /var/log/ip-spotlight/ip-spotlight.webapp.glass.access.log --capture-output glass:app

잘 작동합니다:

[2019-12-10 22:08:55 +0100] [1288] [INFO] Starting gunicorn 20.0.4
[2019-12-10 22:08:55 +0100] [1288] [INFO] Listening at: http://127.0.0.1:5045 (1288)
[2019-12-10 22:08:55 +0100] [1288] [INFO] Using worker: uvicorn.workers.UvicornWorker
[2019-12-10 22:08:55 +0100] [1293] [INFO] Booting worker with pid: 1293
[2019-12-10 22:08:56 +0100] [1293] [INFO] Started server process [1293]
[2019-12-10 22:08:56 +0100] [1293] [INFO] Waiting for application startup.
[2019-12-10 22:08:56 +0100] [1293] [INFO] Application startup complete.

그러나 systemd이를 사용하여 서비스로 실행하는 경우 구성은 다음과 같습니다.

[Unit]
Description=webapp-glass
Requires=network-online.target
After=network-online.target

[Service]
User={{ username }}
WorkingDirectory={{ dir.app }}/ip-spotlight/code/web/glass
EnvironmentFile=-/etc/sysconfig/webapp-glass
ExecStart=/usr/local/bin/gunicorn  $OPTIONS  glass:app
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
PrivateTmp=true
Restart=on-failure

[Install]
WantedBy=multi-user.target

어디 /etc/sysconfig/webapp-glass:

OPTIONS="--bind 127.0.0.1:5045 --forwarded-allow-ips="x.x.x.x" --workers 1 --worker-class uvicorn.workers.UvicornWor
ker --pid /home/xxx/ip-spotlight/run/pid/ip-spotlight.webapp.glass.pid --error-logfile /var/log/ip-spotlight/ip-spotlight.webapp.glass.error.log --acc
ess-logfile /var/log/ip-spotlight/ip-spotlight.webapp.glass.access.log --capture-output"

로그는 다음과 같이 말합니다.

Dec 10 22:16:54 nl-ams02c-ispbgp01.xxx.xxx systemd[1]: Started webapp-glass.
Dec 10 22:16:54 nl-ams02c-ispbgp01.xxx.xxx gunicorn[1794]: [2019-12-10 22:16:54 +0100] [1794] [INFO] Starting gunicorn 20.0.4
Dec 10 22:16:54 nl-ams02c-ispbgp01.xxx.xxx gunicorn[1794]: [2019-12-10 22:16:54 +0100] [1794] [INFO] Listening at: http://127.0.0.1:5045 (1794)
Dec 10 22:16:54 nl-ams02c-ispbgp01.xxx.xxx gunicorn[1794]: [2019-12-10 22:16:54 +0100] [1794] [INFO] Using worker: sync
Dec 10 22:16:54 nl-ams02c-ispbgp01.xxx.xxx gunicorn[1794]: [2019-12-10 22:16:54 +0100] [1798] [INFO] Booting worker with pid: 1798

Using worker: sync(대신 Using worker: uvicorn.workers.UvicornWorker) 앱이 ASGI를 기반으로 하기 때문에 이것이 잘못되었기 때문에 충돌이 발생한다고 말합니다 uvicorn.

올바른 작업자 클래스가 로드되지 않는 이유를 친절하게 지적해 주시겠습니까?

답변1

시스템 환경 파일 및 선언은 셸 구문을 사용하지 않습니다. 일부 제한된 참조 및 확장만 지원합니다. 따라서 "--bind 127.0.0.1:5045 --forwarded-allow-ips="x.x.x.x" --..."따옴표 제거는 --bind 127.0.0.1:5045 --forwarded-allow-ips=x.x.x.x --...systemd 와 달리 쉘에서 수행됩니다(기본 IFS 및 파일 이름 확장이 없다고 가정) EnvironmentFile.

또한 수행하려는 작업(따옴표 붙은 문자열 안에 따옴표 추가)은 불필요하며 어쨌든 상상한 대로 작동하지 않습니다. 쉘이 보게 될 것은 따옴표 붙은 문자열, --bind 127.0.0.1:5045 --forwarded-allow-ips=따옴표 없는 문자열, x.x.x.x따옴표 붙은 문자열 순으로 --workers 1 --worker-class uvicorn.workers.UvicornWorker --pid..., 단순히 이들을 연결합니다. 그러나 변수 할당에서는 파일 이름 확장이 발생하지 않으므로 공백이나 탭이 있는 경우에만 문제가 발생합니다 x.x.x.x(IP이므로 걱정하지 마십시오). 해당 줄은 다음과 같아야 합니다.

OPTIONS="--bind 127.0.0.1:5045 --forwarded-allow-ips=x.x.x.x --workers 1 --worker-class uvicorn.workers.UvicornWorker --pid /home/xxx/ip-spotlight/run/pid/ip-spotlight.webapp.glass.pid --error-logfile /var/log/ip-spotlight/ip-spotlight.webapp.glass.error.log --access-logfile /var/log/ip-spotlight/ip-spotlight.webapp.glass.access.log --capture-output"

이는 쉘과 시스템 모두에서 작동합니다.

관련 정보