ワーカークラスを使用してもロードされない理由を教えてくださいuvicorn
。gunicorn
systemd
私が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"
これはシェルとシステムの両方で機能します。