最近迷上了Nginx,真實(shí)麻雀雖小,五臟俱全..功能實(shí)在強(qiáng)大..
nginx不單可以作為強(qiáng)大的web服務(wù)器,,也可以作為一個(gè)反向代理服務(wù)器,,而且nginx還可以按照調(diào)度規(guī)則實(shí)現(xiàn)動(dòng)態(tài)、靜態(tài)頁(yè)面的分離,,可以按照輪詢,、ip哈希,、URL哈希、權(quán)重等多種方式對(duì)后端服務(wù)器做負(fù)載均衡,,同時(shí)還支持后端服務(wù)器的健康檢查,。
如果只有一臺(tái)服務(wù)器時(shí),這個(gè)服務(wù)器掛了,那么對(duì)于網(wǎng)站來(lái)說(shuō)是個(gè)災(zāi)難.因此,這時(shí)候的負(fù)載均衡就會(huì)大顯身手了,它會(huì)自動(dòng)剔除掛掉的服務(wù)器.
下面簡(jiǎn)單的介紹下我使用Nginx做負(fù)載的體會(huì)
下載---安裝Nginx這些不介紹了,前篇有介紹.
windows和Linux下配置Nginx負(fù)載的寫法一樣,故不分開介紹.
Nginx負(fù)載均衡一些基礎(chǔ)知識(shí):
nginx 的 upstream目前支持 4 種方式的分配
1),、輪詢(默認(rèn))
每個(gè)請(qǐng)求按時(shí)間順序逐一分配到不同的后端服務(wù)器,,如果后端服務(wù)器down掉,能自動(dòng)剔除,。
2),、weight
指定輪詢幾率,weight和訪問(wèn)比率成正比,,用于后端服務(wù)器性能不均的情況,。
2)、ip_hash
每個(gè)請(qǐng)求按訪問(wèn)ip的hash結(jié)果分配,,這樣每個(gè)訪客固定訪問(wèn)一個(gè)后端服務(wù)器,,可以解決session的問(wèn)題。
3),、fair(第三方)
按后端服務(wù)器的響應(yīng)時(shí)間來(lái)分配請(qǐng)求,,響應(yīng)時(shí)間短的優(yōu)先分配。
4),、url_hash(第三方)
配置:
在http節(jié)點(diǎn)里添加:
#定義負(fù)載均衡設(shè)備的 Ip及設(shè)備狀態(tài)
upstream myServer {
server 127.0.0.1:9090 down;
server 127.0.0.1:8080 weight=2;
server 127.0.0.1:6060;
server 127.0.0.1:7070 backup;
}
在需要使用負(fù)載的Server節(jié)點(diǎn)下添加
proxy_pass http://myServer;
upstream 每個(gè)設(shè)備的狀態(tài):
down 表示單前的server暫時(shí)不參與負(fù)載
weight 默認(rèn)為1.weight越大,,負(fù)載的權(quán)重就越大。
max_fails :允許請(qǐng)求失敗的次數(shù)默認(rèn)為1.當(dāng)超過(guò)最大次數(shù)時(shí),,返回proxy_next_upstream 模塊定義的錯(cuò)誤
fail_timeout:max_fails 次失敗后,,暫停的時(shí)間。
backup: 其它所有的非backup機(jī)器down或者忙的時(shí)候,,請(qǐng)求backup機(jī)器,。所以這臺(tái)機(jī)器壓力會(huì)最輕。
Nginx還支持多組的負(fù)載均衡,可以配置多個(gè)upstream 來(lái)服務(wù)于不同的Server.
配置負(fù)載均衡比較簡(jiǎn)單,但是最關(guān)鍵的一個(gè)問(wèn)題是怎么實(shí)現(xiàn)多臺(tái)服務(wù)器之間session的共享
下面有幾種方法(以下內(nèi)容來(lái)源于網(wǎng)絡(luò),第四種方法沒(méi)有實(shí)踐.)
1) 不使用session,,換作cookie
能把session改成cookie,,就能避開session的一些弊端,在從前看的一本J2EE的書上,,也指明在集群系統(tǒng)中不能用session,,否則惹出禍端來(lái)就不好辦。如果系統(tǒng)不復(fù)雜,,就優(yōu)先考慮能否將session去掉,,改動(dòng)起來(lái)非常麻煩的話,再用下面的辦法。
2) 應(yīng)用服務(wù)器自行實(shí)現(xiàn)共享
asp.net可以用數(shù)據(jù)庫(kù)或memcached來(lái)保存session,,從而在asp.net本身建立了一個(gè)session集群,,用這樣的方式可以令 session保證穩(wěn)定,即使某個(gè)節(jié)點(diǎn)有故障,,session也不會(huì)丟失,,適用于較為嚴(yán)格但請(qǐng)求量不高的場(chǎng)合。但是它的效率是不會(huì)很高的,,不適用于對(duì)效率 要求高的場(chǎng)合,。
以上兩個(gè)辦法都跟nginx沒(méi)什么關(guān)系,下面來(lái)說(shuō)說(shuō)用nginx該如何處理:
3) ip_hash
nginx中的ip_hash技術(shù)能夠?qū)⒛硞€(gè)ip的請(qǐng)求定向到同一臺(tái)后端,,這樣一來(lái)這個(gè)ip下的某個(gè)客戶端和某個(gè)后端就能建立起穩(wěn)固的session,,ip_hash是在upstream配置中定義的:
upstream backend {
server 127.0.0.1:8080 ;
server 127.0.0.1:9090 ;
ip_hash;
}
ip_hash是容易理解的,但是因?yàn)閮H僅能用ip這個(gè)因子來(lái)分配后端,,因此ip_hash是有缺陷的,,不能在一些情況下使用:
1/ nginx不是最前端的服務(wù)器。ip_hash要求nginx一定是最前端的服務(wù)器,,否則nginx得不到正確ip,,就不能根據(jù)ip作hash。譬如使用的是squid為最前端,,那么nginx取ip時(shí)只能得到squid的服務(wù)器ip地址,,用這個(gè)地址來(lái)作分流是肯定錯(cuò)亂的。
2/ nginx的后端還有其它方式的負(fù)載均衡,。假如nginx后端又有其它負(fù)載均衡,,將請(qǐng)求又通過(guò)另外的方式分流了,,那么某個(gè)客戶端的請(qǐng)求肯定不能定位到同一臺(tái)session應(yīng)用服務(wù)器上,。這么算起來(lái),nginx后端只能直接指向應(yīng)用服務(wù)器,,或者再搭一個(gè)squid,,然后指向應(yīng)用服務(wù)器。最好的辦法是用location作一次分流,,將需要session的部分請(qǐng)求通過(guò)ip_hash分流,,剩下的走其它后端去。
4) upstream_hash
為了解決ip_hash的一些問(wèn)題,,可以使用upstream_hash這個(gè)第三方模塊,,這個(gè)模塊多數(shù)情況下是用作url_hash的,但是并不妨礙將它用來(lái)做session共享:
假如前端是squid,,他會(huì)將ip加入x_forwarded_for這個(gè)http_header里,,用upstream_hash可以用這個(gè)頭做因子,將請(qǐng)求定向到指定的后端:
可見這篇文檔:http://www./nginx/nginx_url_hash.html
在文檔中是使用$request_uri做因子,稍微改一下:
hash $http_x_forwarded_for;
這樣就改成了利用x_forwarded_for這個(gè)頭作因子,,在nginx新版本中可支持讀取cookie值,,所以也可以改成:
hash $cookie_jsessionid;
假如在php中配置的session為無(wú)cookie方式,配合nginx自己的一個(gè)userid_module模塊就可以用nginx自發(fā)一個(gè)cookie,,可參見userid模塊的英文文檔:
http://wiki./NginxHttpUserIdModule
另可用姚偉斌編寫的模塊upstream_jvm_route:http://code.google.com/p/nginx-upstream-jvm-route/
PS:繼續(xù)求救,為什么部署在Nginx 服務(wù)器上的頁(yè)面樣式會(huì)顯示不對(duì)呢?