Tornado 非阻塞HTTP服务器
一个非阻塞的单线程 HTTP 服务器。
典型的应用程序与 HTTPServer类几乎没有直接交互,除了在进程开始时启动服务器(甚至通常通过tornado.web.Application.listen间接完成)。
在 4.0 版更改:曾经存在于此模块中的 HTTPRequest类已移至 tornado.httputil.HTTPServerRequest。 旧名称保留为别名。
HTTP服务器
class tornado.httpserver.HTTPServer(request_callback: Union[httputil.HTTPServerConnectionDelegate, Callable[[httputil.HTTPServerRequest], None]], no_keep_alive: bool = False, xheaders: bool = False, ssl_options: Union[Dict[str, Any], ssl.SSLContext] = None, protocol: Optional[str] = None, decompress_request: bool = False, chunk_size: Optional[int] = None, max_header_size: Optional[int] = None, idle_connection_timeout: Optional[float] = None, body_timeout: Optional[float] = None, max_body_size: Optional[int] = None, max_buffer_size: Optional[int] = None, trusted_downstream: Optional[List[str]] = None)
一个非阻塞的单线程 HTTP 服务器。
服务器由 HTTPServerConnectionDelegate
的子类定义,或者为了向后兼容,使用 HTTPServerRequest
作为参数的回调。 委托通常是一个 tornado.web.Application
。
HTTPServer
默认支持keep-alive 连接(对于HTTP/1.1 自动支持,或者在客户端请求Connection: keep-alive
时支持HTTP/1.0)。
如果 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.SSLContext
对象的 ssl_options
关键字参数。 为了与旧版本的 Python 兼容,ssl_options
也可能是 ssl.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
初始化遵循以下三种模式之一(初始化方法在 tornado.tcpserver.TCPServer
上定义):
1、listen
:简单的单进程:
server = HTTPServer(app)
server.listen(8888)
IOLoop.current().start()
在许多情况下,可以使用 tornado.web.Application.listen
来避免显式创建 HTTPServer
的需要。
2、bind
/start
:简单的多进程:
server = HTTPServer(app)
server.bind(8888)
server.start(0) # Forks multiple sub-processes
IOLoop.current().start()
使用此接口时,不得将 IOLoop
传递给 HTTPServer
构造函数。 start
将始终在默认单例 IOLoop
上启动服务器。
3、add_sockets
:先进的多进程:
sockets = tornado.netutil.bind_sockets(8888)
tornado.process.fork_processes(0)
server = HTTPServer(app)
server.add_sockets(sockets)
IOLoop.current().start()
add_sockets
接口更复杂,但它可以与 tornado.process.fork_processes
一起使用,以便在分叉发生时给您更多的灵活性。如果您想以除 tornado.netutil.bind_sockets
之外的其他方式创建侦听 sockets,则 add_sockets
也可用于单进程服务器。
在 4.0 版更改:添加了 decompress_request
、chunk_size
、max_header_size
、idle_connection_timeout
、body_timeout
、max_body_size
参数。 添加了对 HTTPServerConnectionDelegate
实例作为 request_callback
的支持。
在 4.1 版更改:HTTPServerConnectionDelegate.start_request
现在使用两个参数(server_conn
,request_conn
)而不是一个(request_conn
)调用。
在 4.2 版更改:HTTPServer
现在是 tornado.util.Configurable
的子类。
在 4.5 版更改: 添加了trusted_downstream
参数。
在 5.0 版更改: io_loop
参数已被删除。
该类的公共接口主要继承自 TCPServer
,并记录在该类下。
coroutineclose_all_connections() → None
关闭所有打开的连接并异步等待它们完成。
此方法与 stop 结合使用以支持清除关闭(尤其是对于单元测试)。 典型用法是首先调用 stop()
停止接受新连接,然后 await close_all_connections()
等待现有连接完成。
此方法当前不会关闭打开的 websocket 连接。
请注意,此方法是协程,必须与 await
一起调用。
更多建议: