在最新的 Web 服务器软件 Nginx 1.25.0 主线版本中,提供了 HTTP 3.0/QUIC 协议的官方正式支持,采用新的握手方式和UDP协议传输后,能极大的提高网站访问速度 特别是远距离跨境传输体验, 因目前可参考的配置资料不多,本文将简单讲解下其编译及配置方法.
1. 环境要求
操作系统: RHEL/CentOS/Rocky 7/8/9 或 Ubuntu 20.02 /22.02 LTS 均可
SSL 支持: QUIC 需要新的SSL库支持,BoringSSL , LibreSSL, QuicTLS, OpenSSL 1.1.1 ( Nginx 1.25.1 开始支持) 四选一即可.
验证版本: CentOS 7.9 2207, Nginx 1.25.1 , OpenSSL 1.1.1u 和 LibreSSL 3.7.2
客户端: Chrome 83/Firefox 88 版本后的浏览器默认已提供HTTP3支持.
2. 安装说明
yum 安装编译所需要软件包( CentOS7 最小化环境 , openssl开发包非必须 )
yum install -y wget gcc make pcre-devel zlib-devel openssl-devel
CentOS7 自带 OpenSSL 1.0.2K 版本过低, 以下提供 OpenSSL 1.1.1t 或 LibreSSL 3.7.2 两种配置方法,新版 Nginx 在编译时, SSL 库可以作为扩展插件静态编译进Bin文件,也可以作为DSO动态加载,目前很多软件都会用到SSL库,版本碎片化管理也是很棘手的问题,可根据实际情况来选择,推荐使用静态编译方式.
安装方法1:将SSL库作为插件静态编译进 nginx (推荐方式)
# 下载解压 Openssl 1.1.1t 或 LibreSSL 3.7.2
wget https://www.openssl.org/source/old/1.1.1/openssl-1.1.1t.tar.gz tar zxf openssl-1.1.1t.tar.gz 或者 wget https://ftp.openbsd.org/pub/OpenBSD/LibreSSL/libressl-3.7.2.tar.gz tar zxf libressl-3.7.2.tar.gz
# 下载解压 nginx , 配置指定的SSL库源码路径后编译安装.
wget http://nginx.org/download/nginx-1.25.1.tar.gz tar zxf nginx-1.25.1.tar.gz cd nginx-1.25.1/ ./configure --prefix=/usr/local/nginx \ --with-http_v2_module \ --with-http_v3_module \ --with-http_stub_status_module \ --with-http_ssl_module \ --with-http_sub_module \ --with-http_realip_module \ --with-openssl=../openssl-1.1.1u make -j 4 && make install
# 安装到 /usr/local/nginx 如有其它参数自行调整, 参数 --with-http_v3_module 开启HTTP3支持, 如果使用 libressl 3.7.2 改为 --with-openssl=../libressl-3.7.2
安装方法2: 单独安装 SSL库,给Nginx 传递 ld-opt ,cc-opt 参数让其编译调用.
# 下载解压 编译安装OpenSSL 1.1.1t 或 LibreSSL 3.7.2 到 /usr/local/ 路径下
wget https://www.openssl.org/source/old/1.1.1/openssl-1.1.1t.tar.gz tar zxf openssl-1.1.1t.tar.gz cd openssl-1.1.1t ./config --prefix=/usr/local/openssl make -j 4 && make install 或者 wget https://ftp.openbsd.org/pub/OpenBSD/LibreSSL/libressl-3.7.2.tar.gz cd libressl-3.7.2/ ./config --prefix=/usr/local/libressl make -j 4 && make install
# 下载并解压配置 nginx 参数, 指定SSL头文件和动态库路径后编译安装.
wget http://nginx.org/download/nginx-1.25.1.tar.gz tar zxf nginx-1.25.1.tar.gz cd nginx-1.25.1/ ./configure --prefix=/usr/local/nginx \ --with-http_v2_module \ --with-http_v3_module \ --with-http_stub_status_module \ --with-http_ssl_module \ --with-http_sub_module \ --with-http_realip_module \ --with-cc-opt="-I/usr/local/openssl/include" \ --with-ld-opt="-L/usr/local/openssl/lib" make -j 4 && make install
# 安装到 /usr/local/nginx 如有其它参数自行调整, with-http_v3_module 参数启用HTTP3 , with-cc-opt/ld-opt 指定使用 SSL库头文件和动态库路径.如果使用libressl 库,改为以下路径.
--with-cc-opt="-I/usr/local/libressl/include" \
--with-ld-opt="-L/usr/local/libressl/lib"
# 配置 SSL 库搜索路径
编译安装的SSL库在 /usr/local/***/lib 路径下,需要往系统添加LD搜索路径,否则Nginx 找不到 libssl.so 文件. 如果使用的libressl 将路径中的 openssl 替换掉 .
echo "/usr/local/openssl/lib" >> /etc/ld.so.conf ldconfig ldconfig -p | grep openssl
# 查看版本信息, 注意确认返回的SSL库版本信息
/usr/local/nginx/sbin/nginx -V nginx version: nginx built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) built with OpenSSL 1.1.1t 7 Feb 2023 TLS SNI support enabled configure arguments: --prefix=/usr/local/nginx --with-http_v2_module --with-http_v3_module
3. 配置说明
Nginx 站点主机可参考以下配置文件,关键部分已给出说明.
server { # IPV4 端口监听 同时启用http 80, http1/2 443, http3 443 listen 80; listen 443 ssl; listen 443 quic reuseport; # IPV6 端口监听 listen [::]:80; listen [::]:443 ssl; listen [::]:443 quic reuseport; # HTTP2, HTTP3开关, HTTP3协议协商(从1.25.1开始支持) http2 on; http3 on; http3_hq on; # 站点主机名主目录 server_name sulabs.net www.sulabs.net; root /data/www/sulabs; # 站点SSL证书 ssl_certificate /usr/local/nginx/conf/vhosts/site_ssl.pem; ssl_certificate_key /usr/local/nginx/conf/vhosts/site_ssl.key; # 开启的SSL协议 ( HTTP3/QUIC需要 TLS 1.3支持 ) ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # 添加 Alt-Svc HTTP头用于 HTTP3 协商 (注意:443 是端口) add_header Alt-Svc 'h3=":443"; ma=86400'; # 添加 X-protocol HTTP头用于测试验证 HTTP3 add_header X-protocol $server_protocol always; # 使用 0-RTT 快速连接 ssl_early_data on; ssl_session_tickets on; location / { #其它配置,略... } }
测试验证: 浏览器F12 调试,状态栏右键勾选协议,可看到已开启HTTP3请求头中,能看到添加的 Alt-Svc 和 X-Protocol 头属性.
4. 排错思路
(1) HTTP3 配置并使用的端口,需要在防火墙中同时打开TCP和UDP端口.
(2) quic reuseport 端口复用 目前暂不支持多站点, 第二个开始要去掉 reuseport 参数
(3) 第三方的HTTP3检测网站 https://http3check.net/ 可协助排错.
原创文章,创作不易,转载请注明出处.
参考网站:
https://nginx.org/en/docs/http/ngx_http_v3_module.html
https://nginx.org/en/docs/quic.html
评论关闭。