varnish緩存503錯(cuò)誤,400錯(cuò)誤的原因和解決方法
生產(chǎn)環(huán)境中嘗試使用varnish替代squid的主要原因:
1. squid不支持多核cpu, 生產(chǎn)環(huán)境中大多使用Dell R610系列,這種類型機(jī)器配置為2個(gè)4核雙線程cpu, 操作系統(tǒng)識(shí)別為16個(gè),對(duì)squid來(lái)說(shuō),只能利用到一個(gè)邏輯cpu, 其它15個(gè)邏輯cpu相當(dāng)于一直浪費(fèi)。
2. squid無(wú)法批量清除緩存
3. squid3.0目前還無(wú)法支持http 1.1, 這對(duì)一些管理調(diào)整(如gzip壓縮,cache-control)帶來(lái)不必要的麻煩
4. 目前我還未找到squid的grace模式(指源站不可到達(dá)時(shí),繼續(xù)使用過(guò)期緩存為用戶提供服務(wù)),而varnish是完全支持的。
5. 經(jīng)過(guò)生產(chǎn)環(huán)境數(shù)個(gè)月反復(fù)測(cè)試,同樣訪問(wèn)量情況下,varnish消耗的更少,也沒(méi)有出現(xiàn)過(guò)崩潰情況,而squid因?yàn)椴恢С侄嗪?,?dǎo)致Dell R610機(jī)器負(fù)載往往超過(guò)4,但使用varnish后,機(jī)器負(fù)載從來(lái)沒(méi)超過(guò)1.5
經(jīng)過(guò)反復(fù)測(cè)試,我們已經(jīng)開始在日獨(dú)立IP百萬(wàn)級(jí)站點(diǎn)中使用varnish替換squid了。
但這個(gè)過(guò)程中,充滿太多未知情況,目前我們所遇到的關(guān)鍵問(wèn)題下:
1. 高流量情況下iptables丟包
ip_conntrack: table full, dropping packet.
按網(wǎng)上常規(guī)方法,只修改/etc/sysctl.conf是無(wú)效的
需要以下兩步,方可解決:
/boot/grub/grub.conf kernel行中增加參數(shù)
ip_conntrack.hashsize=524288
/etc/sysctl.conf中增加
net.ipv4.netfilter.ip_conntrack_max = 2097152
注意,上面的操作需要重啟機(jī)器
2. 登錄shell ulimit的默認(rèn)值
/etc/security/limits.conf中加入
* soft nofile 655360
* hard nofile 655360
默認(rèn)的文件描述符限制為1024, 太小,即使調(diào)整成65536,對(duì)高負(fù)載機(jī)器也可能不夠,故設(shè)置為655360,但也要注意,這個(gè)值不能設(shè)置過(guò)大,否則會(huì)導(dǎo)致shell無(wú)法登錄。
修改/etc/security/limits.conf后,只對(duì)登錄shell有效。對(duì)開機(jī)運(yùn)行的程序,一定要注意這個(gè)問(wèn)題(在啟動(dòng)前設(shè)置ulimit)
shell級(jí)的資源限制來(lái)自于/etc/security/limits.conf,那么系統(tǒng)級(jí)的資源限制可在哪里修改?
3. squid換為varnish后流量增加的解決方案:
/etc/security/limits.conf中加入
* soft memlock 1048576
* soft memlock 1048576
或執(zhí)行 ulimit -HSl 1048576
默認(rèn)的memlock 只有32K,對(duì)varnish來(lái)說(shuō),太小太小。varnish使用內(nèi)存塊保存日志,故這個(gè)值需要調(diào)大一些。
上面的值將其調(diào)整為1G,即可解決varnish流量高于squid的問(wèn)題
4. varnish運(yùn)行中頻繁出現(xiàn)503錯(cuò)誤,400錯(cuò)誤
出現(xiàn)503錯(cuò)誤這是因?yàn)関arnish對(duì)后端服務(wù)器響應(yīng)header有限制,默認(rèn)長(zhǎng)度是2048,可將其調(diào)大一些
-p http_resp_hdr_len=8192
再重啟即可解決503錯(cuò)誤。
出現(xiàn)400錯(cuò)誤是因?yàn)関arnish認(rèn)為客戶端請(qǐng)求header行數(shù)及長(zhǎng)度過(guò)大,其默認(rèn)最大接受的請(qǐng)求header行數(shù)為64,最大長(zhǎng)度(所有請(qǐng)求header行長(zhǎng)度之和)為2048,解決這個(gè)問(wèn)題比較簡(jiǎn)單,在varnish啟動(dòng)參數(shù)中加入:
-p http_max_hdr=256
-p http_req_hdr_len=8192
再重啟varnish, 即可解決其400錯(cuò)誤