我们已经创建了一个用于将Web服务器支持HTTP/3的Docker镜像,以Nginx作为反向代理
我想做的事情 (wǒ zuò de
我想将我喜欢的Web服务器升级为HTTP/3。
HTTP/3正在逐渐在Google、Cloudflare等地使用,并且在HTTP/3中,通信是通过UDP进行的,可以比HTTP/1.x和HTTP/2更快地进行通信。有关详细信息,可以参考「HTTP/3が出るらしいという話を雑に書く – Qiita」等资料。
本次我们将Nginx + HTTP/3转化为Docker镜像,让HTTP/3的支持即刻变得更加简便。同时,我还打算提供一个能够轻松支持HTTP/3的Docker Compose示例。
Cloudflare Quiche 云锁
目前,Cloudflare公司发布了一个名为Quiche的OSS,用于支持QUIC和HTTP/3,该公司已在CDN、1.1.1.1和Warp等方面发挥了重要作用。Cloudflare官方发布了一篇关于让Nginx支持HTTP/3的文章,在此基础上我们创建了相应的Docker镜像。
Nginx和HTTP/3的Docker镜像
可以通过 docker pull nwtgck/nginx-http3 命令获取到 Docker 镜像。
Dockerfile 的内容可以在 https://github.com/nwtgck/docker-nginx-http3/blob/master/Dockerfile 找到。
该 Dockerfile 是基于 cloudflare/quiche 的(quiche/extras/nginx at master)描述,在官方的 GitHub 上创建的 Nginx + HTTP/3。
例:运行docker
以下是一个使用docker run启动的示例。
在当前目录下创建以下nginx.conf文件。
worker_processes 1;
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 /etc/ssl/certs/server.crt;
ssl_certificate_key /etc/ssl/private/server.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-23=":443"; ma=86400';
}
}
在HTTP/3中,为了使用UDP,我们还需要通过-p 443:443/udp命令来开放UDP端口。
docker run -it -p 443:443 -p 443:443/udp \
-v $PWD/nginx.conf:/usr/local/nginx/conf/nginx.conf \
-v /etc/letsencrypt/live/nwtgck-nginx-http3.tk/fullchain.pem:/etc/ssl/certs/server.crt \
-v /etc/letsencrypt/live/nwtgck-nginx-http3.tk/privkey.pem:/etc/ssl/private/server.key \
nwtgck/nginx-http3
以上是指定了Let’s Encrypt证书。请确保正确指定了…/fullchain.pem和…/privkey.pem两个文件的存在。起初我想在本地环境使用自签名证书,但后来在下文提及的Chrome浏览器中无法进行HTTP/3的确认,所以决定使用Let’s Encrypt。
要将喜欢的Web服务器设置为反向代理并支持HTTP/3,可以进行以下操作:
只需提供一种选择 :
根据上述,我认为我们可以自由地编写nginx.conf,并使用location / {proxy_pass …}等进行反向代理的设置。
使用docker run –net=host …来启动,可以创建一个反向代理,用于运行在主机环境中的其他Web服务器。
关于使用Docker Compose进行反向代理的示例将在后面提到。
确认是否支持HTTP/3。
通过使用Cloudflare官方博客《HTTP/3: 过去、现在和未来》中提到的方法来确认HTTP/3的支持。在Chrome Canary中加上–enable-quic –quic-version=h3-23标志来启动。
Mac用户可以使用以下命令启动:
/Applications/Google\ Chrome\ Canary.app/Contents/MacOS/Google\ Chrome\ Canary --enable-quic --quic-version=h3-23
使用Chrome Canary的版本号为80.0.3959.0 (官方版) canary (64位)。如果想要在命令行界面而不是图形界面的Chrome Canary中进行确认,可以尝试以下方法:
http3-client – HTTP/3 文档。
使用Docker Compose的示例
HTTP/3的兼容由名为Ghost的开源博客平台提供支持。您可以在https://hub.docker.com/_/ghost/找到Docker镜像发布版本。
我在这个GitHub仓库https://github.com/nwtgck/ghost-nginx-http3-docker-compose中创建了一个示例。
只有docker-compose.yml和nginx.conf的简单配置,内容如下:
version: '3.1'
services:
nginx:
image: nwtgck/nginx-http3
ports:
- '80:80'
- '443:443'
- '443:443/udp'
depends_on:
- ghost
restart: always
volumes:
- ./nginx.conf:/usr/local/nginx/conf/nginx.conf
# 適切に証明書のパスを指定してください。
- /etc/letsencrypt/live/nwtgck-nginx-http3.tk/fullchain.pem:/etc/ssl/certs/server.crt
- /etc/letsencrypt/live/nwtgck-nginx-http3.tk/privkey.pem:/etc/ssl/private/server.key
ghost:
image: ghost
restart: always
expose:
- "2368"
worker_processes 1;
events {
worker_connections 1024;
}
http {
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://ghost:2368;
}
}
server {
# Enable QUIC and HTTP/3.
listen 443 quic reuseport;
# Enable HTTP/2 (optional).
listen 443 ssl http2;
ssl_certificate /etc/ssl/certs/server.crt;
ssl_certificate_key /etc/ssl/private/server.key;
# Enable all TLS versions (TLSv1.3 is required for QUIC).
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
location / {
proxy_pass http://ghost:2368;
}
# Add Alt-Svc header to negotiate HTTP/3.
add_header alt-svc 'h3-23=":443"; ma=86400';
}
}
在我自己的环境中尝试的方法
# リポジトリをクローンする
git clone https://github.com/nwtgck/ghost-nginx-http3-docker-compose.git
cd ghost-nginx-http3-docker-compose
<docker-compose.ymlの...fullchain.pemと...privkey.pemのパスを適切に書き換える>
# サーバーを起動する
docker-compose up
給予额外的增值礼品。
我分享了一些为了构建Nginx + HTTP/3以及将其打包为Docker镜像而遇到的一些困难 – nwtgck / 太田涼所做的事情。