A non-blocking, single-threaded HTTP server.
Typical applications have little direct interaction with the HTTPServer
class except to start a server at the beginning of the process
(and even that is often done indirectly via tornado.web.Application.listen
).
Changed in version 4.0: The HTTPRequest
class that used to live in this module has been moved
to tornado.httputil.HTTPServerRequest
. The old name remains as an alias.
HTTP Server
class tornado.httpserver.HTTPServer(*args, **kwargs)[source]
A non-blocking, single-threaded HTTP server.
A server is defined by a subclass of HTTPServerConnectionDelegate
,
or, for backwards compatibility, a callback that takes an
HTTPServerRequest
as an argument. The delegate is usually a
tornado.web.Application
.
HTTPServer
supports keep-alive connections by default
(automatically for HTTP/1.1, or for HTTP/1.0 when the client
requests Connection: keep-alive
).
If xheaders
is True
, we support the
X-Real-Ip
/X-Forwarded-For
and
X-Scheme
/X-Forwarded-Proto
headers, which override the
remote IP and URI scheme/protocol for all requests. These headers
are useful when running Tornado behind a reverse proxy or load
balancer. The protocol
argument can also be set to https
if Tornado is run behind an SSL-decoding proxy that does not set one of
the supported xheaders
.
By default, when parsing the X-Forwarded-For
header, Tornado will
select the last (i.e., the closest) address on the list of hosts as the
remote host IP address. To select the next server in the chain, a list of
trusted downstream hosts may be passed as the trusted_downstream
argument. These hosts will be skipped when parsing the X-Forwarded-For
header.
To make this server serve SSL traffic, send the ssl_options
keyword
argument with an ssl.SSLContext
object. For compatibility with older
versions of Python ssl_options
may also be a dictionary of keyword
arguments for the ssl.wrap_socket
method.:
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
initialization follows one of three patterns (the
initialization methods are defined on tornado.tcpserver.TCPServer
):
listen
: simple single-process:server = HTTPServer(app) server.listen(8888) IOLoop.current().start()
In many cases,
tornado.web.Application.listen
can be used to avoid the need to explicitly create theHTTPServer
.bind
/start
: simple multi-process:server = HTTPServer(app) server.bind(8888) server.start(0) # Forks multiple sub-processes IOLoop.current().start()
When using this interface, an
IOLoop
must not be passed to theHTTPServer
constructor.start
will always start the server on the default singletonIOLoop
.add_sockets
: advanced multi-process:sockets = tornado.netutil.bind_sockets(8888) tornado.process.fork_processes(0) server = HTTPServer(app) server.add_sockets(sockets) IOLoop.current().start()
The
add_sockets
interface is more complicated, but it can be used withtornado.process.fork_processes
to give you more flexibility in when the fork happens.add_sockets
can also be used in single-process servers if you want to create your listening sockets in some way other thantornado.netutil.bind_sockets
.
Changed in version 4.0: Added decompress_request
, chunk_size
, max_header_size
,
idle_connection_timeout
, body_timeout
, max_body_size
arguments. Added support for HTTPServerConnectionDelegate
instances as request_callback
.
Changed in version 4.1: HTTPServerConnectionDelegate.start_request
is now called with
two arguments (server_conn, request_conn)
(in accordance with the
documentation) instead of one (request_conn)
.
Changed in version 4.2: HTTPServer
is now a subclass of tornado.util.Configurable
.
Changed in version 4.5: Added the trusted_downstream
argument.
Changed in version 5.0: The io_loop
argument has been removed.