當(dāng)我們的網(wǎng)站處于發(fā)展初期的時(shí)候,nginx只代理了后端一臺(tái)服務(wù)器,但由于我們網(wǎng)站名氣大漲訪問(wèn)的人越來(lái)越多一臺(tái)服務(wù)器實(shí)在是頂不住,于是我們加了多臺(tái)服務(wù)器,那么多臺(tái)服務(wù)器又怎么配置代理呢,我們這里以兩臺(tái)服務(wù)器為案例,為大家做演示。
1. upstream 負(fù)載均衡模塊說(shuō)明
如:
下面設(shè)定負(fù)載均衡的服務(wù)器列表。
upstream {
ip_hash;
server 192.168.1.10:80;
server 192.168.1.11:80 down;
server 192.168.1.12:8009 max_fails=3 fail_timeout=20s;
server 192.168.1.13:8080;
}
server {
location / {
proxy_pass http://;
}
}
upstream 是 Nginx 的HTTP Upstream模塊,這個(gè)模塊通過(guò)一個(gè)簡(jiǎn)單的調(diào)度算法來(lái)實(shí)現(xiàn)客戶端IP到后端服務(wù)器的負(fù)載均衡。
在上面的設(shè)定中,通過(guò)upstream指令指定了一個(gè)負(fù)載均衡器的名稱 , 這個(gè)名稱可以任意指定,在后面需要用到的地方直接調(diào)用即可。
2.upstream 支持的負(fù)載均衡算法
Nginx的負(fù)載均衡模塊目前支持4種調(diào)度算法,下面進(jìn)行分別介紹,其中后兩項(xiàng)屬于第三方調(diào)度算法。
輪詢(默認(rèn)):每個(gè)請(qǐng)求按時(shí)間順序逐一分配到不同的后端服務(wù)器,如果后端某臺(tái)服務(wù)器宕機(jī),故障系統(tǒng)被自動(dòng)剔除,使用戶訪問(wèn)不受影響。Weight 指定輪詢權(quán)值,Weight值越大,分配到的訪問(wèn)機(jī)率越高,主要用于后端每個(gè)服務(wù)器性能不均的情況下。
ip_hash:每個(gè)請(qǐng)求按訪問(wèn)IP的hash結(jié)果分配,這樣來(lái)自同一個(gè)IP的訪客固定訪問(wèn)一個(gè)后端服務(wù)器,有效解決了動(dòng)態(tài)網(wǎng)頁(yè)存在的session共享問(wèn)題。
fair:這是比上面兩個(gè)更加智能的負(fù)載均衡算法。此種算法可以依據(jù)頁(yè)面大小和加載時(shí)間長(zhǎng)短智能地進(jìn)行負(fù)載均衡,也就是根據(jù)后端服務(wù)器的響應(yīng)時(shí)間來(lái)分配請(qǐng)求,響應(yīng)時(shí)間短的優(yōu)先分配。Nginx本身是不支持fair的,如果需要使用這種調(diào)度算法,必須下載Nginx的upstream_fair模塊。
url_hash:此方法按訪問(wèn)url的hash結(jié)果來(lái)分配請(qǐng)求,使每個(gè)url定向到同一個(gè)后端服務(wù)器,可以進(jìn)一步提高后端緩存服務(wù)器的效率。Nginx本身是不支持url_hash的,如果需要使用這種調(diào)度算法,必須安裝Nginx 的hash軟件包。
3.upstream 支持的狀態(tài)參數(shù)
在HTTP Upstream模塊中,可以通過(guò)server指令指定后端服務(wù)器的IP地址和端口,同時(shí)還可以設(shè)定每個(gè)后端服務(wù)器在負(fù)載均衡調(diào)度中的狀態(tài)。常用的狀態(tài)有:
down : 表示當(dāng)前的server暫時(shí)不參與負(fù)載均衡。
backup : 預(yù)留的備份機(jī)器。當(dāng)其他所有的非backup機(jī)器出現(xiàn)故障或者忙的時(shí)候,才會(huì)請(qǐng)求backup 機(jī)器,因此這臺(tái)機(jī)器的壓力最輕。
max_fails : 允許請(qǐng)求失敗的次數(shù),默認(rèn)為1。當(dāng)超過(guò)最大次數(shù)時(shí),返回proxy_next_upstream 模塊定義的錯(cuò)誤。
fail_timeout : 在經(jīng)歷了max_fails次失敗后,暫停服務(wù)的時(shí)間。max_fails可以和fail_timeout一起使用。
注 : 當(dāng)負(fù)載調(diào)度算法為ip_hash時(shí),后端服務(wù)器在負(fù)載均衡調(diào)度中的狀態(tài)不能是weight和backup。
4.實(shí)驗(yàn)拓?fù)?/strong>
5. 配置nginx負(fù)載均衡
[root@nginx ~]# vim /etc/nginx/nginx.conf
upstream webservers {
server 192.168.18.201 weight=1;
server 192.168.18.202 weight=1;
}
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
proxy_pass http://webservers;
proxy_set_header X-Real-IP $remote_addr;
}
}
注,upstream是定義在server{ }之外的,不能定義在server{ }內(nèi)部。定義好upstream之后,用proxy_pass引用一下即可。
6.重新加載一下配置文件
[root@nginx ~]# service nginx reload
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
重新載入 nginx: [確定]
7.測(cè)試一下
注,大家可以不斷的刷新瀏覽的內(nèi)容,可以發(fā)現(xiàn)web1與web2是交替出現(xiàn)的,達(dá)到了負(fù)載均衡的效果。
8.查看一下Web訪問(wèn)服務(wù)器日志
Web1:
[root@web1 ~]# tail /var/log/httpd/access_log
192.168.1.208 - - [04/Sep/2013:09:41:58 +0800] 'GET / HTTP/1.0' 200 23 '-' 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)'
192.168.1.208 - - [04/Sep/2013:09:41:58 +0800] 'GET / HTTP/1.0' 200 23 '-' 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)'
192.168.1.208 - - [04/Sep/2013:09:41:59 +0800] 'GET / HTTP/1.0' 200 23 '-' 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)'
192.168.1.208 - - [04/Sep/2013:09:41:59 +0800] 'GET / HTTP/1.0' 200 23 '-' 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)'
192.168.1.208 - - [04/Sep/2013:09:42:00 +0800] 'GET / HTTP/1.0' 200 23 '-' 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)'
192.168.1.208 - - [04/Sep/2013:09:42:00 +0800] 'GET / HTTP/1.0' 200 23 '-' 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)'
192.168.1.208 - - [04/Sep/2013:09:42:00 +0800] 'GET / HTTP/1.0' 200 23 '-' 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)'
192.168.1.208 - - [04/Sep/2013:09:44:21 +0800] 'GET / HTTP/1.0' 200 23 '-' 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)'
192.168.1.208 - - [04/Sep/2013:09:44:22 +0800] 'GET / HTTP/1.0' 200 23 '-' 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)'
192.168.1.208 - - [04/Sep/2013:09:44:22 +0800] 'GET / HTTP/1.0' 200 23 '-' 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)'
Web2:
先修改一下,Web服務(wù)器記錄日志的格式。
[root@web2 ~]# vim /etc/httpd/conf/httpd.conf
LogFormat '%{X-Real-IP}i %l %u %t \'%r\' %>s %b \'%{Referer}i\' \'%{User-Agent}i\'' combined
[root@web2 ~]# service httpd restart
停止 httpd: [確定]
正在啟動(dòng) httpd: [確定]
接著,再訪問(wèn)多次,繼續(xù)查看日志。
[root@web2 ~]# tail /var/log/httpd/access_log
192.168.1.208 - - [04/Sep/2013:09:50:28 +0800] 'GET / HTTP/1.0' 200 23 '-' 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)'
192.168.1.208 - - [04/Sep/2013:09:50:28 +0800] 'GET / HTTP/1.0' 200 23 '-' 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)'
192.168.1.208 - - [04/Sep/2013:09:50:28 +0800] 'GET / HTTP/1.0' 200 23 '-' 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)'
192.168.1.208 - - [04/Sep/2013:09:50:28 +0800] 'GET / HTTP/1.0' 200 23 '-' 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)'
192.168.1.208 - - [04/Sep/2013:09:50:28 +0800] 'GET / HTTP/1.0' 200 23 '-' 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)'
192.168.1.208 - - [04/Sep/2013:09:50:28 +0800] 'GET / HTTP/1.0' 200 23 '-' 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)'
192.168.1.208 - - [04/Sep/2013:09:50:28 +0800] 'GET / HTTP/1.0' 200 23 '-' 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)'
192.168.1.208 - - [04/Sep/2013:09:50:28 +0800] 'GET / HTTP/1.0' 200 23 '-' 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)'
192.168.1.208 - - [04/Sep/2013:09:50:29 +0800] 'GET / HTTP/1.0' 200 23 '-' 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)'
192.168.1.208 - - [04/Sep/2013:09:50:29 +0800] 'GET / HTTP/1.0' 200 23 '-' 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)'
注,大家可以看到,兩臺(tái)服務(wù)器日志都記錄是192.168.1.208訪問(wèn)的日志,也說(shuō)明了負(fù)載均衡配置成功。
9.配置nginx進(jìn)行健康狀態(tài)檢查
max_fails,允許請(qǐng)求失敗的次數(shù),默認(rèn)為1。當(dāng)超過(guò)最大次數(shù)時(shí),返回proxy_next_upstream 模塊定義的錯(cuò)誤。
fail_timeout,在經(jīng)歷了max_fails次失敗后,暫停服務(wù)的時(shí)間。max_fails可以和fail_timeout一起使用,進(jìn)行健康狀態(tài)檢查。
[root@nginx ~]# vim /etc/nginx/nginx.conf
upstream webservers {
server 192.168.18.201 weight=1 max_fails=2 fail_timeout=2;
server 192.168.18.202 weight=1 max_fails=2 fail_timeout=2;
}
10.重新加載一下配置文件
[root@nginx ~]# service nginx reload
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
重新載入 nginx: [確定]
11.停止服務(wù)器并測(cè)試
先停止Web1,進(jìn)行測(cè)試。
[root@web1 ~]# service httpd stop
停止 httpd: [確定]
注,大家可以看到,現(xiàn)在只能訪問(wèn)Web2,再重新啟動(dòng)Web1,再次訪問(wèn)一下。
[root@web1 ~]# service httpd start
正在啟動(dòng) httpd: [確定]
注,大家可以看到,現(xiàn)在又可以重新訪問(wèn),說(shuō)明nginx的健康狀態(tài)查檢配置成功。但大家想一下,如果不幸的是所有服務(wù)器都不能提供服務(wù)了怎么辦,用戶打開頁(yè)面就會(huì)出現(xiàn)出錯(cuò)頁(yè)面,那么會(huì)帶來(lái)用戶體驗(yàn)的降低,所以我們能不能像配置LVS是配置sorry_server呢,答案是可以的,但這里不是配置sorry_server而是配置backup。
12.配置backup服務(wù)器
[root@nginx ~]# vim /etc/nginx/nginx.conf
server {
listen 8080;
server_name localhost;
root /data/www/errorpage;
index index.html;
}
upstream webservers {
server 192.168.18.201 weight=1 max_fails=2 fail_timeout=2;
server 192.168.18.202 weight=1 max_fails=2 fail_timeout=2;
server 127.0.0.1:8080 backup;
}
[root@nginx ~]# mkdir -pv /data/www/errorpage
[root@nginx errorpage]# cat index.html
<h1>Sorry......</h1>
13.重新加載配置文件
[root@nginx errorpage]# service nginx reload
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
重新載入 nginx: [確定]
14.關(guān)閉Web服務(wù)器并進(jìn)行測(cè)試
[root@web1 ~]# service httpd stop
停止 httpd: [確定]
[root@web2 ~]# service httpd stop
停止 httpd: [確定]
注,大家可以看到,當(dāng)所有服務(wù)器都不能工作時(shí),就會(huì)啟動(dòng)備份服務(wù)器。好了,backup服務(wù)器就配置到這里,下面我們來(lái)配置ip_hash負(fù)載均衡。
15.配置ip_hash負(fù)載均衡
ip_hash,每個(gè)請(qǐng)求按訪問(wèn)IP的hash結(jié)果分配,這樣來(lái)自同一個(gè)IP的訪客固定訪問(wèn)一個(gè)后端服務(wù)器,有效解決了動(dòng)態(tài)網(wǎng)頁(yè)存在的session共享問(wèn)題。(一般電子商務(wù)網(wǎng)站用的比較多)
[root@nginx ~]# vim /etc/nginx/nginx.conf
upstream webservers {
ip_hash;
server 192.168.18.201 weight=1 max_fails=2 fail_timeout=2;
server 192.168.18.202 weight=1 max_fails=2 fail_timeout=2;
#server 127.0.0.1:8080 backup;
}
注,當(dāng)負(fù)載調(diào)度算法為ip_hash時(shí),后端服務(wù)器在負(fù)載均衡調(diào)度中的狀態(tài)不能有backup。(有人可能會(huì)問(wèn),為什么呢?大家想啊,如果負(fù)載均衡把你分配到backup服務(wù)器上,你能訪問(wèn)到頁(yè)面嗎?不能,所以了不能配置backup服務(wù)器)
16.重新加載一下服務(wù)器
[root@nginx ~]# service nginx reload
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
重新載入 nginx: [確定]
17.測(cè)試一下
注,大家可以看到,你不斷的刷新頁(yè)面一直會(huì)顯示的民Web2,說(shuō)明ip_hash負(fù)載均衡配置成功。下面我們來(lái)統(tǒng)計(jì)一下Web2的訪問(wèn)連接數(shù)。
18.統(tǒng)計(jì)Web2的訪問(wèn)連接數(shù)
[root@web2 ~]# netstat -an | grep :80 | wc -l
304
注,你不斷的刷新,連接數(shù)會(huì)越來(lái)越多。好了,nginx的負(fù)載均衡就全部演示到這里。