systemdを使用したgunicornとuvicornのデプロイ

systemdを使用したgunicornとuvicornのデプロイ

ワーカークラスを使用してもロードされない理由を教えてくださいuvicorngunicornsystemd

私が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"

これはシェルとシステムの両方で機能します。

おすすめ記事