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

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

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