您好,登錄后才能下訂單哦!
本篇內容介紹了“如何在Nginx中開啟HTTP3.0的支持”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
對于HTTP3.0,由于整個協議還是處于草案階段,目前來說沒有一個完整的標準,所以各大瀏覽器廠商還只是在開發者版本中才會支持,例如Chrome的金絲雀版本Chrome Canary[1],并且各個服務器廠商也是在持續跟進中,對于Nginx來說,支持HTTP3.0目前有兩種方案可以選擇:
基于此,本文將會以部署nginx-quic的方式來讓Nginx支持HTTP3.0/QUIC。
我們最終的目的是得到nginx-quic版本的nginx可執行文件,需要經過一系列的安裝和編譯,期間可能會遇到很多問題,如果各位讀者不想實際操作,可以直接用我編譯好的版本nginx-quic.linux-x86_64.zip 傳送門[5]。
以centos7為例,下載nginx-quic源碼傳送門[6],下載完成之后,需要進行編譯安裝,由于nginx-quic依賴boringSSL,所以還需下載boringSSL源碼傳送門[7],然后同樣需要編譯安裝boringSSL,執行這些操作之前,需要在linux上安裝一些前置模塊,通過yum來安裝,執行以下命令:
sudo yum install build-essential mercurial psmisc lsb-release cmake golang libunwind-dev git libpcre3-dev zlib1g-dev
對于Nginx來說,在編譯時需要配置對于的SSL庫,不管是HTTP3.0還是HTTP2.0,始終都要基于HTTPS,而加密算法這塊主要有OpenSSL來提供,而BoringSSL是谷歌創建的OpenSSL分支,用于支持TLS1.3的UDP協議0-RTT數據傳輸的加密算法(可以理解成TLS1.3是標準協議,BoringSSL是實現工具),BoringSSL的一些特性會在合適的時機同步給OpenSSl。
cd boringssl-master/
mkdir build
cd build
cmake ../
make
執行之后,可以在build/crypto
,和build/ssl
下獲得對應的文件,如下圖:
注意編譯安裝boringSSL需要使用cmake3以上的版本。
cd nginx-quic/
./auto/configure --prefix=/root/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
執行命令之后,會在/root/nginx
目錄下生成對應的nginx可執行文件,如下圖:
其中,配置文件在conf/
下,nginx命令在sbin/
目錄下。
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"; h4-27=":443";h4-25=":443"; h4-T050=":443"; h4-Q050=":443";h4-Q049=":443";h4-Q048=":443"; h4-Q046=":443"; h4-Q043=":443"'; # Advertise that QUIC is available
}
其中,要求使用TLSv1.3版本,并且當瀏覽器不支持http3時,可以選擇http2。另外,add_header Alt-Svc
添加這個返回頭不可缺少。
由于目前瀏覽器對HTTP3.0/QUIC的支持性有限,可以通過http3check.net/[9]來驗證站點啟用HTTP3是否成功,以我的站點為例:
整個過程看似很簡單,但是真正配置過程中遇到了不少坑,前前后后加上搜索問題花了一天半的時間才真正解決,把這些問題記錄下來,分享給大家。
由于quic協議使用的是UDP的443端口,這個端口對于centos7來說是默認關閉的,可以采用下面命令開啟:
firewall-cmd --zone=public --add-port=443/udp --permanent
如果項目托管在阿里云上,需要更新ECS的安全組策略來對外開啟對應的協議和端口,如下圖:
由于使用了TLS 1.3,所以會修改對應加密算法,但是對于一些瀏覽器而言還不支持這么高的版本,尤其是對于蘋果的Safari,所以,在配置nginx配置文件時,要多配置幾個版本向下兼容,代碼如下:
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
在編譯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
[root@iz2zehmi1ztqtx8tg6ca7gz nginx-quic]#
解決辦法是:
cd nginx-quic\objs
vi Makefile
找到 CFLAGS = -pipe -O -W -Wall -Wpointer-arith -Wno-unused-parameter -Werror -g -I../boringssl-master/include
將-Werror參數去掉。
假如有多個域名需要開啟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 www.nihaoshijie.com.cn default_server;
}
server {
listen 443 ssl http2; # TCP listener for HTTP/2
listen 443 http3; # UDP listener for QUIC+HTTP/3
server_name app.nihaoshijie.com.cn;
}
如果編譯安裝時報類似下面的錯誤,可能是主機的內容不足,需要關閉一些運行的程序來往下進行。
...
c++: internal compiler error: Killed (program cc1plus)
“如何在Nginx中開啟HTTP3.0的支持”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。