全部產品
Search
文件中心

:請求通過CDN回源後Gzip壓縮不生效?

更新時間:Feb 25, 2025

問題描述

CDN來源站點是Nginx伺服器,開啟了Gzip壓縮功能,當用戶端直接請求來源站點時,Gzip壓縮功能正常;當用戶端的請求回源時,Gzip壓縮功能失效,詳情如下:

支援Gzip壓縮/解壓縮時,Nginx將返回壓縮後的內容,以降低流量開銷,加快響應速度。但是啟用CDN後,請求將通過CDN進行轉寄,而用戶端最終收到的是未壓縮的內容,即CDN回源後,來源站點的Gzip功能未生效,詳情如下:

  • 未啟用CDN 要求標頭(Request Header)含有Accept-Encoding: gzip, deflate,回應標頭(Response Header)正常返回Content-Encoding: gzip,即內容已經被壓縮。

  • 啟用CDN後 要求標頭含有Accept-Encoding: gzip, deflate,但回應標頭返回的是Content-Length,並未響應Content-Encoding: gzip

問題原因

來源站點Nginx伺服器中Gzip相關配置錯誤,CDN的回源請求未啟用Gzip壓縮功能,詳情如下:

用戶端請求經過CDN轉寄至來源站點時,回源的要求標頭中將增加Via欄位以標識請求來自Proxy 伺服器(此處指CDN)。而Nginx的ngx_http_gzip_module模組中存在一個gzip_proxied配置,此配置專門用於控制Proxy 伺服器的請求是否啟用Gzip壓縮,並且此配置生效的前提之一是要求標頭中含有Via欄位。由此可見,gzip_proxied配置將決定回源的請求是否啟用Gzip壓縮。

解決方案

如果您遇到的問題與問題描述中的情況完全一致,則可以參考下列步驟更新Nginx的設定檔,以修複此問題。如果您無法確定問題現象,可參見更多資訊進行排查。

  1. 找到Nginx中含有Gzip的配置段。由於Gzip可配置在http、server、location三個配置段中,不同配置段對應的設定檔可能不同,請您以實際配置情況為準,本文以Gzip配置在nginx.conf檔案的HTTP配置段為例。

  2. 檢查Gzip配置中是否存在gzip_proxied配置。如果存在,則修改為以下配置;如果不存在,則添加以下配置。更多有關gzip_proxied配置的介紹,請參見Nginx的官方文檔

    說明

    當不存在gzip_proxied配置時,該配置將使用預設值off

    gzip_proxied  any
    說明

    any表示所有來自Proxy 伺服器的請求都將啟用壓縮。

  3. 儲存上述配置後,依次執行下列命令,確認Nginx配置無誤,然後重新載入Nginx設定檔。

    nginx -t
    nginx -s reload
  4. 啟用CDN,用戶端請求經過CDN轉寄至來源站點Nginx伺服器後,確認返回的回應標頭中含有Content-Encoding: gzip,即內容被壓縮。

更多資訊

為確保現場環境中的問題情況與本文的問題描述一致,請參見下列步驟進行測試:

  1. 登入任意支援curl命令的用戶端。

  2. 參考下列命令,通過curl命令直接存取來源站點,同時增加含有Accept-Encoding: gzip, deflate的要求標頭。

    curl -voa 'http://[$Domain]/[$Resource]' -x [$Original_Server_IP]:80 -H 'Accept-Encoding: gzip, deflate'
    說明
    • [$Domain]:您的網域名稱。

    • [$Resource]:網站裡某個資源的請求地址,例如一張圖片、一個API介面等。

    • [$Original_Server_IP]:來源站點Nginx伺服器的公網IP地址。

    系統返回類似如下,確認回應標頭中含有Content-Encoding: gzip

  3. 參考下列命令,在步驟2命令的基礎上,增加一個Via欄位,類比請求來自於Proxy 伺服器。

    curl -voa 'http://[$Domain]/[$Resource]' -x [$Original_Server_IP]:80 -H 'Accept-Encoding: gzip, deflate' -H 'Via:xxx'
    說明

    Via欄位使用任意值均可,不影響測試結果,本文以xxx為例。

    系統返回類似如下,確認回應標頭中返回的是Content-Length,並未響應Content-Encoding: gzip