実稼働 WSGI サーバーを使用して Flask アプリを実行する

Salman Mehmood 2023年6月21日
実稼働 WSGI サーバーを使用して Flask アプリを実行する

この説明で、WSGI サーバーについて学び、それがどのように機能するかを見ていきます。 また、WSGI サーバーを作成し、このサーバー内で Flask と Python でアプリを実行する方法も学習します。

Flask と Python で WSGI サーバーを作成し、サーバー内でアプリを実行する

WSGI とも呼ばれる Web サーバー ゲートウェイ インターフェースは、コード行を含む関数またはクラスを指すクライアントからの要求を受け取ると、プロセスに従います。 コードの各行が順番に実行され、最後に応答がクライアントに提供されます。

その後、アプリケーションは後続の要求を処理し、クライアントが応答を受け取るまで同じプロセスに従います。

Web サーバー ゲートウェイ インターフェイス プロセス 1

Web アプリケーションについて質問があります。全体で一度に 1つの要求しか処理していないのでしょうか。 いいえ、ワーカーは複数のリクエストを同時にサポートして処理するようになります。

Django または Flask で構築されたアプリケーションをデプロイする場合、リクエストを処理するワーカーの数を指定する必要があります。これは、Gunicorn などの WSGI サーバーで行われます。 これらのワーカーは、クライアントからの複数のリクエストを一度に処理します。

たとえば、朝食を作ることに例えます。 この場合、1 人がお茶を準備し、2 人目が卵を作るので、一度に 2 人の労働者がキッチンで働いています。

Web サーバー ゲートウェイ インターフェイス プロセス 2

問題は、何百人ものワーカーがタスクを同時に処理するように指定できるかどうかです。 いいえ、サイズが重要であり、キッチンのサイズと同じ数の労働者しか収容できないためです.

同様に、サーバー リソースが使い果たされるまでワーカーをセットアップすることしかできません。 サーバー リソースの使用率を高めるには、より多くのワーカーが必要になります。

一般的に推奨されるワーカ数は CPU コア数の 2 倍 + 1 であるため、CPU コア数が 6 のサーバーの場合は 13 ワーカになります。

Web サーバー ゲートウェイ インターフェース プロセス - ワーカー数

次に、Flask で基本的な機能ベースの Web サーバー ゲートウェイ インターフェイスを作成する方法を見ていきます。 まず、web という名前の root ディレクトリ内にディレクトリを作成し、このディレクトリ内に app.py ファイルを作成します。

ここで、WSGI を使用するために wsgiref というパッケージをインポートする必要があります。これは、WSGI を構築するための良い出発点です。 simple_server から make_server 関数をインポートして、WSGI サーバーを作成できるようにします。

from wsgiref.simple_server import make_server

次に、Web アプリを作成します。これは、このアプリを作成する非常に簡単な方法です。 関数を定義し、それを Web_App() と呼びます。

2つの必須パラメータを取ります。 最初のものは CGI スタイルの変数である environment パラメータです。

次のパラメータは response で、ページを表示したいのは明らかです。 また、応答では、通常、HTML ドキュメントやテキスト ドキュメントなどのヘッダーを使用して重要な情報に応答します。

次に、ステータスを保持する変数、文字列を作成します。 200 OK は 4 文字にする必要があります。

def Web_App(environment, response):
    status = "200 OK"

ここで、リストを受け入れるヘッダーを作成する必要があります。このリスト内に複数のヘッダーをアイテムとして追加できるため、タプルがそのアイテムになります。 このタプルでは、渡すコンテンツ タイプの種類を宣言します。

それでは、次のように statusheaders を使用してレスポンスを設定します。 そして、コンテンツをウェブサイトに戻します。

内容はバイナリデータで返されます。

headers = [("content-type", "text/html; charset=utf-8")]
response(status, headers)
return [b"<h2>Hi there, this is WSGI server</h2>"]

with ブロックを使用してサーバーを作成し、このステートメントで make_server() 関数を使用してみましょう。 いくつかの引数が必要です。

1つ目は、デフォルトで localhost になるホストです。これが、空の文字列を残す理由です。 次は 5000 になるポートで、次の引数で Web_App() 関数を渡す必要があります。

この引数は、アプリまたは提供したいコンテンツを表示するためのものです。 ここで、ユーザーにメッセージを出力して、Web サイトの場所とサーバーの終了方法を知らせます。

ここで、サーバーにサービスを提供し、serve_forever() メソッドを使用します。これは、端末を介してサーバーを強制終了するか、どこかにエラーが発生してサーバーが強制終了するまで、サーバーにサービスを提供することを意味します。

with make_server("", 5000, Web_App) as server:
    print(
        "serving on port 5000...\nvisit http://127.0.0.1:5000\nTo exit press ctrl + c"
    )
    server.serve_forever()

サーバーを実行してから、アプリが実行されているブラウザーに移動しましょう。 アクセスすると、アプリ内で定義したとおりにコンテンツが表示されます。

Flask アプリを実行する WSGI サーバー - 出力

WSGI サーバーの詳細については、ここ をクリックして公式ドキュメントを参照してください。

完全な Python コード:

from wsgiref.simple_server import make_server


def Web_App(environment, response):
    status = "200 OK"
    headers = [("content-type", "text/html; charset=utf-8")]
    response(status, headers)
    return [b"<h2>Hi there, this is WSGI server</h2>"]


with make_server("", 5000, Web_App) as server:
    print(
        "serving on port 5000...\nvisit http://127.0.0.1:5000\nTo exit press ctrl + c"
    )
    server.serve_forever()
著者: Salman Mehmood
Salman Mehmood avatar Salman Mehmood avatar

Hello! I am Salman Bin Mehmood(Baum), a software developer and I help organizations, address complex problems. My expertise lies within back-end, data science and machine learning. I am a lifelong learner, currently working on metaverse, and enrolled in a course building an AI application with python. I love solving problems and developing bug-free software for people. I write content related to python and hot Technologies.

LinkedIn