gzip壓縮是否啟用,除了服務器支持外,客戶端也要支持。
當客戶端發送Accept-Encoding:gzip這個request header,服務器即認為其能接受gzip壓縮,就響應一個Content-Encoding:gzip,並發送壓縮內容;
假如客戶端沒有發送 Accept-Encoding,那么服務器就把源代碼原樣輸出。
能不能讓客戶端無論有沒有發送Accept-Encoding,服務器都會發送壓縮內容呢?
這樣做的好處:
1、進一步節省帶寬。
2、防止水平一般的爬蟲抓頁面偷數據。
經測試,此種做法並不會影響普通用戶,因為他們都是用先進的瀏覽器上網的;
另外,也不會影響主流的搜索引擎,收錄仍然會正常。
要做到這點,需要有兩個nginx,配置兩個虛擬主機也可以,並不用啟動兩個nginx主進程。
前端nginx:
gzip壓縮不在前端nginx進行,前端主要是用來強制修改request header,配置代碼:
proxy_set_header Accept-Encoding 'gzip';
這樣,后台的nginx無論如何都將接收到Accept- Encoding:gzip,而不管客戶端有沒有發。
配置代碼:
server 127.0.0.1:80;
}
server {
server_name www.jbxue.com;
listen 80;
location / {
proxy_pass http://www.backend.jbxue.com;
include proxy.conf;
proxy_set_header Accept-Encoding 'gzip';
} }
注意proxy_pass到的upstream是www.backend.jbxue.com,這是在一台機器上配置兩個虛擬主機所必需的,否則就像死循環一樣了。
如果想用www.jbxue.com,可以將前端的listen改成外網ip,后端使用127.0.0.1。
另外一個要注意proxy.conf里最好沒有寫過proxy_set_header Accept-Encoding,我的proxy.conf默認有將Accept-Encoding設為空的,這會造成配置重復。
但proxy_set_header不會沖突,可以按配置先后順序生效,我一時忘了是前生效還是后生效,動手測一下便知。
后端nginx:
后端nginx負責壓縮,這里要注意gzip的版本,因為nginx是用http1.0方式作代理的,所以gzip的版本就不能是默認的1.1版,需要修改為1.0。
配置代碼:
server_name www.backend.jbxue.com;
listen 80;
location / {
root /html/;
gzip on;
gzip_http_version 1.0;
}
}
測試:
curl -I http://www.jbxue.com
看到返回內容中 Content-Encoding:gzip 即說明配置生效。
不加-I參數試試:curl http://www.jbxue.com
打印出一堆亂碼。