NGINX开启HTTP3,给web应用提个速

server/2024/12/23 15:41:15/
http://www.w3.org/2000/svg" style="display: none;">

环境说明

  1. linux
  2. docker
  3. nginx版本:1.27

HTTP3/QUIC介绍

https://i-blog.csdnimg.cn/direct/6a949d06be9f47a8a7d789da3a7affac.png" alt="rfc9114" />
HTTP3是由IETF于2022年发布的一个标准,文档地址为:https://datatracker.ietf.org/doc/html/rfc9114

如rfc9114所述,http3>http3主要基于QUIC协议实现,在具备高性能的同时又兼备了可靠性的特点,在大多数场景下可提高web应用的访问速率。
https://i-blog.csdnimg.cn/direct/067acbe93d174e46947594c2e18b6c55.png" alt="quic/http3>http3" />

关于http3>http3和quic的介绍网上资料有很多,这里不再过多赘述。
https://i-blog.csdnimg.cn/direct/181a8f000b54454bb989690ec65b67b1.png" alt="nginx-news-2023" />
nginx的1.25.0版本开始,nginx首次对http3>http3进行了正式支持,这也为我们在WEB服务器上部署http3>http3提供了极大的便利。
https://i-blog.csdnimg.cn/direct/4aaca67cd9d748f1b018fdbd61d40db4.png" alt="nginx-basic" />
本文以重实践角度出发,使用web服务器——NGINX,分享下如何在NGINX中开启HTTP3。

自签证书生成

https://i-blog.csdnimg.cn/direct/412c7f5d92174c869f602ee1fb528180.png" alt="nginx-http3>http3-quic" />
http3>http3必须依赖于TLS协议,所以需要要证书。本文为了演示方便,使用自签证书来进行操作。

自签证书仅用于验证或内网环境,生产环境需要使用公共证书,免费的有:certbot(Let’s Encrypt)

自签证书并部署到NGINX中,主要流程为:

  1. 生成CA证书,root_certificate
  2. 使用CA证书生成NGINX服务器所需要的网站证书,site_certificate
  3. 将site_certificate配置到nginx

自签CA证书生成

#1.生成根证书私钥
openssl genpkey -algorithm RSA -out root_private_key.pem -pkeyopt rsa_keygen_bits:4096#2.使用私钥创建CSR(证书签名请求)
openssl req -new -key root_private_key.pem -out root_csr.pem -subj "/C=CN/ST=SiChuan/L=ChengDu/O=HaiyangGroup/CN=HaiyangRootCA"
#如上面命令报Can't load /root/.rnd into RNG,可使用openssl rand -writerand ~/.rnd修复#3.创建CA配置文件
vim v3_ca.cfg
---
[v3_ca]
basicConstraints = CA:TRUE
keyUsage = keyCertSign, cRLSign
---
#4.生成根证书,依赖CSR和CA配置文件
openssl x509 -req -days 3650 -in root_csr.pem -signkey root_private_key.pem -out root_certificate.pem -extensions v3_ca.cfg

https_50">站点https证书生成

#1.生成站点私钥
openssl genpkey -algorithm RSA -out site_private_key.pem -pkeyopt rsa_keygen_bits:2048
#2.生成站点CSR(证书签名请求),CN填写为对应的域名
openssl req -new -key site_private_key.pem -out site_csr.pem -subj "/C=CN/ST=SiChuan/L=BaZhong/O=HaiyangCompany/CN=www.puhaiyang.com"
#3.编写服务,alt_names部分修改为对应的域名和ip
vim site_openssl.cnf
---
[v3_req]
keyUsage = digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1 = www.puhaiyang.com
DNS.2 = *.puhaiyang.com
IP.1 = 192.168.31.174
————————————————
#4.生成站点https证书,依赖CA证书、CA私钥、站点CSR
openssl x509 -req -in site_csr.pem -CA root_certificate.pem -CAkey root_private_key.pem -CAcreateserial -out site_certificate.pem -days 3650 -extensions v3_req -extfile site_openssl.cnf
---

生成的CA证书与站点证书文件列表如下:
https://i-blog.csdnimg.cn/direct/9313401114394efa88834ecca07303a7.png" alt="site_ssl" />

验证根证书

#1.验证CA根证书
openssl x509 -in root_certificate.pem -text -noout
#2.验证站点证书
openssl x509 -in site_certificate.pem -text -noout

nginxhttp3>http3_84">nginx-http3>http3配置与运行

nginx_85">nginx基础配置

# 创建挂载目录
mkdir -p /data/docker/nginx/conf
mkdir -p /data/docker/nginx/log
mkdir -p /data/docker/nginx/html
mkdir -p /data/docker/nginx/certs
# 生成临时容器,
docker run --name nginx -d nginx
# 验证nginx是否开启了http3>http3,查看有http_v3
docker exec -it nginx nginx -V
# 将容器nginx.conf文件复制到宿主机
docker cp nginx:/etc/nginx/nginx.conf /data/docker/nginx/conf/nginx.conf
# 将容器conf.d文件夹下内容复制到宿主机
docker cp nginx:/etc/nginx/conf.d /data/docker/nginx/conf/conf.d
# 将容器中的html文件夹复制到宿主机
docker cp nginx:/usr/share/nginx/html /data/docker/nginx/
# 关闭该临时容器
docker stop nginx
# 删除该临时容器
docker rm nginx

验证nginx时截图如下,需要确保nginx编译参数中开启了http3>http3

docker exec -it nginx nginx -V
https://i-blog.csdnimg.cn/direct/9eb6401212874f509a38a1db6d3f5952.png" alt="http3>http3_nginx" />

nginx_111">nginx运行与站点配置

将生成的站点证书放到/data/nginx/certs目录下

cp site_private_key.pem /data/docker/nginx/certs/
cp site_certificate.pem /data/docker/nginx/certs/
#赋权限,确保有读取权限
chmod +r /data/docker/nginx/certs/*

创建nginx的站点配置

vi /data/docker/nginx/conf/conf.d/www.puhaiyang.com.conf
---
server {# http/3listen 443 quic reuseport;# http/2 and http/1.1listen 443 ssl;http2 on;server_name www.puhaiyang.com;  # customize to match your domain# you need to mount these files when running this containerssl_certificate     /usr/share/nginx/certs/site_certificate.pem;ssl_certificate_key /usr/share/nginx/certs/site_private_key.pem;# TLSv1.3 is required for QUIC.ssl_protocols TLSv1.2 TLSv1.3;# 0-RTT QUIC connection resumptionssl_early_data on;# Add Alt-Svc header to negotiate HTTP/3.add_header alt-svc 'h3=":443"; ma=86400';# Sent when QUIC was usedadd_header QUIC-Status $http3>http3;location / {root   /usr/share/nginx/html;index  index.html index.htm;}
}

更多详细配置可参考:https://nginx.org/en/docs/http/ngx_http_v3_module.html

nginxdocker_159">运行nginx-docker

因为http3>http3基于QUIC协议,QUIC又基于UDP协议,在运行nginx的docker时记得将https的UDP端口也暴露到主机中。

docker run \
-p 80:80 -p 443:443 -p 443:443/udp \
--name nginx \
-v /data/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /data/docker/nginx/conf/conf.d:/etc/nginx/conf.d \
-v /data/docker/nginx/log:/var/log/nginx \
-v /data/docker/nginx/html:/usr/share/nginx/html \
-v /data/docker/nginx/certs:/usr/share/nginx/certs \
-e TZ=Asia/Shanghai \
--restart=always \
-d nginx:latest

验证时可使用netstat查看udp端口是否正确被暴露,示例截图:
https://i-blog.csdnimg.cn/direct/a7c6a2b615c348c49f0029b42ef1654c.png" alt="netstat" />

输入nginx -v命令查看使用的nginx版本是否为较高版本的nginx

docker exec -it nginx nginx -v
https://i-blog.csdnimg.cn/direct/2c1e1f5d373d407c897b32382f1b74a6.png" alt="nginx-v" />

浏览器验证

nginx搭建好后,就可以使用浏览器进行验证了。

浏览器支持QUIC验证

验证前,需要确保浏览器(客户端)支持http3>http3.0,可访问https://quic.nginx.org/进行验证。
https://i-blog.csdnimg.cn/direct/8bfd77173c624087a2f605b4453f8460.png" alt="quic-test" />

如提示支持quic,或quic包验证也通过,则说明客户端是支持http3>http3的
https://i-blog.csdnimg.cn/direct/f7288d5d46f1443bb9832961de3818c7.png" alt="browser" />

如不支持,可使用https://quic.nginx.org/提供的排查项进行逐步排查。

导入自签CA根证书到客户主机(可选)

如果是站点的tls证书是由自签ca证书生成的,为了让浏览器访问网站更优雅,可让先CA根证书导入到客户端系统中。
以本例为例,则需要导入的证书文件为:root_certificate.pem
在windows中打开certmgr.msc,将证书导入到受信任的根证书颁发机构即可
https://i-blog.csdnimg.cn/direct/24c5b4d9b72b456191dc9fc862d1760c.png" alt="certmgr" />

http3>http3_197">访问自定义的http3>http3站点

在浏览器中通过ip或域名访问搭建的站点。如本例中的:https://www.puhaiyang.com
(自定义虚拟域名需修改hosts文件)
https://i-blog.csdnimg.cn/direct/b6b3e103d61743e39f4ed70d7d599b78.png" alt="browser-nginx-check" />
打开浏览器的检查功能,查看http请求协议是否为http/3。

还可以通过wireshark抓包进行验证
https://i-blog.csdnimg.cn/direct/27a3e8eef2b24785843aa53187b0b041.png" alt="wireshark-quic" />
抓包协议栏显示为QUIC,则证明nginx配置http3>http3成功啦~


下篇文章将使用实例,结合理论与实践,对比分析下http1.1、http2、http3>http3在实际场景下的性能差别。


http://www.ppmy.cn/server/114241.html

相关文章

《Cloud Native Data Center Networking》(云原生数据中心网络设计)读书笔记 -- 10数据中心中的BGP

本章解答以下问题: ASN,团体(community),属性(attribute),最佳路径这些BGP术语是什么疑似?在数据中心中应该使用eBGP还是iBGP?在数据中心使用BGP时,应采用什…

pip 安装torch慢

背景:安装torch. pip3 install torch 速度非常慢。 解决办法: 1、 使用清华源安装: pip3 install torch -i https://pypi.tuna.tsinghua.edu.cn/simple2、其他源也行: https://pypi.mirrors.ustc.edu.cn/simple/</

RedisStack十部曲之二:Redis的核心概念

文章目录 键空间修改和查询键键过期遍历键空间 客户端缓存在计算机科学中有两个难题客户端缓存的Redis实现跟踪模式的工作机制统一的键命名空间 两种连接方式缓存策略Opt-in 模式Opt-out 模式广播模式NOLOOP选项避免竟态条件当与服务器失去连接怎么办什么值得缓存 流水线请求/响…

沃尔玛活跃卖家一年内增长50%,突破15万!沃尔玛新店铺如何快速出单?

随着美国电商市场竞争日益激烈&#xff0c;沃尔玛正在迅速崛起成为亚马逊的强劲对手。据最新财报显示&#xff0c;2024年第二季度&#xff0c;沃尔玛的全球广告收入增长了26%&#xff0c;其中专注于美国市场的Walmart Connect更是取得30%的增长&#xff0c;这一成绩已经超越了其…

MIT线性代数

本文链接的原创作者为 浊酒南街https://blog.csdn.net/weixin_43597208 第1讲 MIT_线性代数笔记&#xff1a;第 01 讲 行图像和列图像-CSDN博客 第2讲 MIT_线性代数笔记&#xff1a;第 02 讲 矩阵消元_矩阵first pivot-CSDN博客 第3讲 MIT_线性代数笔记&#xff1a;第 03…

Redis 主从复制、切片集群

一、主从复制 1、主从关系 都说的 Redis 具有高可靠性&#xff0c;这里有两层含义&#xff1a;一是数据尽量少丢失&#xff0c;二是服务尽量少中断。AOF 和 RDB 保证了前者&#xff0c;而对于后者&#xff0c;Redis 的做法就是将一份数据同时保存在多个实例上。为了保证数据一致…

在 Ubuntu 上安装 Jenkins,并配置 SSH Server 插件

文章目录 在 Ubuntu 上安装 Jenkins,并配置 SSH Server 插件及实战案例1. 安装 Jenkins步骤 1:更新系统步骤 2:安装 Java步骤 3:添加 Jenkins 仓库并安装步骤 4:启动 Jenkins 服务步骤 5:打开 Jenkins 界面2. 安装 SSH Server 插件步骤 1:安装 SSH Server 插件步骤 2:配…

Python+Jenkins自动化测试持续集成

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 Jenkins安装 Jenkins是一个开源的软件项目&#xff0c;是基于java开发的一种持续集成工具&#xff0c;用于监控持续重复的工作&#xff0c;旨在提供一个开放易用…