H2O is a very fast HTTP server written in C. It can also be used as a library.
- HTTP/1.0, HTTP/1.1
- uses PicoHTTPParser
- persistent connections
- chunked encoding
- HTTP/2
- draft 14
- negotiation methods: NPN, ALPN, Upgrade, direct
- weight-based prioritization
- WebSocket
- uses wslay
- only usable at library level
- TLS
- uses OpenSSL
- forward secrecy
- AEAD ciphers
- session resumption (internal memory)
- static file serving
- conditional GET using last-modified / etag
- directory listing
- mime-type configuration
- reverse proxy
- HTTP/1 only (no HTTPS)
- persistent upstream connection
- access-logging
- apache-like format strings
- graceful restart and self-upgrade
- via Server::Starter
Following softwares are required to build the standalone server. It is likely that you would be possible to find and install them as part of your operation system (by running yum, apt-get, brew, etc. depending on the OS).
Download and extract a source release from here, or clone the Git repository.
Run the commands below. The last command installs h2o
(the standalone server) to usr/local
.
$ cmake -DCMAKE_INSTALL_PREFIX=/usr/local .
$ make
$ sudo make install
First, let's try running the server using a configuration file included in the examples/
directory. The command below invokes the standalone server using examples/h2o/h2o.conf, which directs the server to listen on port 8080. Try accessing http://127.0.0.1:8080/.
$ h2o -c examples/h2o/h2o.conf
Use --help
to print a list of command line options and configuration directives that can be used.
$ ./h2o --help
H2O can also be used as a software library with libuv version 1.0.0. Note that prior versions of libuv cannot be used due to massive changes to the APIs in 1.0.0.
Examples can be found within the examples/ directory.
For the time being, using libh2o as a submodule is the recommend way.
$ cmake .
$ make libh2o
The scores were recorded on Amazon EC2 running two c3.8xlarge instances (server and client) on a single network placement.
note: for reverse-proxy tests, another H2O process running on the same host was used as the upstream server
The scores (requests/second.core) were recorded on Ubuntu 14.04 (x86-64) / VMware Fusion 7.1.0 / OS X 10.9.5 / MacBook Pro 15" Early 2013
HTTP/1.1
Server \ size of content | 6 bytes | 4,096 bytes |
---|---|---|
h2o/0.9.0 | 75,483 | 59,673 |
nginx/1.7.9 (conf) | 37,289 | 43,988 |
note: wrk -c 500 -d 30 -t 1
HTTP/2
Server \ size of content | 6 bytes | 4,096 bytes |
---|---|---|
h2o/0.9.0 (conf) | 272,300 | 116,022 |
tiny-nghttpd (nghttpd @ ab1dd11) | 198,018 | 93,868 |
trusterd @ cff8e15 | 167,306 | 67,600 |
note: h2load -c 500 -m 100 -n 2000000
- Presentation slides at HTTP2 Conference - discusses the design of H2O and the motives behind
- Kazuho's Weblog - the developers weblog (with H2O+in English tag, H2O+日本語 tag)