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
を使用して呼び出す必要があることに注意してください。