README.md
Requirements
------------
Note that in addition to the dependencies required for [building quiche](https://github.com/cloudflare/quiche#building)
you'll also need any dependency that might be required for [building NGINX](https://nginx.org/en/docs/configure.html)
itself.
NGINX will need to be built against BoringSSL, not OpenSSL, to work properly
with quiche. This is done automatically during the build process described below.
Once [OpenSSL merges support for QUIC](https://github.com/openssl/openssl/pull/8797)
it will be possible to build using OpenSSL as well.
Building
--------
The first step is to [download and unpack the NGINX source
code](https://nginx.org/en/download.html). Note that the HTTP/3 and QUIC patch
only works with the 1.16.x release branch (the latest stable release being
1.16.1).
```
% curl -O https://nginx.org/download/nginx-1.16.1.tar.gz
% tar xzvf nginx-1.16.1.tar.gz
```
As well as quiche, the underlying implementation of HTTP/3 and QUIC:
```
% git clone --recursive https://github.com/cloudflare/quiche
```
Next you’ll need to apply the patch to NGINX:
```
% cd nginx-1.16.1
% patch -p01 < ../quiche/nginx/nginx-1.16.patch
```
And finally build NGINX with HTTP/3 support enabled:
```
% ./configure \
--prefix=$PWD \
--build="quiche-$(git --git-dir=../quiche/.git rev-parse --short HEAD)" \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_v3_module \
--with-openssl=../quiche/quiche/deps/boringssl \
--with-quiche=../quiche
% make
```
The (optional) `--build` argument will embed the latest commit hash from the
quiche repository in the NGINX binary, so that it can be retrieved when running
`nginx -V`. The `nginx -V` output can also be provided when submitting bug/issue
requests to help with triage.
```
nginx -V
nginx version: nginx/1.16.1 (quiche-a0e69ed)
built with OpenSSL 1.1.0 (compatible; BoringSSL) (running with BoringSSL)
```
The above command instructs the NGINX build system to enable the HTTP/3 support
(`--with-http_v3_module`) by using the quiche library found in the path it was
previously downloaded into (`--with-quiche=../quiche`).
Running
-------
The following configuration file can be used as a starting point to enable
HTTP/3 support:
```
events {
worker_connections 1024;
}
http {
server {
# Enable QUIC and HTTP/3.
listen 443 quic reuseport;
# Enable HTTP/2 (optional).
listen 443 ssl http2;
ssl_certificate cert.crt;
ssl_certificate_key cert.key;
# Enable all TLS versions (TLSv1.3 is required for QUIC).
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
# Add Alt-Svc header to negotiate HTTP/3.
add_header alt-svc 'h3=":443"; ma=86400';
}
}
```
List of configuration directives
--------------------------------
### http3_max_concurrent_streams
**syntax:** **http3_max_concurrent_streams** *number*;
**default:** *http3_max_concurrent_streams 128;*
**context:** *http*, *server*
Limits the maximum number of concurrent HTTP/3 streams in a connection.
### http3_max_requests
**syntax:** **http3_max_requests** *number*;
**default:** *http3_max_requests 1000;*
**context:** *http*, *server*
Limits the maximum number of requests that can be served on a single HTTP/3
connection, after which the next client request will lead to connection closing
and the need of establishing a new connection.
### http3_max_header_size
**syntax:** **http3_max_header_size** *size*;
**default:** *http3_max_header_size 16k;*
**context:** *http*, *server*
Limits the maximum size of the entire request header list after QPACK decompression.
### http3_initial_max_data
**syntax:** **http3_initial_max_data** *size*;
**default:** *http3_initial_max_data 10m;*
**context:** *http*, *server*
Sets the per-connection incoming flow control limit.
### http3_initial_max_stream_data
**syntax:** **http3_initial_max_stream_data** *size*;
**default:** *http3_initial_max_stream_data 1m;*
**context:** *http*, *server*
Sets the per-stream incoming flow control limit.
### http3_idle_timeout
**syntax:** **http3_idle_timeout** *time*;
**default:** *http3_idle_timeout 3m;*
**context:** *http*, *server*
Sets the timeout of inactivity after which the connection is closed.
### http3_congestion_control
**syntax:** **http3_congestion_control** *name*;
**default:** *http3_congestion_control cubic;*
**context:** *http*, *server*
Sets the congestion control algorithm used.
### http3_pacing
**syntax:** **http3_pacing** *on/off*;
**default:** *http3_pacing off;*
**context:** *http*, *server*
Enables or disables the use of pacing.
List of variables
-----------------
### $http3
"h3" if HTTP/3 was negotiated, or an empty string otherwise.
0-RTT
-----
To support [0-RTT QUIC connection resumption](https://blog.cloudflare.com/even-faster-connection-establishment-with-quic-0-rtt-resumption/)
from the client, you will need the following configuration:
```
http {
server {
...
ssl_early_data on;
ssl_session_ticket_key <file>;
...
}
}
```
Please see
[ssl_session_ticket_key](https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_session_ticket_key)
on how to generate the secret file used for TLS session tickets. This is
required when using multiple worker processes.