web-dev-qa-db-ja.com

提供Python(Flask)REST API over HTTP2

Python RESTサービスがあり、HTTP2を使用してサービスを提供したい。現在のサーバー設定はnginx -> Gunicorn。言い換えると、nginx(ポート443にリダイレクトするポート443および80)はリバースプロキシとして実行され、リクエストをGunicornに転送します(ポート8000​​、SSLなし)。 nginxはHTTP2モードで実行されており、chromeを使用し、サーバーに単純なGETを送信した後で「プロトコル」列を検査することで確認できます。ただし、Gunicornは、受け取ったリクエストがHTTP1であることを報告します.0。また、このリストにはそれが見つかりません: https://github.com/http2/http2-spec/wiki/Implementations したがって、私の質問は次のとおりです。

  • Python(Flask)アプリケーションをHTTP2で提供することは可能ですか?はいの場合、どのサーバーがそれをサポートしていますか?
  • 私の場合(1つのリバースプロキシサーバーと実際のAPIを提供するサーバー)、どのサーバーがHTTP2をサポートする必要がありますか?

HTTP2を使用したい理由は、何千ものリクエストをまとめて実行する必要がある場合があるためです。また、HTTP2の多重化リクエスト機能で処理速度が向上するかどうかを確認したいと思っていました。 HTTP1.0およびPythonリクエストをクライアントとして使用する場合、各リクエストには80msほどかかります。これは受け入れられません。他の解決策は、my REST 1つのリクエストで複数のリソースを送信します。はい、このアイデアはうまく聞こえますが、HTTP2でスピードアップできるかどうかを知りたいと思っています。

最後に、クライアント側ではPython Requests with the Hyper http2 adapterを使用することを述べておきます。

16
AstrOne

HTTP/2でPython(Flask)アプリケーションを提供することは可能ですか?

はい、あなたが提供する情報によって、あなたはそれをうまくやっています。

私の場合(1つのリバースプロキシサーバーと実際のAPIを提供するサーバー)、どのサーバーがHTTP2をサポートする必要がありますか?

さて、私は薄い氷の上を歩き、意見を述べます。

これまでにHTTP/2が展開されてきた方法は、HTTP/2を通信するEdgeサーバー(ShimmerCatやNginXなど)を持つことです。そのサーバーはTLSとHTTP/2を終了し、そこからHTTP/1、HTTP/1.1、またはFastCGIを使用して内部アプリケーションと通信します。

少なくとも理論的には、エッジサーバーはWebアプリケーションとHTTP/2で通信できますか?はい。ただし、HTTP/2は複雑であり、内部アプリケーションの場合、あまり効果がありません。

これは、ほとんどのWebアプリケーションフレームワークがコンテンツのリクエストを処理するために構築されており、HTTP/1またはFastCGIで十分に機能するためです。例外はありますが、Webアプリケーションは、多重化、優先順位付け、無数のセキュリティ対策など、HTTP/2の微妙なことにほとんど役に立ちません。

結果として生じる懸念の分離は、私の意見では良いことです。


80ミリ秒の応答時間は、使用しているHTTPプロトコルとはほとんど関係がないかもしれませんが、それらの80ミリ秒がほとんど入出力の待機に費やされている場合は、当然、並行して実行することは良いことです。

Gunicornはスレッドまたはプロセスを使用して各リクエストを処理します(グリーンレットバックエンドを構成するために余分なマイルを費やしていない限り)。

リクエストの内容で許可されている場合は、一時ファイルを作成して、HTTP/2エッジサーバーで提供できます。

15
dsign

Pythonアプリから、たとえば Twisted を使用して)HTTP/2を直接提供できるようになりました。Flask =アプリですが、その場合は(バイアスあり)をお勧めします Quart これはFlask APIをasyncioの上に再実装したものです(HTTP/2サポートあり))。

あなたの実際の問題、

HTTP1.0およびPythonリクエストをクライアントとして使用する場合、各リクエストには最大80msかかります

あなたが経験している問題は、各リクエストが新しい接続を開くことであると私に示唆しています。これは、HTTP/2を必要とせずに 接続プール を使用することで軽減できます。

3
pgjones