Nginx HTTP3.0/QUIC 编译及配置指南

在最新的 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

 

作者: Su

等待完善