Flaskサービス導入(Nginx+Gunicorn+Gevent)
4110 ワード
flaskプロジェクトが完了したら、どのようにオンラインでサービスアーキテクチャを導入しますか?
Flaskプロジェクトの導入
基本的なアーキテクチャは次のとおりです.
Nginx
開発環境では、Pythonサービスを直接実行し、あるポート(一般的に5000ポート)を起動し、そのポートを通じて開発デバッグを行います.
しかし、オンライン環境は一般的にこのようにサービスを提供しない.一般的なオンラインサービスは
これで何のメリットがあるの? pythonサービスを非表示にし、pythonサービスを に直接露出させないようにします. Webサービスの接続処理能力(Nginx) を向上は逆エージェントとしてpython全体のサービス処理能力 を向上させる.
構成できるNginxの構成は次のとおりです.
複数のpythonサーバがある場合は、
Gunicorn + Gevent
Gunicorn
WSDIは、httpリクエストパラメータをpythonサービスで読み取れるコンテンツに変換するゲートウェイプロトコルであり、pythonのフレームワークでリクエストパラメータに応じて異なるビジネス処理が可能になります.
この
このほか、Gunicornでは、次のように多くの実行パラメータが提供されています.
Gevent
単一プロセスが直接Python appサービスを実行する場合、2つの同時要求が来た場合、プロセスはまず1つの要求を処理するしかなく、最初の要求処理が完了してから、2番目の要求を処理することができ、ユーザーの体験に影響を与えるに違いない.
単一プロセスの場合、どのようにして同時処理能力を高めることができますか.
多くの場合、当社のサービスでは、パフォーマンスの低下の原因として
Geventはこの仕事を完成したのです
幸いなことに、私たちはコードの中で自分でこの機能を実現する必要はありません.GuncornはGeventモードの運行方式(
Gunicorn+Geventでは、次のように起動できます.
Nginxエージェントからのリクエストは、
supervisor
以上、
私たちは常にオンラインサービスを見ていることはできません.この場合、システムが自動的に停止したサービスを引き上げ、オンラインサービスの安定を保証することを望んでいます.
supervisorはこれを行います.supervisorは構成されたプロセスを守り、プロセスが停止した後にサービスプロセスを再起動し、ログを保持します.
例えば、Nginxサービスの構成は以下のようにすることができる.
このうち
同様にgunicornが起動したsupervisorの構成は以下の通りです.
以上の配置がしっかりしていて、実行
supervisorに
ステータス表示
見える
ステータスは
以上、オンラインpythonサービスのインフラストラクチャの導入を実現しました.主にpythonサービスの導入について、基本的に文頭のアーキテクチャ図に従います.
以上は私たちがプロジェクトで実践したアーキテクチャの配置で、皆さんと一緒に交流することを歓迎します.
Flaskプロジェクトの導入
flask
プロジェクトを開発しました.オンラインサーバに配備する必要があります.では、オンラインサービスはどのように配備すればいいですか.基本的なアーキテクチャは次のとおりです.
Nginx
開発環境では、Pythonサービスを直接実行し、あるポート(一般的に5000ポート)を起動し、そのポートを通じて開発デバッグを行います.
しかし、オンライン環境は一般的にこのようにサービスを提供しない.一般的なオンラインサービスは
Nginx
を通じて外部要求をPython
に転送する必要がある.これで何のメリットがあるの?
構成できるNginxの構成は次のとおりです.
upstream flask_servers {
server 127.0.0.1:9889;
}
server {
listen 80;
server_name dev.simple-cms.com;
access_log /data/logs/nginx/simple_cms_access.log main;
error_log /data/logs/nginx/simple_cms_error.log debug;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_redirect off;
proxy_pass http://flask_servers;
}
location ^~ /static {
root /data/www;
}
}
複数のpythonサーバがある場合は、
upstream
で他のpythonサービスリストを追加し続けます.Gunicorn + Gevent
Gunicorn
Guicorn
はpythonのWSGI
のweb severで、WSGI
とは何ですか.Web Server <=====WSGI=====> Python APP
WSDIは、httpリクエストパラメータをpythonサービスで読み取れるコンテンツに変換するゲートウェイプロトコルであり、pythonのフレームワークでリクエストパラメータに応じて異なるビジネス処理が可能になります.
Gunicorn
はこのようなWSGIの実現であり、彼もweb serverであり、直接対外的なwebサービスを提供することができるが、一般的な配置ではpythonサービスの実行である
,
pythonアプリケーションにすぎない.この
によって、Nginxから転送されたリクエストは、あるpython app
に転送されます.このほか、Gunicornでは、次のように多くの実行パラメータが提供されています.
-w `python app` worker
-k (sync, gevent )
-b gunicorn host port
--max-requests , woker , woker
Gevent
単一プロセスが直接Python appサービスを実行する場合、2つの同時要求が来た場合、プロセスはまず1つの要求を処理するしかなく、最初の要求処理が完了してから、2番目の要求を処理することができ、ユーザーの体験に影響を与えるに違いない.
単一プロセスの場合、どのようにして同時処理能力を高めることができますか.
多くの場合、当社のサービスでは、パフォーマンスの低下の原因として
I/O
があります.例えば、データベースの読み書き、Httpリクエストの送信など、プロセスがI/O
を行う場合、CPUの時間を消費しません.この場合、CPUは他の要求を処理するために空けることができます.Geventはこの仕事を完成したのです
幸いなことに、私たちはコードの中で自分でこの機能を実現する必要はありません.GuncornはGeventモードの運行方式(
-k
パラメータ指定)を実現し、Pythonアプリのより高性能な処理業務を許可しました.Gunicorn+Geventでは、次のように起動できます.
gunicorn --max-requests 300 --pid /tmp/flask.pid --timeout 3 -k gevent -w 2 -b 127.0.0.1:9889 run:app
Nginxエージェントからのリクエストは、
Gunicorn
が起動した9889
ポートに転送できます.supervisor
以上、
Gunicorn+Gevent
を通じてPythonサービスを開始しましたが、場合によってはサービスが停止します(システムがダウンして再起動し、誤殺し、停止したことを知りません:-()、私たちは常にオンラインサービスを見ていることはできません.この場合、システムが自動的に停止したサービスを引き上げ、オンラインサービスの安定を保証することを望んでいます.
supervisorはこれを行います.supervisorは構成されたプロセスを守り、プロセスが停止した後にサービスプロセスを再起動し、ログを保持します.
例えば、Nginxサービスの構成は以下のようにすることができる.
[program:nginx]
command = /usr/local/bin/nginx -g 'daemon off;' -c /usr/local/etc/nginx/nginx.conf
autostart = true
startsecs = 5
autorestart = true
startretries = 3
user = root
このうち
command
は私たちのnginx
の起動命令です.同様にgunicornが起動したsupervisorの構成は以下の通りです.
[program:gunicorn]
directory=/path/to/flask_app
command = /path/to/gunicorn --max-requests 3000 --pid /tmp/flask.pid --timeout 3 -k gevent -w 2 -b 127.0.0.1:9889 run:app autostart = true
startsecs = 5
autorestart = true
startretries = 3
user = www-data
以上の配置がしっかりしていて、実行
sudo supervisorctl -c /path/to/supervisord.ini update
supervisorに
gunicorn
を守ってもらうことができますステータス表示
sudo supervisorctl -c /path/to/supervisord.ini status
見える
gunicorn RUNNING pid 35640, uptime 0:00:14
ステータスは
running
まとめ以上、オンラインpythonサービスのインフラストラクチャの導入を実現しました.主にpythonサービスの導入について、基本的に文頭のアーキテクチャ図に従います.
以上は私たちがプロジェクトで実践したアーキテクチャの配置で、皆さんと一緒に交流することを歓迎します.