squid配合nginx的gzip压缩的完美解决方案
生活随笔
收集整理的這篇文章主要介紹了
squid配合nginx的gzip压缩的完美解决方案
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Squid3.0之前,一直不能完美支持http1.1。所以對(duì)gzip內(nèi)容的支持,始終有很多問(wèn)題。我也看過(guò)很多帖子,號(hào)稱(chēng)解決了這個(gè)問(wèn)題。但是其實(shí)一直沒(méi)有把問(wèn)題說(shuō)清楚。我今天試著把問(wèn)題的原因和解決方法徹底說(shuō)清楚。
squid不支持常見(jiàn)的gzip壓縮的原因,有以下兩點(diǎn):
1,??squid只支持gzip的靜態(tài)壓縮,不支持動(dòng)態(tài)壓縮。具體一點(diǎn)說(shuō),就是response header里必須有content-length, 不可以用chunked方式。
2,??response header中必須有Vary : Accept-Encoding
只要具備以上幾點(diǎn),squid就可以完美的識(shí)別壓縮和不壓縮的內(nèi)容。
下面說(shuō)一下nginx針對(duì)這個(gè)問(wèn)題的解決方案:
nginx默認(rèn)的NginxHttpGzipModule, 采用的是chunked方式的動(dòng)態(tài)壓縮,而squid是不支持的。需要使用http_gzip_static_module這個(gè)模塊,進(jìn)行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 ...
配置文件寫(xiě)法:
? ? gzip? ?? ?? ?? ? on
? ? gzip_static on;
? ? gzip_http_version? ?1.0;
? ? gzip_proxied? ?? ???any;
? ? gzip_disable? ?? ???"MSIE [1-6]\.";
? ? gzip_comp_level? ???9;
注意,這里沒(méi)有加入gzip_vary on;。這是因?yàn)閔ttp_gzip_static_module這個(gè)模塊,只給沒(méi)壓縮的內(nèi)容加入了vary header,而不是所有內(nèi)容都加。
所以不能打開(kāi)這個(gè)參數(shù)。可以在nginx.conf中手動(dòng)設(shè)置vary header。這樣不管壓縮與否,返回的文件都會(huì)被加上Vary: Accept-Encoding。
至此,nginx的gzip壓縮,就能夠被squid完美支持了。如果你使用Http1.0,就會(huì)返回你沒(méi)壓縮的內(nèi)容。如果你使用http1.1,并且發(fā)送Accept-Encoding:gzip,deflate,就會(huì)返回壓縮后的內(nèi)容。
PS: 我又發(fā)現(xiàn)了一個(gè)問(wèn)題,就是squid的cache保存問(wèn)題。按照文檔上說(shuō),squid是根據(jù)url來(lái)緩存對(duì)象的。
? ?? ?也就是說(shuō),一個(gè)url應(yīng)該只保留一個(gè)cache。如果你交替的申請(qǐng)壓縮的和不壓縮的內(nèi)容,是會(huì)出現(xiàn)反復(fù)MISS的情況的。
? ?? ?但是我實(shí)際測(cè)試的過(guò)程中,發(fā)現(xiàn)不是這樣的,交替的申請(qǐng)壓縮的和不壓縮的內(nèi)容,是會(huì)一直HIT的。這說(shuō)明squid是同時(shí)保存兩份cache的(壓縮的和不壓縮的)。
? squid是根據(jù)url來(lái)緩存對(duì)象的。
? ?? ?也就是說(shuō),一個(gè)url應(yīng)該只保留一個(gè)cache。如果你交替的申請(qǐng)壓縮的和不壓縮的內(nèi)容,是會(huì)出現(xiàn)反復(fù)MISS的情況的。
? ?? ?但是我實(shí)際測(cè)試的過(guò)程中,發(fā)現(xiàn)不是這樣的,交替的申請(qǐng)壓縮的和不壓縮的內(nèi)容,是會(huì)一直HIT的。這說(shuō)明squid是同時(shí)保存兩份cache的(壓縮的和不壓縮的)。 如果打開(kāi)了broken_vary_encoding,就可以同時(shí)保存兩份cache了。
?
轉(zhuǎn)載于:https://blog.51cto.com/mooon/908924
總結(jié)
以上是生活随笔為你收集整理的squid配合nginx的gzip压缩的完美解决方案的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 谭浩强C程序设计的课后习题答案
- 下一篇: 想你是我戒不掉的瘾