Flask + Nginx+Gunicornをデプロイしたいと思います。Nginxをセットアップして実行し、ドキュメントで説明されているようにgunicornを実行します。
gunicorn app:app
しかし、サーバーからログアウトすると、gunicornプロセスは終了しますか?Nginxが接続するために実行を継続し、クラッシュした場合に再起動するための正しい方法は何ですか?
--daemon
gunicornの実行中にオプションを使用します。例:
gunicorn grand56.wsgi:application --name grand56 --workers 3 --user=root --group=root --bind=127.0.0.1:1001 --daemon
gunicornのバインディングコマンドに--daemonを使用します。元:
gunicorn --bind 0.0.0.0:8001 your_project.wsgi --daemon
スーパーバイザーのようなものを調べます。
非常に便利なチュートリアルはここにありますhttps://www.codingforentrepreneurs.com/blog/hello-linux-setup-gunicorn-and-supervisor/
注意すべき重要な点は、コマンドラインからプロセスを開始すると、それはターミナルプロセスの子(つまり、の子bash
)であるということです。サーバーからログアウトすると、bash
プロセスは終了します-すべての子も同様です。
nginxを管理し、gunicornも管理するために使用しているシステムを使用することをお勧めします(init.d
Monit、Supervisor、Bluepill、Foremanなどの特殊なアプリケーションプロセスモニターまで、またはUpstartスクリプトから)
これを試して:
nohup gunicorn app:app &
ショーンに注意してください。
ただし、次のようにオンザフライで実行できます。
nohup gunicorn -c config.py </dev/null >/dev/null 2>&1
そしてそれはもはや端末接続に依存しなくなります。出力を保存したい場合>/dev/null
のようなものに置き換えることができます。>somelogfile
ただし、本番環境で使用する場合は、プロセスの管理に使用するツールに統合するのが最適です。
このようにハグAPIを実行しています。
--daemonは、プロセスをバックグラウンドで維持することです。
--access-logfileは、リクエストログを保持します
--bind = <ip>:<port> IPを指定すると、他のシステムからのアクセスが許可されます(プロキシが不要な場合)。
gunicorn <pyscirpt_name>:__hug_wsgi__ --name caassist -w 4 --access-logfile /var/logs/gunicorn/gunicorn_access.log --daemon --bind=<ip>:<port>
Supervisor
プロセス管理のための優れたクロスプラットフォームソリューションです。これは非常に機能が豊富で、(私の意見では)いくつかのバニラLinuxの代替手段(upstart、sysv、systemd)よりもはるかに多くの構成が必要です。プロセスを開始、監視、および(必要に応じて)再開するには、必ずこのようなものを使用する必要があります。
最終的にどのプロセスマネージャーを使用する場合でも、gunicornを「不適切に実行」したままにすることができます(つまり、rootユーザーとして)。他の回答で省略されている重要な詳細のいくつかは、おそらく1人の(root以外の)ユーザーが、そのユーザーとnginxグループが所有し、アクセス許可を持つunixソケットにバインドするgunicornプロセスを所有している必要があるということ770
です。を使用すると、代わりにマスクを指定するため、フラグをgunicorn
反転770
し007
て使用します。-m
このように、gunicornとnginxのみがソケットに対して読み取り/書き込み/実行でき、ポートは必要ありません。-u
とを使用して、gunicornプロセスのユーザーとグループを指定できます。-g
フラグを立てると、それらの所有者とのソケットが作成されます。プロセス管理、nginx / gunicornに使用することになったものは何でも、スタートアップスクリプトに次のようなものが必要になる可能性があります。
exec gunicorn wsgi:app -u gunicorn -g nginx -m 007 -b gunicorn.sock >> /var/log/$<service_name>.sys.log 2>&1
gunicornユーザーがログファイルへの書き込み権限を持っていることを確認してください。次に、以前はip / port(つまり)を持っていたnginxで0.0.0.0:5000
、ソケットへのパス(つまり/usr/share/nginx/html/gunicorn.sock
)を入力します。--daemon
ここではフラグを使用していませんが、使用していることに注意してくださいexec
。これは、gunicornを子プロセスとして実行するプロセスマネージャーを想定していますexec
。
ここですべての異なるフラグを見つけることができます。
systemdオプションを試してみましたが、正常に機能しました。以下のリンクに完全な回答があり、アプリをgunicornサービスとして呼び出すためのすべての手順が記載されています。
https://askubuntu.com/questions/930589/running-upstart-script-on-17-04/1010398#1010398