Nginx 1.25.0 開始支援了 HTTP/3 的技術預覽,我是直到 1.25.3 才開始測試,中間遇到了很多問題先記錄起來。
官方有設定範例 https://nginx.org/en/docs/quic.html , 以下都是我遇到的問題與解法:
-
第一道關卡必須防火牆要打開 443 的 UDP Port , 如果原本跑的加密網站使用非 443 Port ,則對應的 UDP Port 也一併需要打開,因為 HTTP3 協定使用 UDP 來傳輸資料。
-
如果使用 Docker 跑 nginx , 則 Docker 對外 Publish port 也必須打開 SSL 的 UDP Port。
-
Ngnix 必須設定支援 TLS 1.3 , 因為 HTTP/3 只能使用 TLS 1.3
-
在 Nginx Virtual Host 環境下若設定支援 TLS 1.3 , 則必須把第一個 VHost 設定支援 1.3,因為
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
這種設定只有第一個 VHost 會生效,其他的 VHost 都會沿用第一個 VHost 的設定。 -
如果 reverse proxy 到內部的 php-fpm 可能會發生
400 Bad Request
, 經查詢 Log , 可能會是 Header Host 沒有傳進去,我原本是有設定proxy_set_header Host $http_host;
, 這看來失效了,要將 $http_host 直接改為固定字串的 Domain Name ,不曉得這是不是現有版的 bug。 -
測試 HTTP/3 時,先不要用瀏覽器,可以用最新版 curl ,或者開無痕視窗測試,因為 HTTP/3 設定一旦設定錯誤,瀏覽器可能會長時間只使用 HTTP/2 來連線,必須等到 Header 'alt-svc' 裡面指定的 h3 ma 時間過期,才可能再重新嘗試使用 HTTP/3。
那麼一切都沒問題了嗎 ? 很可惜,我的測試環境測試結果是時好時壞,在 HTTP/3 Checker 網站上有時能通過,有時不行,而 curl 測試也是如此,也不曉得是最前面的硬體 FireWall 有問題,還是 nginx 本身有問題。還在努力找出原因。
QUIC 網路不穩的可能原因
因為 QUIC 是走 UDP , 有可能短時間內傳送網頁的併發資料或連線數太多了。
預設 Linux 的核心針對網路的收發緩衝區應該是 208K,可以觀察以下
cat /proc/sys/net/core/rmem_max
cat /proc/sys/net/core/wmem_max
在我的 ubuntu 22.04 或 Proxmox VE host 都是得到 212992 , 我把 Proxmox VE 及虛擬機 Guest 調整為 1048576(1M)
後似乎有改善一些,網路上甚至有教學調整到 20M 的大小。我目前還在觀察調整後能改善程度如何。