Openresty 支持HTTP/3协议和QUIC配置
0x01 HTTP/3.0协议说明
2012 年,Google 就设计出了QUIC协议,在浏览器以及服务器端服务上部署并实现。2021 年 5 月, IETF在RFC 9000中对 QUIC 进行了标准化。2022 年 6 月 7 日,HTTP/3 被标准化为 RFC 9114。
快速 UDP 网络连接(QUIC)是一种通用传输层协议,旨在通过其灵活性、内置的安全防护、较少的性能问题以及更快的采用率来取代传输控制协议(TCP)。QUIC 最初由谷歌开发,采用用户数据协议(UDP)作为在客户端和服务器之间移动数据包的低级别传输机制。另外值得注意的是,QUIC 集成了传输层安全防护(TLS),将其作为一个集成组件,而不是像 HTTP/1.1 和 HTTP/2 那样将其作为一个附加层。
基于 QUIC 的 HTTP/3 是超文本传输协议(HTTP)的第三个主要版本,于 2022 年被采纳为 IETF 标准。创建 QUIC+HTTP/3 是为了解决 TCP 固有的性能限制和用户体验的问题。QUIC协议解决了队头阻塞问题,以及缩短建立连接的时间。
0x02 Openresty安装
注意:Openresty1.25.1后才支持HTTP3.0.
1.安装openresty
sudo yum install yum-utilssudo yum-config-manager --add-repo https://openresty.org/package/centos/openresty.repo
修改 vim /etc/yum.repos.d/openresty.repo
2.安装运行
sudo yum install openrestysudo systemctl start openrestysudo systemctl enable openresty
0x03 支持HTTP3.0配置
1.准备好域名及域名ssl证书
2.验证是否支持HTTP3.0
3.增加虚拟主机配置
配置如下
server { listen 443 quic reuseport; # 配置支持quic协议 listen 443 ssl; http3 on; http2 on; server_name xx.xxx.com; #域名 #ssl on; ssl_certificate xx.xxx.crt; ssl_certificate_key xx.xxx.key; ssl_session_cache shared:SSL:10m; ssl_session_timeout 120m; ssl_protocols TLSv1.3 TLSv1.2; #http3使用TLSV1.3协议 ssl_ciphers HIGH:!RC4:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!EXP:+MEDIUM; ssl_prefer_server_ciphers on; add_header Alt-Svc \'h3=\":443\"; ma=2592000\'; #头部增加header location / { root /home/workspace/frontend/dist; index index.html; if (!-e $request_filename) { rewrite ^/(.*)$ /index.html last; } }}
4.检验生效
openresty -topenresty -s reload
5.检查端口生效
lsof -i:443
可以看到有有UDP协议
nginx 1176 root 10u IPv4 118939904 0t0 UDP *:https nginx 870027 www 11u IPv4 118939905 0t0 UDP *:https nginx 870028 www 12u IPv4 118939906 0t0 UDP *:https nginx 870029 www 13u IPv4 118939907 0t0 UDP *:https nginx 870026 www 10u IPv4 118939904 0t0 UDP *:https
0x04访问检查
1.Chrome浏览器配置
注意:浏览器可能默认没有打开QUIC和HTTP3.0支持,需要手动打开,
打开方式,浏览器地址栏
chrome://flags
把这两个参数打开Enabled
Experimental QUIC protocolWebTransport Developer Mode
设置好后,需要重启浏览器。
2.打开网站访问
按F12打开调试模式,刷新页面,可以看到Network请求的Protocol变成了h3
FAQ:配置了浏览器未生效
如果是云服务器,需要打开UDP443端口的访问限制,服务器如果设置了防火墙也需要打开。