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 をリクエストした場合)。

xheadersTrue の場合、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_optionsssl.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で定義されています)。

  1. 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()に渡すと、プログラムを複数回実行してマルチプロセスサービスを作成できます。

  2. 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の前に実行できないことに注意してください。

  3. 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_requestchunk_sizemax_header_sizeidle_connection_timeoutbody_timeoutmax_body_size引数が追加されました。 request_callbackとしてHTTPServerConnectionDelegateインスタンスのサポートが追加されました。

バージョン 4.1 で変更: HTTPServerConnectionDelegate.start_requestは、1つの(request_conn)ではなく、2つの引数(server_conn, request_conn)で呼び出されるようになりました(ドキュメントに従って)。

バージョン 4.2 で変更: HTTPServertornado.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を使用して呼び出す必要があることに注意してください。