Flaskサービス導入(Nginx+Gunicorn+Gevent)

4110 ワード

flaskプロジェクトが完了したら、どのようにオンラインでサービスアーキテクチャを導入しますか?
Flaskプロジェクトの導入flaskプロジェクトを開発しました.オンラインサーバに配備する必要があります.では、オンラインサービスはどのように配備すればいいですか.
基本的なアーキテクチャは次のとおりです.
Nginx
開発環境では、Pythonサービスを直接実行し、あるポート(一般的に5000ポート)を起動し、そのポートを通じて開発デバッグを行います.
しかし、オンライン環境は一般的にこのようにサービスを提供しない.一般的なオンラインサービスはNginxを通じて外部要求をPython に転送する必要がある.
これで何のメリットがあるの?
  • pythonサービスを非表示にし、pythonサービスを
  • に直接露出させないようにします.
  • Webサービスの接続処理能力(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サービスの導入について、基本的に文頭のアーキテクチャ図に従います.
    以上は私たちがプロジェクトで実践したアーキテクチャの配置で、皆さんと一緒に交流することを歓迎します.