1. upstream模塊
upstream模塊是配置Nginx與後端服務器負載均衡非常重要的一個模塊,並且它還能對後端服務器的健康狀態進行檢查。若後端
服務器中的一臺發生故障,則前端的請求不會轉發到故障的機器。
在nginx.conf配置文件中,用upstream指令定義一組負載均衡後端服務器池。
2. 負載均衡算法
2.1 輪詢算法
每個請求輪流分配到不同的後端服務器,爲默認算法。如果後端服務器宕機,將自動剔除。
[root@CentOS7 ~]# vim /usr/local/nginx/conf/nginx.conf
http {
upstream www.test.com {
server 192.168.146.111;
server 192.168.146.112;
}
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
proxy_pass http://www.test.com;
}
}
}
2.2 最少連接算法
下一個請求被分配給活動連接數最少的服務器。
[root@CentOS7 ~]# vim /usr/local/nginx/conf/nginx.conf
http {
upstream www.test.com {
least_conn;
server 192.168.146.111;
server 192.168.146.112;
}
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
proxy_pass http://www.test.com;
}
}
}
2.3 權重算法
通過將不同的後端服務器設置不同的權重以便實現請求的按比例分配,當後端服務器故障時可以自動剔除該服務器。用於後端服務器性能不均的情況。
[root@CentOS7 ~]# vim /usr/local/nginx/conf/nginx.conf
http {
upstream www.test.com {
server 192.168.146.111 weight=2;
server 192.168.146.112 weight=1;
}server {
listen 80;
server_name localhost;location / {
root html;
index index.html index.htm;
proxy_pass http://www.test.com;
}}
}
2.4 IP哈希算法
此算法根據用戶的客戶端IP將請求分配給後端的服務器,由於源IP相同的客戶端經過IP哈希算法後的值相同,因此同一客戶端的請求可以分配到後端的同一臺服務器上。IP哈希負載均衡主要通過指令ip_hash指定。
[root@CentOS7 ~]# vim /usr/local/nginx/conf/nginx.conf
http {upstream www.test.com {
ip_hash;
server 192.168.146.111;
server 192.168.146.112;
}
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
proxy_pass http://www.test.com;
}
}
}
2.5 Nginx其他配置
在Nginx upstream模塊中,可以設定每臺後端服務器在負載均衡調度中的狀態,常用的狀態有以下幾種。
狀態 | 說明 |
down | 表示當前服務器暫時不參與負載均衡 |
backup | 預留的備份服務器。當其他所有的非backup服務器出現故障或繁忙的時候,纔會請求到backup服務器,因此這臺服務器的訪問壓力最低。可以用於產品的分批次上線 |
weight | 權重值,默認爲1。weight越大,負載的權重就越大。 |
max_fails | 允許請求失敗的次數,默認爲1。當超過最大次數後,返回proxy_next_upstream模塊定義的錯誤。 設置爲0,禁用此服務器的運行狀況檢查 |
fail_timeout | 如果某臺服務器在fail_timeout時間內出現了max_fails次連接失敗,那麼Nginx就會認爲該服務器已經故障,從而剔除該服務器。 |
3.Nginx負載均衡配置
3.1 實例環境
參數 | 說明 |
Nginx調度器 | 192.168.146.101 |
server1 | 192.168.146.111 |
server2 | 192.168.146.112 |
client | 192.168.146.112 |
測試域名 | www.test.com |
Linux版本 | CentOS |
3.2 Nginx調度器配置
[root@CentOS7 ~]# vim /usr/local/nginx/conf/nginx.conf
http {
#用upstream指令定義一組負載均衡後端服務器池,需要下面proxy_pass裏的一樣
upstream www.test.com {
server 192.168.146.111 weight=2;
server 192.168.146.112 weight=1;
}
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
proxy_pass http://www.test.com;
}
}
}
重啓調度器Nginx服務
[root@CentOS7 ~]# /usr/local/nginx/sbin/nginx -s reload
3.3 配置真實服務器節點(兩臺提供服務的服務器)
[root@server1 ~]# vim auto.sh
#!/bin/bash
#關閉防火牆和selinux
systemctl stop firewalld
setenforce 0
#安裝依賴包
#判斷當前主機是否安裝Nginx
if [ -z "$ISINSTALL" ]
then
# wget http://nginx.org/download/nginx-1.16.1.tar.gz
tar -zxvf nginx-1.16.1.tar.gz
cd nginx-1.16.1
./configure --prefix=/usr/local/nginx
make -j 4 && make install
fi
#獲取當前主機IP
CURRENT_IP=`/sbin/ifconfig ens33 | grep -v "inet6" | grep "inet" | awk '{print $2}'`
echo "$CURRENT_IP" > /usr/local/nginx/html/index.html
#測試配置文件是否正確
#啓動Nginx
/usr/local/nginx/sbin/nginx
在server1和server2上執行如下操作
[root@server1 ~]# chmod +x auto.sh
[root@server1 ~]# ./auto.sh
[root@server2 ~]# chmod +x auto.sh
[root@server2 ~]# ./auto.sh
3.4 客戶端配置
在客戶端/etc/hosts添加主機名到域名的映射
[root@client ~]# echo "192.168.146.101 www.test.com" >> /etc/hosts
3.5 測試
負載均衡測試。本實驗基於輪詢的策略。
當把server2服務器(192.168.146.112)停掉,發現只訪問server1。然後查看nginx調度服務器的錯誤日誌。