Nginx負載均衡配置
Nginx 負載均衡配置詳解一、測試環(huán)境由于沒有服務(wù)器,所以本次測試直接host 指定域名(my.local )測試域名:my.localA 服務(wù)器:172.16.10.181B 服務(wù)器:172.16
Nginx 負載均衡配置詳解
一、測試環(huán)境
由于沒有服務(wù)器,所以本次測試直接host 指定域名(my.local )
測試域名:my.local
A 服務(wù)器:172.16.10.181
B 服務(wù)器:172.16.10.131
C 服務(wù)器:172.16.10.130 (主服務(wù)器)
二、域名解析 由于不是真實環(huán)境,域名就隨便使用一個my.local 用作測試,所以my.local 的解析只能在hosts 文件設(shè)置。
打開:C:WindowsSystem32driversetchosts
在末尾添加
172.16.10.181 my.local
保存退出,然后啟動命令模式ping 下看看是否已設(shè)置成功,如下圖
,三、Nginx 配置
1)A 服務(wù)器(主服務(wù)器)nginx.conf 配置
打開nginx.conf ,文件位置在nginx 安裝目錄的conf 目錄下。 在http 段加入以下代碼
upstream my.local {
ip_hash; #默認可以不加,加上此行則已ip_hash方式進行負載均衡
#weight為權(quán)重,數(shù)字越大權(quán)重越高
server 172.16.10.131:80 weight=1;
server 172.16.10.130:80 weight=1;
}
server{
listen 80;
server_name my.local;
location / {
proxy_pass http://my.local;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
,proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
保存重啟nginx (/usr/local/nginx/sbin/nginx -s reload)
2)B 、C 服務(wù)器nginx.conf 設(shè)置
打開nginx.conf ,文件位置在nginx 安裝目錄的conf 目錄下。
在http 段加入以下代碼
server{
} listen 80; server_name my.local; index index.html index.htm index.php; root /home/wwwroot/default;
保存重啟nginx (/usr/local/nginx/sbin/nginx -s reload)
四、測試
當訪問my.local 的時候,為了區(qū)分是轉(zhuǎn)向哪臺服務(wù)器處理分別在B 、C 服務(wù)器下寫一個不同內(nèi)容的index.html 文件,以作區(qū)分。
打開瀏覽器訪問my.local 結(jié)果,刷新會發(fā)現(xiàn)所有的請求均分別被主服務(wù)器
(172.16.10.181)分配到B 服務(wù)器(172.16.10.131)與C 服務(wù)器(172.16.10.130)上,實現(xiàn)了負載均衡效果。
B 服務(wù)器:
C 服務(wù)器:
,假如其中一臺服務(wù)器宕機會怎樣?
當某臺服務(wù)器宕機了,是否會影響訪問呢?
我們先來看看實例,根據(jù)以上例子,假設(shè)C 服務(wù)器172.16.10.130這臺機子宕機了(由于無法模擬宕機,所以我就把C 服務(wù)器關(guān)機)然后再來訪問看看。
訪問結(jié)果則都是下圖顯示結(jié)果:
我們發(fā)現(xiàn),雖然C 服務(wù)器(172.16.10.130)宕機了,但不影響網(wǎng)站訪問。這樣,就不會擔(dān)心在負載均衡模式下因為某臺機子宕機而拖累整個站點了。
五、同一臺服務(wù)器設(shè)置多個域名的負載均衡
多個域名配置和my.local 的配置一樣。
假設(shè)second.local 的主服務(wù)器IP 是172.16.10.181,負載均衡到172.16.10.132和172.16.10.133機器上
現(xiàn)將域名second.local 解析到172.16.10.181上。
在主服務(wù)器(172.16.10.181)的nginx.conf 加入以下代碼:
upstream second.local {
server 172.16.10.132:80;
,server 172.16.10.133:80; }
server{
listen 80;
server_name second.local;
location / {
proxy_pass http://second.local;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
保存重啟nginx
在172.16.10.132與172.16.10.133機器上設(shè)置nginx ,打開nginx.conf 在末尾添加以下代碼:
server{
} listen 80; server_name second.local; index index.html index.htm index.php; root /home/wwwroot/default;
保存重啟nginx
完成以上步驟后即可實現(xiàn)second.local 的負載均衡配置了。
六、主服務(wù)器提供服務(wù)
以上例子中,我們都是應(yīng)用到了主服務(wù)器負載均衡到其它服務(wù)器上,那么主服務(wù)器本身能不能也加在服務(wù)器列表中,這樣就不會白白浪費拿一臺服務(wù)器純當做轉(zhuǎn)發(fā)功能,而是也參與到提供服務(wù)中來。
如以上案例三臺服務(wù)器:
,A 服務(wù)器:172.16.10.181
B 服務(wù)器:172.16.10.131
C 服務(wù)器:172.16.10.130 (主服務(wù)器)
我們把域名解析到A 服務(wù)器,然后由A 服務(wù)器轉(zhuǎn)發(fā)到B 服務(wù)器與C 服務(wù)器,那么A 服務(wù)器只做一個轉(zhuǎn)發(fā)功能,現(xiàn)在我們讓A 服務(wù)器也提供站點服務(wù)。
我們先來分析一下,如果添加主服務(wù)器到upstream 中,那么可能會有以下兩種情況發(fā)生:
1、主服務(wù)器轉(zhuǎn)發(fā)到了其它IP 上,其它IP 服務(wù)器正常處理;
2、主服務(wù)器轉(zhuǎn)發(fā)到了自己IP 上,然后又進到主服務(wù)器分配IP 那里,假如一直分配到本機,則會造成一個死循環(huán)。
怎么解決這個問題呢?因為80端口已經(jīng)用來監(jiān)聽負載均衡的處理,那么本服務(wù)器上就不能再使用80端口來處理my.local 的訪問請求,得用一個新的。于是我們把主服務(wù)器的nginx.conf 加入以下一段代碼: server{
} listen 8081; server_name my.local; index index.html index.htm index.php; root /home/wwwroot/default;
重啟nginx ,在瀏覽器輸入my.local:8081試試看能不能訪問。結(jié)果可以正常訪問
,既然能正常訪問,那么我們就可以把主服務(wù)器添加到upstream 中,但是端口要改一下,如下代碼: upstream my.local {
ip_hash; #默認可以不加,加上此行則已ip_hash方式進行負載均衡
#weight為權(quán)重,數(shù)字越大權(quán)重越高
server 172.16.10.131:80 weight=1;
server 172.16.10.130:80 weight=1; server 172.16.10.181:8081 weight=1;
} 由于這里可以添加主服務(wù)器IP 172.16.10.181或者127.0.0.1均可以,都表示訪問自己。 重啟Nginx ,然后再來 刷新
訪問my.lcoal 看看會不會分配到主服務(wù)器上。
主服務(wù)器也能正常加入服務(wù)了。
七、總結(jié)
2)多臺服務(wù)器提供服務(wù),但域名只解析到主服務(wù)器,而真正的服務(wù)器IP 不會被ping 下即可獲得,增加一定安全性。
3)upstream 里的IP 不一定是內(nèi)網(wǎng),外網(wǎng)IP 也可以。不過經(jīng)典的案例是,局域網(wǎng)中某臺IP 暴露在外網(wǎng)下,域名直接解析到此IP 。然后又這臺主服務(wù)器轉(zhuǎn)發(fā)到內(nèi)網(wǎng)服務(wù)器IP 中。
,4)某臺服務(wù)器宕機、不會影響網(wǎng)站正常運行,Nginx 不會把請求轉(zhuǎn)發(fā)到已宕機的IP 上