HTTP1.0 和 HTTP1.1 協(xié)議最主要的區(qū)別是HTTP1.1協(xié)議增加了會(huì)話保留時(shí)間(Keep-Alive),也就是會(huì)話完系統(tǒng)并不會(huì)立即關(guān)閉連接,他會(huì)保留一段時(shí)間,也就是apache nginx 或者 squid ….. 設(shè)置的Keep-Alive時(shí)間,這樣如果在這個(gè)時(shí)間內(nèi)客戶端再次向服務(wù)器發(fā)出請(qǐng)求時(shí),服務(wù)器和客戶端就不需要再次進(jìn)行TCP3次握手和重新連接.這樣就加快了打開速度,但是如果話保留時(shí)間(Keep-Alive)設(shè)置太長就會(huì)使得服務(wù)器內(nèi)存大量消耗系統(tǒng)壓力也加大,太短也就沒發(fā)揮HTTP1.1 協(xié)議的優(yōu)點(diǎn),這個(gè)是個(gè)取舍的問題,需要根據(jù)自己的需求設(shè)置,如果服務(wù)器訪問量小設(shè)置大點(diǎn)沒關(guān)系,如果訪問量大就設(shè)置小點(diǎn).
因?yàn)橐郧皼]有很好的理解這點(diǎn),我的nginx服務(wù)器和squid服務(wù)器就出現(xiàn)了效率很差的經(jīng)歷.nginx 10G內(nèi)存 squid 6G內(nèi)存,這兩臺(tái)服務(wù)器每天承受大概20萬IP左右的訪問量,PV多時(shí)接近400萬,nginx服務(wù)器流量大概是50M每秒,squid流量大概是20M每秒,開始我設(shè)置nginx會(huì)話保留時(shí)間(Keep-Alive)為60秒, keepalive_timeout 60; 運(yùn)行了一段時(shí)間發(fā)現(xiàn)8個(gè)nginx子進(jìn)程越來越大,基本每個(gè)子進(jìn)程都有70多M,活動(dòng)連接也基本都是維持在1W以上,Cacti查看服務(wù)器壓力也是很不理想,想起以前apache優(yōu)化經(jīng)驗(yàn),把 keepalive_timeout 15; 后.立竿見影,服務(wù)器活動(dòng)連接直接少了一半,nginx子進(jìn)程也一下子降到30多M,nginx是好了,但squid還是不理想,當(dāng)時(shí)我也沒想到squid 有會(huì)話保留時(shí)間(Keep-Alive)的設(shè)置,因?yàn)閟quid服務(wù)器響應(yīng)都是以HTTP1.0 響應(yīng),就以為沒得HTTP1.1協(xié)議的會(huì)話保留時(shí)間(Keep-Alive)設(shè)置,squid服務(wù)器速度一直不理想,squidclient -h localhost -p 80 mgr:info查看了下squid運(yùn)行情況,命中率還是理想,但下面的值就非常大,我查看過CCTV YOUKU ,他們的這個(gè)值基本都維持在1000左右,我的squid肯定有問題,當(dāng)時(shí)我也不知道怎么處理.就一直擱在那.
Maximum number of file descriptors: 51200
Largest file desc currently in use: 13776
Number of file desc currently in use: 10682
一天在看網(wǎng)上一篇博客的時(shí)候發(fā)現(xiàn)博客里面說squid也可以是設(shè)置會(huì)話保留時(shí)間(Keep-Alive),具體如下:
client_persistent_connections on
server_persistent_connections on
persistent_request_timeout 30 seconds
persistent_request_timeout這個(gè)值也就相當(dāng)于keepalive_timeout時(shí)間,查看了squid默認(rèn)配置文檔,發(fā)現(xiàn)默認(rèn)是2分鐘,看到這我想我的squid問題在哪了,我趕緊把這段加上時(shí)間設(shè)置15秒,活動(dòng)連接也立即減半,Number of file desc currently in use這個(gè)也減到2000千左右,squid也快了起來.終于解決了squid問題.
覺得這還不夠,開始重視根據(jù)HTTP協(xié)議優(yōu)化WEB服務(wù)器,后來經(jīng)過發(fā)現(xiàn)還有要優(yōu)化的,最典型的就是網(wǎng)站文件過期時(shí)間(expires)和gzip.分析過國內(nèi)外很多大網(wǎng)站,他們對(duì)這兩項(xiàng)都有明顯的設(shè)置,最難理解的就是squid是否緩存gzip文件.頭疼了我3天,睡覺都一直再想這個(gè)問題.折騰了4天終于理清了思路,發(fā)表下我的看法.
這圖是我用IE6打開http://www.163.com/然后用 ieHTTPHeaders 工具抓到的http會(huì)話頭.這個(gè)過程很簡(jiǎn)單,開始IE6瀏覽器發(fā)送了個(gè)GET請(qǐng)求,告訴服務(wù)器我要得到index.html里面的內(nèi)容,用的 HTTP/1.1 協(xié)議,并且 支持gzip(Accept-Encoding: gzip, deflate); 然后服務(wù)器回應(yīng)IE6的請(qǐng)求,從這圖可以看明顯的看出,服務(wù)器是以HTTP1.0回應(yīng)的,squid服務(wù)器用的是HTTP1.0協(xié)議,內(nèi)容是gzip格式(Content-Encoding:gzip),從expires可以看出text/html文件過期時(shí)間是120秒,X-Cache: HIT from cache.163.com 這就可以說明index.html文件是從squid服務(wù)器獲取的,并不是MISS,如果MISS說明是從源端nginx服務(wù)器獲取的文件.
先說設(shè)置expires的好處,如果第一次打開網(wǎng)站,IE會(huì)把網(wǎng)站文件下載保存到 C:\Documents and Settings\Administrator\Local Settings\Temporary Internet Files 這個(gè)文件夾,第二次打開網(wǎng)站的時(shí)候,
如果這個(gè)文件夾的文件沒過期就不要去服務(wù)器下載,而是直接調(diào)用本地文件,速度就非???從這個(gè)過程也就可以理解設(shè)置這個(gè)參數(shù)的好處,如果沒過期就不去服務(wù)器下載了,這樣既節(jié)約了帶寬也減小了系統(tǒng)壓力,也加快了速度,圖片 JS CSS HTML 文件他們具體過期時(shí)間設(shè)置有區(qū)別,具體的可以去分析下大網(wǎng)站,最后說下商城網(wǎng)站不要緩存HTML文件,要不然購物車會(huì)顯示不了商品,要刷新才能看到.具體我也解釋不了.
expires和squid里面的refresh_pattern參數(shù)也有一定的關(guān)系,下面這句是我從squid權(quán)威手冊(cè)復(fù)制過來的,很明顯的說明,如果源端服務(wù)器設(shè)置了expires,refresh_pattern就不起作用,以前好像也聽別人說過.
refresh_pattern規(guī)則僅僅應(yīng)用到?jīng)]有明確過時(shí)期限的響應(yīng),原始服務(wù)器能使用Expires頭部,或者Cache-Control:max-age指令來指定過時(shí)期限.
最后說下gzip, nginx apache 開啟gzip我就不詳細(xì)說明,google下就知道了
nginx 開啟gzip
gzip on; # gzip_static on; gzip_min_length 1k; gzip_proxied any; gzip_buffers 4 8k; gzip_http_version 1.0; gzip_vary on; add_header Vary Accept-Encoding; gzip_types text/plain application/x-javascript text/css application/xml;
,gzip主要是壓縮網(wǎng)站文件節(jié)約帶寬和加快訪問速度,小網(wǎng)站不要這個(gè)也可以. nginx后端 squid是否會(huì)緩存gzip文件這個(gè)問題折騰了我4天,不知道是我笨還是沒找到理解的方法.apache后端是可以緩存的,最終還是被我理解了.總結(jié)了下:
如果要gzip ,nginx后端 要 gzip_http_version 1.0; 如果后端NGINX 設(shè)置了 gzip_vary on 或者add_header Vary Accept-Encoding ,squid要設(shè)置 cache_vary on ,否則不緩存gzip文件.squid默認(rèn)配置文檔是這么說的,如果cache_vary off 則不緩存.
squid3 已經(jīng)沒有了cache_vary 這個(gè)參數(shù),如果要支持gzip壓縮要加上以下配置.如果少了部分可能會(huì)導(dǎo)致gzip文件不緩存.
request_header_access Allow allow all
request_header_access Authorization allow all
request_header_access WWW-Authenticate allow all
request_header_access Proxy-Authorization allow all
request_header_access Proxy-Authenticate allow all
request_header_access Cache-Control allow all
request_header_access Content-Encoding allow all
request_header_access Content-Length allow all
request_header_access Content-Type allow all
request_header_access Date allow all
request_header_access Expires allow all
request_header_access Host allow all
request_header_access If-Modified-Since allow all
request_header_access Last-Modified allow all
request_header_access Location allow all
request_header_access Pragma allow all
request_header_access Accept allow all
request_header_access Accept-Charset allow all
request_header_access Accept-Encoding allow all
request_header_access Accept-Language allow all
request_header_access Content-Language allow all
request_header_access Mime-Version allow all
request_header_access Retry-After allow all
request_header_access Title allow all
request_header_access Connection allow all
request_header_access Proxy-Connection allow all
request_header_access All deny all
這段的發(fā)現(xiàn)過程: 在2.7以下是可以支持gzip,網(wǎng)易squid3也支持gzip,而我自己的改成了 gzip_http_version 1.0,還是不支持gzip,仔細(xì)想想,很明顯是發(fā)給squid服務(wù)器的get頭,部分信息被squid過濾掉了,所以我去squid默認(rèn)配置文檔找這段允許所有請(qǐng)求頭.測(cè)試下結(jié)果還真支持gzip了.
至于nginx為什么要設(shè)置 gzip_vary on 或者 add_header Vary Accept-Encoding.網(wǎng)上是這么說:
squid只支持gzip的靜態(tài)壓縮,不支持動(dòng)態(tài)壓縮。具體一點(diǎn)說,就是response header里必須有content-length, 不可以用chunked方式。nginx默認(rèn)的NginxHttpGzipModule, 采用的是chunked方式的動(dòng)態(tài)壓縮,而squid是不支持的。需要使用http_gzip_static_module這個(gè)模塊,進(jìn)行pre-compress,編譯的時(shí)候要加上–with-http_gzip_static_module.這個(gè)問題大家可以參考下:
http://sudone.com/nginx/nginx_gzip_squid.html
http://bbs.chinaunix.net/archiver/?tid-1453195.html
我的測(cè)試過程:
curl.exe --header "Accept-Encoding: gzip, deflate" -D 1.txt -0 1.txt -0 http://www.t
curl.exe --header "Accept-Encoding: gzip, deflate" -D 1.txt -0 http://abc.com/index.html
curl.exe --header "Accept-Encoding: gzip, deflate" -D 2.txt http://abc.com/index.html
http://www.360doc.com/mailto:root@Nginx:~# cat 1.txt
HTTP/1.0 200 OK
Content-Type: text/html
Content-Encoding: gzip
Server: nginx/0.8.14
Date: Sun, 18 Oct 2009 06:06:43 GMT
Last-Modified: Sat, 28 Nov 2009 02:02:10 GMT
Vary: Accept-Encoding
Age: 3414022
Content-Length: 4471
X-Cache: HIT from cache.abc.cn
X-Cache-Lookup: HIT from cache.abc.cn:80
Connection: close
上面那條命令是給服務(wù)器發(fā)了個(gè) HTTP1.0 支持gzip 的GET方法,這時(shí)服務(wù)器就會(huì)回應(yīng)個(gè)gzip壓縮內(nèi)容,然后把HTTP頭保存到 1.txt .如果服務(wù)器返回的內(nèi)容是亂碼就說明,index.html gzip了,不是亂碼就說明沒gzip,測(cè)試是否能緩存gzip文件,主要看http頭,cat 下1.txt .第一次肯定是 X-Cache: MISS from cache.abc.com ,因?yàn)榈谝淮蝧quid服務(wù)器沒有緩存index.html,如果你再次運(yùn)行下這條命令,再查看下1.txt,他就會(huì)是 X-Cache: HIT from cache.abc.com ,如果是hit就說明了是從squid獲取的文件,說明squid已經(jīng)緩存了index.html.
下面這條命令就是以 HTTP1.1 方式向服務(wù)器發(fā)送GET請(qǐng)求,效果和第一條差不多.(其實(shí)不管你是用HTTP1.0還是1.1協(xié)議發(fā)GET請(qǐng)求,squid服務(wù)器都是以HTTP1.0響應(yīng))
測(cè)試結(jié)果:(環(huán)境是squid2.7 nginx0.8.14)
Nginx 沒設(shè)置 gzip_http_version 1.0;
上面兩條命令運(yùn)行的結(jié)果都相同,得到的內(nèi)容都不是亂碼,說明index.html沒被gzip;這我的理解是因?yàn)閟quid是以HTTP1.0響應(yīng)的,不支持nginx默認(rèn)的gzip_http_version 1.1.所以gzip不了.
Nginx 設(shè)置了 gzip_http_version 1.0;
上面兩條命令運(yùn)行的結(jié)果也相同,得到的內(nèi)容是亂碼,說明index.html gzip了, 第2次運(yùn)行命令的時(shí)候發(fā)現(xiàn) X-Cache 都是HIT,說明squid緩存了gzip文件.