tornado.httpserver — ノンブロッキングHTTPサーバー¶
ノンブロッキング、シングルスレッドのHTTPサーバー。
典型的なアプリケーションは、プロセスの開始時にサーバーを起動する以外、HTTPServer クラスと直接対話することはほとんどありません(そして、それはしばしばtornado.web.Application.listen を介して間接的に行われます)。
バージョン 4.0 で変更: 以前はこのモジュールにあった HTTPRequest クラスは、tornado.httputil.HTTPServerRequest に移動しました。古い名前はエイリアスとして残っています。
HTTPサーバー¶
- class tornado.httpserver.HTTPServer(…)[ソース]¶
ノンブロッキング、シングルスレッドのHTTPサーバー。
サーバーは、
HTTPServerConnectionDelegateのサブクラス、または下位互換性のために、HTTPServerRequestを引数として取るコールバックによって定義されます。デリゲートは通常、tornado.web.Applicationです。HTTPServerは、デフォルトでキープアライブ接続をサポートします(HTTP/1.1 では自動的に、HTTP/1.0 ではクライアントがConnection: keep-aliveをリクエストした場合)。xheadersがTrueの場合、X-Real-Ip/X-Forwarded-ForヘッダーとX-Scheme/X-Forwarded-Protoヘッダーをサポートします。これらのヘッダーは、すべてのリクエストのリモートIPとURIスキーム/プロトコルをオーバーライドします。これらのヘッダーは、Tornadoをリバースプロキシまたはロードバランサーの背後で実行する場合に役立ちます。Tornadoが、サポートされているxheadersのいずれも設定しないSSLデコードプロキシの背後で実行される場合、protocol引数をhttpsに設定することもできます。デフォルトでは、
X-Forwarded-Forヘッダーを解析する場合、Tornadoはホストのリストの最後の(つまり、最も近い)アドレスをリモートホストIPアドレスとして選択します。チェーン内の次のサーバーを選択するには、信頼できるダウンストリームホストのリストをtrusted_downstream引数として渡すことができます。これらのホストは、X-Forwarded-Forヘッダーの解析時にスキップされます。このサーバーでSSLトラフィックを処理するには、
ssl_optionsキーワード引数にssl.SSLContextオブジェクトを指定します。Pythonの古いバージョンとの互換性のために、ssl_optionsはssl.SSLContext.wrap_socketメソッドのキーワード引数の辞書にすることもできます。ssl_ctx = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH) ssl_ctx.load_cert_chain(os.path.join(data_dir, "mydomain.crt"), os.path.join(data_dir, "mydomain.key")) HTTPServer(application, ssl_options=ssl_ctx)
HTTPServerの初期化は、次の3つのパターンのいずれかを 따릅니다(初期化メソッドはtornado.tcpserver.TCPServerで定義されています)。listen: シングルプロセスasync def main(): server = HTTPServer() server.listen(8888) await asyncio.Event.wait() asyncio.run(main())
多くの場合、
tornado.web.Application.listenを使用することで、HTTPServerを明示的に作成する必要性を回避できます。この例自体はマルチプロセスを作成しませんが、
reuse_port=True引数をlisten()に渡すと、プログラムを複数回実行してマルチプロセスサービスを作成できます。add_sockets: マルチプロセスsockets = bind_sockets(8888) tornado.process.fork_processes(0) async def post_fork_main(): server = HTTPServer() server.add_sockets(sockets) await asyncio.Event().wait() asyncio.run(post_fork_main())
add_socketsインターフェースはより複雑ですが、tornado.process.fork_processesと組み合わせて使用すると、単一の親からフォークされたすべてのワーカープロセスでマルチプロセスサービスを実行できます。add_socketsは、bind_sockets以外でリスニングソケットを作成する場合、シングルプロセスサーバーでも使用できます。このパターンを使用する場合、イベントループに関連する処理は
fork_processesの前に実行できないことに注意してください。bind/start: シンプルな**非推奨**マルチプロセスserver = HTTPServer() server.bind(8888) server.start(0) # Forks multiple sub-processes IOLoop.current().start()
このパターンは、Python 3.10以降非推奨となっている
asyncioモジュールのインターフェースを必要とするため、非推奨です。startメソッドで複数のプロセスを作成する機能は、Tornadoの将来のバージョンで削除される予定です。
バージョン 4.0 で変更:
decompress_request、chunk_size、max_header_size、idle_connection_timeout、body_timeout、max_body_size引数が追加されました。request_callbackとしてHTTPServerConnectionDelegateインスタンスのサポートが追加されました。バージョン 4.1 で変更:
HTTPServerConnectionDelegate.start_requestは、1つの(request_conn)ではなく、2つの引数(server_conn, request_conn)で呼び出されるようになりました(ドキュメントに従って)。バージョン 4.2 で変更:
HTTPServerはtornado.util.Configurableのサブクラスになりました。バージョン 4.5 で変更:
trusted_downstream引数が追加されました。バージョン 5.0 で変更:
io_loop引数が削除されました。このクラスのパブリックインターフェースは、ほとんど
TCPServerから継承されており、そのクラスのドキュメントに記載されています。- coroutine close_all_connections() None[source]¶
開いているすべての接続を閉じ、それらが完了するのを非同期に待機します。
このメソッドは、
stopと組み合わせて使用して、クリーンシャットダウンをサポートします(特にユニットテストの場合)。典型的な使用方法では、最初にstop()を呼び出して新しい接続の受け入れを停止し、次にawait close_all_connections()を呼び出して既存の接続が完了するのを待機します。このメソッドは、現在開いているwebsocket接続を閉じません。
このメソッドはコルーチンであり、
awaitを使用して呼び出す必要があることに注意してください。