歡迎您光臨本站 註冊首頁

squid配合nginx的gzip壓縮的完美解決方案

←手機掃碼閱讀     火星人 @ 2014-03-04 , reply:0

 Squid3.0之前,一直不能完美支持http1.1。所以對gzip內容的支持,始終有很多問題。我也看過很多帖子,號稱解決了這個問題。但是其實一直沒有把問題說清楚。我今天試著把問題的原因和解決方法徹底說清楚。
 
 squid不支持常見的gzip壓縮的原因,有以下兩點:
 
 1,  squid只支持gzip的靜態壓縮,不支持動態壓縮。具體一點說,就是response header里必須有content-length, 不可以用chunked方式。
 
 2,  response header中必須有Vary : Accept-Encoding
 
 只要具備以上幾點,squid就可以完美的識別壓縮和不壓縮的內容。
 
 下面說一下nginx針對這個問題的解決方案:
 
 nginx默認的NginxHttpGzipModule, 採用的是chunked方式的動態壓縮,而squid是不支持的。需要使用http_gzip_static_module這個模塊,進行pre-compress。
 
 具體方法如下:
 
 ngx_http_gzip_static_module was introduced in nginx 0.6.24. You must enable support at compile time:
  
     ./configure --with-http_gzip_static_module ...
 
 配置文件寫法:
 
     gzip             on
 
     gzip_static on;
 
     gzip_http_version   1.0;
     gzip_proxied        any;
     gzip_disable        "MSIE \.";
 
     gzip_comp_level     9;
 
 
 
 注意,這裡沒有加入gzip_vary on;。這是因為http_gzip_static_module這個模塊,只給沒壓縮的內容加入了vary header,而不是所有內容都加。
 所以不能打開這個參數。可以在nginx.conf中手動設置vary header。這樣不管壓縮與否,返回的文件都會被加上Vary: Accept-Encoding。
 
 至此,nginx的gzip壓縮,就能夠被squid完美支持了。如果你使用Http1.0,就會返回你沒壓縮的內容。如果你使用http1.1,並且發送Accept-Encoding:gzip,deflate,就會返回壓縮后的內容。
 
 
 PS: 我又發現了一個問題,就是squid的cache保存問題。按照文檔上說,squid是根據url來緩存對象的。
       也就是說,一個url應該只保留一個cache。如果你交替的申請壓縮的和不壓縮的內容,是會出現反覆MISS的情況的。
       但是我實際測試的過程中,發現不是這樣的,交替的申請壓縮的和不壓縮的內容,是會一直HIT的。這說明squid是同時保存兩份cache的(壓縮的和不壓縮的)。
 



[火星人 ]

來源:
連結:http://zys.8800.org/?p=267
squid配合nginx的gzip壓縮的完美解決方案已經有463次圍觀

http://coctec.com/docs/service/show-post-15823.html