今天介紹以下nginx集群方面的知識(shí),先了解下傳統(tǒng)的web訪問(wèn)模型吧,上圖

? 1 部署?臺(tái)備份服務(wù)器,宕機(jī)直接切換
? 2 部署多臺(tái)服務(wù)器,根據(jù)DNS的輪詢(xún)解析機(jī)制去實(shí)現(xiàn)?戶分發(fā)
問(wèn)題:
1?案:服務(wù)器利?率低,成本?,切換不及時(shí),服務(wù)器壓?依然?
2?案: 優(yōu)勢(shì)是?戶處理速度得到了提升,但是當(dāng)其中?臺(tái)故障,就會(huì)有?部分?戶訪問(wèn)不了?站
并?處理解決?案
? 1上述的DNS輪詢(xún)解析?案
? 2 多機(jī)陣列---集群模式

那么啥是集群了???
將多個(gè)物理機(jī)器組成?個(gè)邏輯計(jì)算機(jī),實(shí)現(xiàn)負(fù)載均衡和容錯(cuò)
? 計(jì)算機(jī)集群簡(jiǎn)稱(chēng)集群,是?種計(jì)算機(jī)系統(tǒng), 它通過(guò)?組松散集成的計(jì)算機(jī)軟件或硬件連接起來(lái)?度緊密地協(xié)作完成計(jì)算?作。在某種意義上,他們可以被看作是?臺(tái)計(jì)算機(jī)。 (百度解釋?zhuān)?? 組成要素
1)VIP: ?個(gè)IP地址
2)分發(fā)器: nginx
3)數(shù)據(jù)服務(wù)器: Web服務(wù)器
Nginx集群
在該集群中Nginx扮演的??是: 分發(fā)器
? 任務(wù):接受請(qǐng)求、分發(fā)請(qǐng)求、響應(yīng)請(qǐng)求
? 功能模塊:
1:ngx_http_upstream_module 基于應(yīng)?層分發(fā)模塊
2:ngx_stream_core_module 基于傳輸層分發(fā)模塊 (1.9開(kāi)始提供)
Nginx集群原理
? Nginx集群其實(shí)是:虛擬主機(jī)+反向代理+upstream分發(fā)模塊組成的
虛擬主機(jī):接受和響應(yīng)請(qǐng)求
反向代理: 帶?戶去數(shù)據(jù)服務(wù)器拿數(shù)據(jù)
upstream: 告訴Nginx去哪個(gè)數(shù)據(jù)服務(wù)器拿數(shù)據(jù)
? 數(shù)據(jù)?向
1.虛擬主機(jī)接受?戶請(qǐng)求
2.虛擬主機(jī)去找反向代理
3.反向代理讓去找upstream
4.upstream 告訴 ?個(gè)數(shù)據(jù)服務(wù)器IP
5.Nginx去找數(shù)據(jù)服務(wù)器 并發(fā)起?戶的請(qǐng)求
6.數(shù)據(jù)服務(wù)器接受請(qǐng)求并處理請(qǐng)求
7.數(shù)據(jù)服務(wù)器響應(yīng)請(qǐng)求給Nginx
8.Nginx響應(yīng)請(qǐng)求給?戶
Nginx集群默認(rèn)算法
upstream module
nginx的upstream?前?持4種?式的分配
1、輪詢(xún)(默認(rèn))
每個(gè)請(qǐng)求按時(shí)間順序逐?分配到不同的后端服務(wù)器,如果后端服務(wù)器down掉,能?動(dòng)剔除。
2、weight
指定輪詢(xún)?率,weight和訪問(wèn)?率成正?,?于后端服務(wù)器性能不均的情況。
3、ip_hash
每個(gè)請(qǐng)求按訪問(wèn)ip的hash結(jié)果分配,這樣每個(gè)訪客固定訪問(wèn)?個(gè)后端服務(wù)器,可以解決session的問(wèn)題。
4、fair(第三?)
按后端服務(wù)器的響應(yīng)時(shí)間來(lái)分配請(qǐng)求,響應(yīng)時(shí)間短的優(yōu)先分配。
5、url_hash(第三?)
按訪問(wèn)url的hash結(jié)果來(lái)分配請(qǐng)求,使每個(gè)url定向到同?個(gè)后端服務(wù)器,后端服務(wù)器為緩存時(shí)?較有效。
Nginx業(yè)務(wù)服務(wù)器狀態(tài)
每個(gè)設(shè)備的狀態(tài)設(shè)置為:
1.down 表示單前的server暫時(shí)不參與負(fù)載
2.weight 默認(rèn)為1.weight越?,負(fù)載的權(quán)重就越?。
3.max_fails :允許請(qǐng)求失敗的次數(shù)默認(rèn)為1.當(dāng)超過(guò)最?次數(shù)時(shí),返回proxy_next_upstream 模塊定義的錯(cuò)誤
4.fail_timeout: 失敗超時(shí)時(shí)間,在連接Server時(shí),如果在超時(shí)時(shí)間之內(nèi)超過(guò)max_fails指定的失敗次數(shù),會(huì)認(rèn)為在fail_timeout時(shí)間內(nèi)Server不可?。默認(rèn)為10s。
5.backup: 其它所有的?backup機(jī)器down或者忙的時(shí)候,請(qǐng)求backup機(jī)器。所以這臺(tái)機(jī)器壓?會(huì)最輕。
基于請(qǐng)求頭的分發(fā)
1.基于host分發(fā)
2.基于開(kāi)發(fā)語(yǔ)?分發(fā)
3.基于瀏覽器的分發(fā)
4.基于源ip
#配置web業(yè)務(wù)機(jī)器,可略過(guò)。。。。
#web02
[root@web02 ~]# sh nginx_install
[root@web02 ~]# echo web02 > /usr/local/nginx/html/index.html
[root@web02 ~]# yum -y install elinks &>/dev/null
[root@web02 ~]# /usr/local/nginx/sbin/nginx
[root@web02 ~]# elinks http://localhost -dump
web02
輪詢(xún)分發(fā)(默認(rèn))
#配置分發(fā)器
upstream web {
server 192.168.10.42;
server 192.168.10.43;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://web;
}
}
ps:定義了一個(gè)名稱(chēng)為web分發(fā)機(jī)制,會(huì)自動(dòng)去upstream按照順序自動(dòng)分發(fā)訪問(wèn)
每個(gè)請(qǐng)求按時(shí)間順序逐?分配到不同的后端服務(wù)器,如果后端服務(wù)器down掉,能?動(dòng)剔除。
基于權(quán)重的分發(fā)
upstream web {
server 192.168.10.42 weight=1;
server 192.168.10.43 weight=2 down;#down表示不參與分發(fā)了 ,backup表示web01忙不過(guò)來(lái)的時(shí)候幫忙分發(fā)
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://web;
}
}
ps:指定輪詢(xún)?率,weight和訪問(wèn)?率成正?,?于后端服務(wù)器性能不均的情況。
ip_hash
upstream web {
ip_hash;
server 192.168.10.42;
server 192.168.10.43;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://web;
}
}
#ip_hash算法能夠保證來(lái)?同樣源地址的請(qǐng)求,都分發(fā)到同?臺(tái)主機(jī)
ps:每個(gè)請(qǐng)求按訪問(wèn)ip的hash結(jié)果分配,這樣每個(gè)訪客固定訪問(wèn)?個(gè)后端服務(wù)器,可以解決
session的問(wèn)題。
介紹2個(gè)第三方的分發(fā)方式吧!
A:fair(第三?)
按后端服務(wù)器的響應(yīng)時(shí)間來(lái)分配請(qǐng)求,響應(yīng)時(shí)間短的優(yōu)先分配。
B:url_hash(第三?)
按訪問(wèn)url的hash結(jié)果來(lái)分配請(qǐng)求,使每個(gè)url定向到同?個(gè)后端服務(wù)器,后端服務(wù)器為緩
存時(shí)?較有效。
下面介紹4個(gè)常用的分發(fā)吧
1:基于host分發(fā)(域名)
http{
upstream web1 {
server 192.168.10.42;
}
upstream web2 {
server 192.168.10.43;
}
server {
listen 80;
server_name www.web1.com;
location / {
proxy_pass http://web1;
}
}
server {
listen 80;
server_name www.web2.com;
location / {
proxy_pass http://web2;
}
}
}
2:基于開(kāi)發(fā)語(yǔ)言分發(fā)
http{
upstream php {
server 192.168.10.42;
}
upstream html {
server 192.168.10.43;
}
server {
location ~* \.php$ {
proxy_pass http://php;
}
location ~* \.html$ {
proxy_pass http://html;
}
}
}
ps:就是訪問(wèn)不同的域名,例如index.html和index.php就可以根據(jù)規(guī)則,分發(fā)不同的服務(wù)器去訪問(wèn)
3:基于瀏覽器分發(fā)
upstream elinks { server 192.168.10.42; }
upstream chrome { server 192.168.10.43; }
upstream any { server 192.168.10.42:81; }
server {
listen 80;
server_name www.web1.com;
location / {
proxy_pass http://any;
if ( $http_user_agent ~* Elinks ) {
proxy_pass http://elinks;
}
if ( $http_user_agent ~* chrome ) {
proxy_pass http://chrome;
}
}
}
ps:根據(jù)你訪問(wèn)的瀏覽器的不同,從而分發(fā)不同的服務(wù)器或者匹配的規(guī)則去響應(yīng)數(shù)據(jù),例如手機(jī)客戶和PC客戶
4:基于源ip分發(fā)
upstream beijin.server {
server 192.168.10.42;
}
upstream shanghai.server {
server 192.168.10.43;
}
upstream default.server {
server 192.168.10.42:81;
}
geo $geo {
default default;
192.168.10.241/32 beijin;
192.168.10.242/32 shanghai;
}
location / {
proxy_pass http://$geo.server$request_uri;
}
ps:http://request_uri;是為了匹配全路徑,防止url所有參數(shù)丟失,例如源ip來(lái)自北京的就返回北京的server數(shù)據(jù),來(lái)自上海的就返回上海的server數(shù)據(jù)
好了,大功告成,今天就先寫(xiě)到這里吧,感謝觀看~~~