隆重介紹NGINX Plus R32

當同樣的證書在大量不同的location使用的時候,NGINX Plus R32在載入時間方面有重大改進。 NGINX Plus R32 還引入了一個全新模組,用來有效地將基於多種協定的流量路由到其它模組。 閱讀本文,瞭解更多 NGINX Plus R32 的新增特性。

很高興宣布推出NGINX Plus Release 32 (R32)。 NGINX Plus 是基於NGINX 開源版建置而成的,是唯一一款將軟體Web 伺服器、負載平衡器、反向代理、內容快取和API 閘道集於一身的多合一產品。

NGINX Plus R32 的新增和增強特性包括:

  • SSL 憑證快取- 對於具有大量location 程式碼區塊和重複SSL 憑證/金鑰對的配置,NGINX Plus R32 對NGINX 啟動時間和記憶體使用率進行了重大改進。
  • Stream_pass 模組- NGINX Plus R32 現在支援stream 模組充當路由器,允許有條件地將連接從stream 模組轉送到http、mail 等其他模組,或轉回stream 模組本身。
  • NGINX Plus 官方容器鏡像– 隨NGINX Plus R32 發布了適用於特權和非特權容器運行時的NGINX Plus 官方容器鏡像。上述兩種部署方法都隨附了可選的容器鏡像,其中包括NGINX Agent —— 這是一個配套守護進程,支援無縫整合NGINX 管理平面解決方案。

此外,該版本還包括從NGINX 開源版繼承的新功能和漏洞修復,以及NGINX JavaScript 模組的更新。

重要行為變更

附註:如果您不是從NGINX Plus R31 升級至NGINX Plus R32,請務必查看先前公告部落格中的「重要行為變更」部分,以了解目前版本和最新版本之間所有版本的演變過程。

棄用OpenTracing 模組

NGINX Plus R18 中引入的OpenTracing 模組即將被棄用,並計劃在NGINX Plus R34 中移除。但在此之前,相關模組包將包含在所有NGINX Plus 版本中。我們強烈建議,將所使用的OpenTracing 模組替換為NGINX Plus R29中引入的OpenTelemetry 模組

移除ModSecurity 模組

鑑於ModSecurity 模組已於2024 年3 月31 日停服,NGINX Plus 倉庫現已刪除modsec 模組包,並且今後將不再提供。

PGP 金鑰更新

NGINX 開源版和NGINX Plus 軟體包使用PGP 金鑰進行簽署。此密鑰將於2024 年6 月16 日到期。我們更新了金鑰的有效期,以便在2024 年6 月16 日之後繼續驗證現有軟體包。對於即將發布的版本,我們將產生新的金鑰對,用於對軟體包進行簽署。

所有NGINX 用戶都應按照以下步驟下載並安裝更新的PGP 金鑰:

Ubuntu/Debian:

wget -qO - https://nginx.org/keys/nginx_signing.key | gpg --dearmor | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null

RHEL/CentOS:

sudo rpm -e gpg-pubkey-7bd9bf62-5762b5f8
sudo rpm --import https://nginx.org/keys/nginx_signing.key

2024 年6 月16 日之後,若不更新金鑰,您將無法驗證軟體簽章。

未來打包發布政策

在未來的NGINX Plus 版本中,我們將簡化打包和發布政策。 NGINX Plus 將僅在支援的作業系統發行版的最新版本上進行建置和測試。當在舊版發行版上安裝NGINX Plus 時,軟體套件管理器可能會建議您更新依賴程式庫和軟體套件。

平台支援的變更

此版本對支援的平台做了以下更改。

全新作業系統支援:

  • Ubuntu 24.04

不再支援的舊版作業系統:

  • FreeBSD 12,已於2023 年12 月31 日停服

以下舊版作業系統已棄用並計劃在NGINX Plus R33 中移除:

  • CentOS7/RHEL7/Oracle Linux 7
  • Alpine Linux 3.16

新增特性詳情

透過SSL 憑證快取改善NGINX 載入行為

以前,每次在NGINX 配置中引用憑證、金鑰或憑證撤銷清單時,NGINX 都會載入該清單。這意味著對同一物件的多次引用會導致該物件被重新載入多次。在繼承受信任憑證清單等指令時,這種延遲會變得更加嚴重。在某些情況下,該行為會嚴重影響NGINX 的啟動時間,並可能需要大量記憶體來儲存配置。

在新行為模式下,SSL 指令現在會引用快取的憑證檔案和相關物件。這樣一來,重複引用同一憑證物件的配置所需的記憶體空間和載入時間將大大減少。在涉及大型NGINX 配置的情況下,這種優勢最為明顯,因為在大量location 程式碼區塊中只需引用一小部分受信任憑證。

下圖顯示了配置約5400 個location 程式碼區塊(頂層和巢狀)和878 個憑證的NGINX 的載入時間改善情況。

請注意,在圖表右側,載入時間明顯減少。在新行為模式下,平均載入時間從更改前的約40 秒減少到約6 秒。

將連接從Stream 模組轉送到其他模組

NGINX Plus R32 繼承了NGINX 開源版1.25.5的一個特性,進一步提升了NGINX 的可設定性。具體來說,NGINX stream模組現在可以發揮路由器的作用,作為代理將連接從stream 上下文轉發到其他上下文(例如http、mail)或stream 上下文本身中的單獨虛擬伺服器。

這項功能作為此版本中引入的ngx_stream_pass_module 模組的一部分提供。 此模組執行一個指令“pass”,可用於指定客戶端連線轉送的目標位址-既可透過IP 位址和連接埠組合、套接字路徑指定,也可由NGINX 變數引用。

有了這項功能,希望透過單一四層端點運行所有流量的客戶現在能夠終止四層stream 上下文中的SSL 連接,並將其轉發給其他模組(http、mail)或stream 上下文中的其他虛擬伺服器。此外,您還可根據伺服器名稱或協定有條件地終止SSL 連接,同時將其餘流量代理到其他位置。這為管理來自單一端點的流量解鎖了新的配置可能性。

下面的設定碼片段會終止stream 模組中的SSL 連接,並根據請求的伺服器名稱,有條件地將這些連接轉送給http 上下文或stream 上下文中的另一台虛擬伺服器。

http {
    server {
        listen 8000;

        location / {
            return 200 foo;
        }
    }
}

stream {
	 map $ssl_server_name $pass_port {
		foo.example.com 8000;
		default 9001;
	
	}

    server {
        listen 9000 ssl;

        ssl_certificate     domain.crt;
        ssl_certificate_key domain.key;

        pass 127.0.0.1:$pass_port;
    }
	server{
		listen 9001;
		return bar\n;
	}

}

在本例中,所有SSL 連線均在stream server 程式碼區塊中終止。根據傳入請求中的伺服器名稱,連線要麼被轉送到監聽8000 連接埠的http 伺服器,要麼被轉送到監聽9001 連接埠的stream 虛擬伺服器。

此模組的另一個應用解決了第三方模組不支援SSL 卸載的用例。在這些用例中,stream_pass 模組會先終止TLS 加密連接,然後再轉發給第三方模組。

本範例示範了RTMP 模組(原生不支援SSL)如何使用stream_pass 模組接受TLS 加密流量。

rtmp {
    server {
        listen 1935;#rtmp
	
	application foo{
		
		live on;
        }
    }
}

stream {
    server {
        listen 1936 ssl; #rtmps

        ssl_certificate     domain.crt;
        ssl_certificate_key domain.key;

        pass 127.0.0.1:1935;
    }
}

在此組態代碼段中,SSL 連線在stream server 程式碼區塊中終止,並轉送到rtmp。對於RTMP 模組來說,連接是未加密的,因此無需額外定製或處理開銷來支援SSL 連線。

NGINX Plus 容器鏡像

隨NGINX Plus R32 發布了適用於特權和非特權容器運行時的NGINX Plus 官方容器鏡像。這兩種容器類型也可選擇安裝NGINX Agent,以便輕鬆連接到NGINX 支援的管理平面。鏡像可以從NGINX 倉庫下載,網址為:privateregistry.nginx.com。請依照這些說明使用NGINX Plus 憑證和金鑰或JSON Web Token (JWT) 存取鏡像。

NGINX Plus R32 中的其他增強功能和漏洞修復

MQTT 模組中的漏洞修復

  • 使用預設屬性時出現格式錯誤的資料包:此版本修正了NGINX Plus R2 中引入訊息佇列遙測傳輸(MQTT) 模組中導致資料包格式錯誤的問題。先前,如有屬性欄位且其中包含MQTT Connect 訊息中所有屬性的預設值,則傳出封包的長度不計入屬性長度欄位(1 個位元組)。這導致資料包長度比預期少1 個字節,造成資料包格式錯誤。 R32 中的這項漏洞修復解決了這個問題。

zone_sync 模組中的漏洞修復

  • 重新載入配置時記憶體洩漏:以前,待處理佇列同步操作使用的鏈節都分配自一個從不釋放的記憶體池,導致主進程和所有worker 進程中的記憶體洩漏。此版本中還原為早期的區域同步實現,使用循環池來支援待處理佇列。

安全修復

在HTTP3/QUIC 實驗性實作中發現並修正了以下潛在安全性問題。

  • 寫入時堆溢位( CVE-2024-32760 ):未公開的HTTP/3 編碼器指令可能導致NGINX worker 程序終止或造成其他潛在影響。
  • 堆疊溢位/釋放後重複使用( CVE-2024-31079 ):未公開的HTTP/3 請求可能導致NGINX worker 進程終止或造成其他潛在影響。這種攻擊需要在連接耗盡過程中專門對請求進行定時,但攻擊者對此缺乏可視性,所能施加的影響有限。
  • 請求頭為空的空指標解引用( CVE-2024-35200 ):未公開的HTTP/3 請求可能導致NGINX worker 程序終止或造成其他潛在影響。
  • QUIC 握手期間記憶體洩漏( CVE-2024-34161 ):如果網路基礎架構支援最大傳輸單元(MTU) 為4096 或更高且沒有分段,則未公開的QUIC 訊息可能導致NGINX worker 進程終止或先前釋放的內存外洩。

從NGINX 開源版繼承的變更

NGINX Plus R32 基於NGINX 開源版1.25.5,繼承了自NGINX Plus R31發布以來(NGINX 1.25.4 和1.25.5)的功能變更、特性及漏洞修復。

特性:

  • tream 模組中的虛擬伺服器。
  • ngx_stream_pass_module。
  • stream 模組中「listen」指令的「deferred」、「accept_filter」及「setfib」參數。
  • 偵測某些架構的快取行大小。
  • 支援Apple Silicon 上的Homebrew。

漏洞修復:

  • Windows 交叉編譯漏洞修復與改進。
  • 在QUIC 中使用0-RTT 時意外關閉連線。
  • 在正常關閉舊的worker 進程時,可能會過早關閉與待執行AIO 操作的連線。
  • 在正常關閉舊的worker 進程後請求快速關閉時,不再記錄套接字洩漏警報。
  • 如果在子請求中使用了AIO,則worker 進程(用於處理SSL 代理程式)中可能會發生套接字描述符錯誤、套接字外洩或分段錯誤。
  • 如果結合使用SSL 代理程式和「image_filter」指令,並使用「error_page」指令重新導向程式碼為415 的錯誤,則worker 進程中可能會發生分段錯誤。
  • HTTP/3 的漏洞修復與改進。

安全性:

有關從最新版本繼承的新變更、特性、漏洞修復及變通方案的完整列表,請參閱NGINX變更檔。

NGINX JavaScript 模組的變更

NGINX Plus R32 包含NGINX JavaScript (njs) 模組版本0.8.4 的變更。以下是njs 自0.8.2(NGINX Plus R31 隨附的版本)以來的重大變更清單。

特性

  • 特性:可設定傳出請求頭的Server 請求頭。
  • 特性:CLI 中的QuickJS 引擎支援。

變更

  • 改進:驗證r.subrequest() 中的URI 和args 參數。
  • 改進:檢查重複的js_set 變數。

漏洞修復

  • 漏洞修復:修復了Headers.set()。
  • 漏洞修復:修復了js_set 的Buffer 值。
  • 漏洞修復:修正了在未指定逾時的情況下共用字典的clear() 方法。
  • 漏洞修復:修正了啟用js_periodic 時的stub_status 統計資料問題。
  • 漏洞修復:修復了使用libxml2 2.12 及更高版本進行建置的問題。
  • 漏洞修復:修復了Date 建立函式溢位和NaN 值的問題。
  • 漏洞修復:修正了querystring.parse() 中的下溢問題。
  • 漏洞修復:修正了String.prototype.match() 中可能存在的緩衝區過度讀取問題。
  • 漏洞修復:修正了for-in 迴圈的解析問題。
  • 漏洞修復:修復了十六進制、八進制和二進製字面量不含數字的解析問題。
  • 漏洞修復:修正了0.8.3中引入的共享字典的clear() 方法(沒有超時)。
  • 漏洞修復:修正了共享字典的r.send() 方法(Buffer 參數沒有逾時)。
  • 漏洞修復:修正了處理非填充base64 字串的atob() 的問題。

有關所有特性、變更及漏洞修復的完整列表,請參閱njs變更日誌。

升級或試用NGINX Plus

如果您是NGINX Plus 用戶,我們強烈建議您盡快升級到NGINX Plus R32。除了上述所有新特性以外,您還將獲得更多修復和改進,這方便NGINX 團隊在您需要時為您提供支援。

如果您還不是NGINX Plus 用戶,我們建議您立即申請試用。您可將其用於安全防護、負載平衡及API 閘道案例,或用作Web 伺服器—— 採用增強型監控和管理API 並擁有全面的售後技術支援。請立即下載30 天免費試用

文章來源:NGINX