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