WSGI、uwsgi、uWSGIの違いと、uWSGIとgunicornに基づくPythonWebの展開について簡単に説明します。
前書き
最近、Flask Webフレームワークに基づいたバックエンドプロジェクトを開発しています。WebサーバーとFlaskアプリケーション間の対話中に、この記事のトピックで言及されているWSGI、uwsgi、およびuWSGIの概念に常に遭遇します。次のように。
WSGI
英語のフルネーム:Webサーバーゲートウェイインターフェイス、Webサービスネットワーク管理インターフェイス。簡単に言うと、Webサーバーとアプリケーション間の通信仕様です。
uwsgi
uwsgiは通信プロトコルですが、WSGIでは2つのものに属しており、このプロトコルではより高速です。
uWSGI
uWSGIはWebサーバーであり、排他的なuwsgiプロトコルですが、WSGIプロトコル、HTTPプロトコルなどもサポートしています。その機能は、HTTPプロトコルをPythonが使用する言語でサポートされているネットワークプロトコルに変換することです。
Flaskは非常に使いやすく、組み込みのapp.run(host="0.0.0.0", port=7001)
デバッグは非常に便利ですが、同時実行性が高いか堅牢性であるかに関係なく、実稼働環境で使用されます。一般にWGSIコンテナーにはありません。[実稼働環境でのデプロイメント]
uWSGIの使用
Djangoプロジェクトで作業する場合、通常、テストと開発にはDjangoの組み込みWebサーバーを直接使用しますが、プロジェクトを本番環境で使用し、並行性やその他のパフォーマンスを考慮する場合は、uwsgiとnginxが必要になる場合があります。 uwsgiの一般的な使用法について説明します。nginxの構成については、フォローアップ専用のブログ投稿を作成します。
1.インストール
pip install uwsgi
2.構成
uwsgiを実行するには、一般に2つの方法があります。コマンドラインとファイル構成ですが、コマンドラインで多くのパラメーターを記憶する必要がある場合があるため、ファイル構成がより一般的なアプローチです。ファイル形式は、ini、xml、yamlなどの多くのタイプをサポートします。 。著者は、比較的単純なキー値形式のiniモードを使用することをお勧めします。単純な、uwsgiiniの構成例を以下に示します。
[uwsgi]
socket = 127.0.0.1:8001
master = false
chdir = /var/www/cmpvirtmgr/
module = cmpvirtmgr.wsgi
home = /var/www/env
workers = 2
reload-mercy = 10
vacuum = true
max-requests = 1000
limit-as = 512
buffer-size = 30000
pidfile = /etc/uwsgi/uwsgi.pid
実行:uwsgi --ini /path/to/uwsgi.ini
パラメータの説明:
- ソケット:ソケットファイル。アドレス+ポートにすることもできます。
- マスター:他のプロセスを管理するためにメインプロセスを開始するかどうか。
- chdir:プロジェクトのルートディレクトリ。
- モジュール:wsgiファイルの相対パス。
- ホーム:仮想環境ディレクトリ。
- ワーカー:開いているプロセスの数。
- reload-mercy:スムーズな再起動(受信したリクエストが処理されるまで再起動)で、作業中のサブプロセスでの作業の終了を待機する最大秒数を設定します。
- バキューム:サービスの終了時に、対応するソケットファイルとpidファイルを削除します。
- max_requests:各ワーカープロセスによって設定されるリクエストの上限。
- limit_as:各uwsgiプロセスが占有する仮想メモリの数を制限します。
- buffer_size:uwsgiパッケージの解析に使用される内部バッファー領域のサイズを設定します。
- pid_file:pidファイルを指定します。
- 切腹:リクエストのタイムアウト期間。
- デーモン化:プロセスはバックグラウンドで実行され、ログを特定のパスに保存します。uwsgiプロセスがスーパーバイザーによって管理されている場合、このパラメーターは設定できません。
uwsgiパラメータの詳細については、公式ドキュメントを参照してください:https://uwsgi-docs.readthedocs.io/en/latest/
gunicornを使用してフラスコプロジェクトをデプロイする
1.WSGIプロトコル
Webフレームワークは、Restfulに基づいてHTMLコードを生成する方法またはAPIインターフェイスデータを生成する方法に特化しており、WebサーバーはHTTP要求を処理して応答するために使用されます。WebフレームワークとWebサーバー間の通信には、両方の当事者が従う一連のインターフェイスプロトコルが必要です。WSGIプロトコルは、2つのインターフェイスを統合するために使用されます。
2、WSGI容器
一般的に使用されるWSGIコンテナーはGunicornとuWSGIですが、Gunicornは構成ファイルを記述せずにコマンドで直接開始されます。これはuWSGIよりもはるかに簡単なので、ここではコンテナーとしてGunicornを使用することも選択します。
3.gunicornの紹介
GunicornはPythonWsgi httpサーバーであり、Rubyのunicornプロジェクトから派生したUnixシステムでの実行のみをサポートします。Gunicornは、さまざまなwsgi Webフレームワークで動作できるプリフォークマスターワーカーモデル(gunicornではマスターはアービターと呼ばれます)を使用します。
4.Gunicornのインストール
gunicornのインストールは非常に簡単です。コマンドpipinstallgunicornを使用するだけです。通常は、主に非同期ワーカーモデルを使用するために使用しますが、対応する非同期モジュールもインストールする必要があります。
$ pip install gunicorn
$ pip install greenlet # 使用异步必须安装
$ pip install eventlet # 使用eventlet workers
$ pip install gevent # 使用gevent workers
5.gunicornの使用
これは、gunicornを使用してフラスコプロジェクトをデプロイする例です。ここでのフラスコフレームワークの使用は、詳しく説明するのにそれほど多くはなく、この記事の焦点ではありません。
次の例では、app.pyとして保存します
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello World!"
gunicornで通常使用されるパラメーターは次のとおりです。
-c CONFIG, --config=CONFIG
# 设定配置文件。
-b BIND, --bind=BIND
# 设定服务需要绑定的端口。建议使用HOST:PORT。
-w WORKERS, --workers=WORKERS
# 设置工作进程数。建议服务器每一个核心可以设置2-4个。
-k MODULE
# 选定异步工作方式使用的模块。
次のように、シェルにスタートアップコンフィギュレーションを入力します。
$ gunicorn -w 3 -b 127.0.0.1:8080 app:app
# 此处app:app中,第一个app为flask项目实例所在的启动模块,第二个app为生成的flask项目实例
サーバーは、正常に動作しているときに起動できます。
6.バインディングポート
Linuxは通常、rootユーザー権限でない限り、1024未満のポートの使用を禁止しています。gunicornを使用しているときに、多くの人がポート80または443にバインドしようとしましたが、無効であることがわかりました。これらのポートにバインドする場合は、次のようないくつかの一般的な方法があります。
- Nginxプロキシ転送を使用します。
- sudoがgunicornを開始します。
- 追加のプログラムをインストールします。
7.gunicornサービスプロセスを終了します
ps -ef | grep gunicornコマンドを使用して、gunicornのすべてのプロセスを調べます。
[root@VM_0_12_centos ~]# ps -ef | grep gunicorn
root 16843 23035 0 Oct14 ? 00:00:02 /root/Envs/myflask/bin/python3.6 /root/Envs/myflask/bin/gunicorn -w 3 -b 172.17.0.12:80 app:app
root 22445 23035 0 Oct04 ? 00:00:15 /root/Envs/myflask/bin/python3.6 /root/Envs/myflask/bin/gunicorn -w 3 -b 172.17.0.12:80 app:app
root 22581 23035 0 Oct11 ? 00:00:05 /root/Envs/myflask/bin/python3.6 /root/Envs/myflask/bin/gunicorn -w 3 -b 172.17.0.12:80 app:app
root 23035 1 0 Sep27 ? 00:04:11 /root/Envs/myflask/bin/python3.6 /root/Envs/myflask/bin/gunicorn -w 3 -b 172.17.0.12:80 app:app
次に、kill -9 process IDコマンドを使用してプロセスを強制終了します。メインプロセスを見つけて強制終了すると、子プロセスが終了することに注意してください。上記の例では、メインプロセスIDは23035です。
[root@VM_0_12_centos ~]# kill -9 23035
[root@VM_0_12_centos ~]# ps -ef | grep gunicorn
プロセスを強制終了した後、数秒待ってから、ps -ef | grep gunicornを使用して、すべてのgunicornサービスプロセスが強制終了されたことを確認します。