NGINX gzip 沒有正常運作的解決方式

我在弄的網站,主要是顯示一些資料,由於後端的data source優化非常差,常常會有「網頁上要顯示5個數字,但是我需要和後端拿30MB的json檔案」這種恐怖情況發生。

原本都只有在公司內部使用這個網站,自從開放到Internet之後,恐怖的事情來了,速度慢就算了,我用手機測試……

流量爆炸了

要優化後端不是短期內有辦法解決的,但是用NGINX輸出gzip格式,可以大大減少流量,30MB的原始檔壓縮後大概會剩下2MB

啟用gzip

依照官方教學弄一弄基本上就ok了,參數設定參考

測試是否輸出為gzip

查看http header裡面是否有 content-enconding: gzip

-用瀏覽器的開發工具

  • 用curl指令

curl -I -H “Accept-Encoding: gzip” “http://your_website”

沒有gzip的原因

HTTP version

這個搞我搞很久,我放最上面XD

NGINX gzip有個屬性 gzip_http_version 預設是 1.1,request的HTTP版本最低要求1.1。用瀏覽器基本上沒有問題,都有輸出gzip。然而我用另一個NGINX 反向代理(reverse proxy)時,就沒有輸出gzip。

原因就是上面說的HTTP版本,因為NGINX在向upstream request時,預設使用 HTTP/1.0,不滿足gzip_http_version=1.1。


要解決這個問題有兩條路:

  • 把gzip_http_version改成1.0
  • 把proxy_http_version改成1.1(NGINX 1.1.4 以上才有這個選項)

其他原因

  • gzip_types有沒有符合
  • 檔案有沒有超過gzip_min_length指定的大小
  • gzip_proxied預設off,也就是說NGINX預設不會壓縮reverse proxy的資源
more!