筆記 : nginx 1.25.X HTTP/3 設定的一些雷

Nginx 1.25.0 開始支援了 HTTP/3 的技術預覽,我是直到 1.25.3 才開始測試,中間遇到了很多問題先記錄起來。

官方有設定範例 https://nginx.org/en/docs/quic.html , 以下都是我遇到的問題與解法:

  1. 第一道關卡必須防火牆要打開 443 的 UDP Port , 如果原本跑的加密網站使用非 443 Port ,則對應的 UDP Port 也一併需要打開,因為 HTTP3 協定使用 UDP 來傳輸資料。

  2. 如果使用 Docker 跑 nginx , 則 Docker 對外 Publish port 也必須打開 SSL 的 UDP Port。

  3. Ngnix 必須設定支援 TLS 1.3 , 因為 HTTP/3 只能使用 TLS 1.3

  4. 在 Nginx Virtual Host 環境下若設定支援 TLS 1.3 , 則必須把第一個 VHost 設定支援 1.3,因為 ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3; 這種設定只有第一個 VHost 會生效,其他的 VHost 都會沿用第一個 VHost 的設定。

  5. 如果 reverse proxy 到內部的 php-fpm 可能會發生 400 Bad Request , 經查詢 Log , 可能會是 Header Host 沒有傳進去,我原本是有設定 proxy_set_header Host $http_host; , 這看來失效了,要將 $http_host 直接改為固定字串的 Domain Name ,不曉得這是不是現有版的 bug。

  6. 測試 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 的大小。我目前還在觀察調整後能改善程度如何。

發佈留言