Nginx

nginx gzip_static:為什麼需要非壓縮文件?

  • April 29, 2019

我正在使用在Ubuntu 12.04.4上執行的nginx 1.4.4。 nginx 正在反向代理Rails應用程序伺服器集群。

直接提供靜態文件(主要是資產),無需訪問應用程序伺服器。

我已將其設置為gzip響應並在可用時使用預壓縮文件。

http {
 gzip on;
 gzip_http_version 1.0;
 gzip_proxied any;
 # other ngx_http_gzip_module directives...

 server {
   # proxy configuration

   location ^~ /assets/ {
     gzip_static on;
     expires max;
     add_header Cache-Control public;
     # root is inherited
     try_files $uri =404;
     error_page 404 /404.html;
   }
 }
}

這行得通。

我已經使用真實的預壓縮資產和具有相同名稱但內容不同的虛擬非壓縮資產對其進行了測試:

/assets/application-a45d6...e2593.css         # dummy content
/assets/application-a45d6...e2593.css.gz      # real CSS

我可以看到這種切換gzip_static on,並off會導致 nginx 正確地提供文件的預期版本。

到現在為止還挺好。

但是,此設置僅在文件的非壓縮版本也存在時才有效。只有預壓縮版本會導致 404。

文件說 :

gzip_static

使用“always”值(1.3.6),在所有情況下都使用 gzip 壓縮文件,而不檢查客戶端是否支持它。如果磁碟上沒有未壓縮的文件或者使用了 ngx_http_gunzip_module,這將很有用。

(是的:我都嘗試過onand always,我也嘗試過添加gunzip on。沒有任何改變)

似乎表明只有文件的壓縮版本是可以的。真的是這樣嗎?我的配置有什麼問題嗎?

您可能發現了一個錯誤。但總的來說,您無論如何都想要這兩個文件,原因有以下三個:

  1. 一些客戶端不會請求壓縮數據,如果您將其強加給他們,gzip_static always;他們可能無法理解。
  2. 確保始終找到文件,並且請求不會被上游傳遞到 Rails 或被 404 處理程序擷取(可能的錯誤)。其中之一可能是正在發生的事情。
  3. 讓 nginx 在執行時壓縮或解壓縮文件意味著它必須重複執行此操作,佔用可用於執行應用程序的寶貴 CPU。簡單地發送靜態資源佔用的 CPU 資源要少得多。

引用自:https://serverfault.com/questions/571733