Nginx中支持HTTP3.0/QUIC

注意事项:编译安装boringSSL须要使用cmake3以上的版本。

所需安装包 :
nginx http://nginx.org/en/download.html
boringssl https://github.com/google/boringssl
nginx-quic https://hg.nginx.org/nginx-quic

安装依赖模块:

yum install build-essential mercurial psmisc lsb-release cmake golang libunwind-dev git libpcre3-dev zlib1g-dev -y

编译安装boringSSL:

cd boringssl-master/
mkdir build
cd build
cmake ../
make

编译安装nginx-quic:

cd nginx-quic/
./auto/configure --prefix=/nginx --with-http_ssl_module --with-http_v2_module --with-http_v3_module --with-cc-opt="-I../boringssl-master/include" --with-ld-opt="-L../boringssl-master/build/ssl -L../boringssl-master/build/crypto"
make 
make install

修改配置文件,启动nginx:
vi /root/nginx/conf/nginx.conf
添加http3配置:

server {
    listen 443 ssl http2;              # TCP listener for HTTP/2
    listen 443 http3 reuseport;  # UDP listener for QUIC+HTTP/3

    ssl_protocols       TLSv1.3; # QUIC requires TLS 1.3
    ssl_certificate     ssl/www.example.com.crt;
    ssl_certificate_key ssl/www.example.com.key;

    add_header Alt-Svc 'quic=":443"; h3-27=":443";h3-25=":443"; h3-T050=":443"; h3-Q050=":443";h3-Q049=":443";h3-Q048=":443"; h3-Q046=":443"; h3-Q043=":443"'; # Advertise that QUIC is available
}

其中,要求使用TLSv1.3版本,并且当浏览器不支持http3时,可以选择http2。 另外,add_header Alt-Svc添加这个返回头不可缺少。

Alt-Svc 全称为“Alternative-Service”,直译为“备选服务”。该头部列举了当前站点备选的访问方式列表,让服务器可以告诉客户端 “看,我在这个主机的这个端口用这个协议提供相同的服务”。一般用于在提供 “QUIC” 等新兴协议支持的同时,实现向下兼容。

验证HTTP3生效:由于目前浏览器对HTTP3.0/QUIC的支持性有限,可以通过https://http3check.net/来验证站点启用HTTP3是否成功。

开启UDP的443端口:由于quic协议使用的是UDP的443端口,可以采用下面命令开启:

firewall-cmd --zone=public --add-port=443/udp --permanent

TLS版本向下兼容:
由于使用了TLS 1.3,所以会修改对应加密算法,但是对于一些浏览器而言还不支持这么高的版本,尤其是对于苹果的Safari,所以,在配置nginx配置文件时,要多配置几个版本向下兼容,代码如下:

ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
-Werror错误问题:
在编译nginx-quic时,有时会遇到如下错误:

cc -c -pipe  -O -W -Wall -Wpointer-arith -Wno-unused-parameter -Werror -g -I../boringssl-master/include -I src/core -I src/event -I src/event/modules -I src/os/unix -I objs \
 -o objs/src/os/unix/ngx_linux_sendfile_chain.o \
 src/os/unix/ngx_linux_sendfile_chain.c
cc -c -pipe  -O -W -Wall -Wpointer-arith -Wno-unused-parameter -Werror -g -I../boringssl-master/include -I src/core -I src/event -I src/event/modules -I src/os/unix -I objs \
 -o objs/src/event/ngx_event_openssl.o \
 src/event/ngx_event_openssl.c
cc -c -pipe  -O -W -Wall -Wpointer-arith -Wno-unused-parameter -Werror -g -I../boringssl-master/include -I src/core -I src/event -I src/event/modules -I src/os/unix -I objs \
 -o objs/src/event/ngx_event_openssl_stapling.o \
 src/event/ngx_event_openssl_stapling.c
cc -c -pipe  -O -W -Wall -Wpointer-arith -Wno-unused-parameter -Werror -g -I../boringssl-master/include -I src/core -I src/event -I src/event/modules -I src/os/unix -I objs \
 -o objs/src/event/ngx_event_quic.o \
 src/event/ngx_event_quic.c
cc -c -pipe  -O -W -Wall -Wpointer-arith -Wno-unused-parameter -Werror -g -I../boringssl-master/include -I src/core -I src/event -I src/event/modules -I src/os/unix -I objs \
 -o objs/src/event/ngx_event_quic_transport.o \
 src/event/ngx_event_quic_transport.c
src/event/ngx_event_quic_transport.c: In function ‘ngx_quic_create_stream’:
src/event/ngx_event_quic_transport.c:54:9: error: comparison is always true due to limited range of data type [-Werror=type-limits]
      : ((uint32_t) value) <= 16383 ? 2                                        \
         ^
src/event/ngx_event_quic_transport.c:1299:15: note: in expansion of macro ‘ngx_quic_varint_len’
         len = ngx_quic_varint_len(sf->type);
               ^
cc1: all warnings being treated as errors
make[1]: *** [objs/src/event/ngx_event_quic_transport.o] Error 1
make[1]: Leaving directory `/root/nginx-quic'
make: *** [build] Error 2

解决办法是:

cd nginx-quic\objs

vi Makefile

找到 CFLAGS = -pipe -O -W -Wall -Wpointer-arith -Wno-unused-parameter -Werror -g -I…/boringssl-master/include将-Werror参数去掉。

reuseport只需配置一次:
假如有多个域名需要开启http3,则reuseport建议只在根域名上配置,如果一个配置文件中出现多个reuseport,会报错,配置如下:

  server {
        
        listen 443 ssl http2;              # TCP listener for HTTP/2
        listen 443 http3 reuseport;  # UDP listener for QUIC+HTTP/3

        server_name  127.0.0.1 default_server;

    }

    server {

        listen 443 ssl http2;        # TCP listener for HTTP/2
        listen 443 http3;  # UDP listener for QUIC+HTTP/3

        server_name  127.0.0.1;

    }

编译安装时的性能问题:
如果编译安装时报类似下面的错误,可能是主机的内容不足,需要关闭一些运行的程序来往下进行。

...
c++: internal compiler error: Killed (program cc1plus)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值