Nginx負載均衡配置及算法詳解
yjssjm 2020-03-12 21:57:53 2148 收藏 13 原力計划
分類專欄: 筆記 文章標簽: linux 運維 nginx
版權
筆記
專欄收錄該內容
36 篇文章1 訂閱
訂閱專欄
1.簡單介紹負載均衡
如果你的nginx服務器給2台web服務器做代理,負載均衡算法采用輪詢,那么當你的一台機器web程序關閉造成web不能訪問,那么nginx服務器分發請求還是會給這台不能訪問的web服務器,如果這里的響應連接時間過長,就會導致客戶端的頁面一直在等待響應,對用戶來說體驗就打打折扣,這里我們怎么避免這樣的情況發生呢。這里我配張圖來說明下問題。
如果負載均衡中其中web2發生這樣的情況,nginx首先會去web1請求,但是nginx在配置不當的情況下會繼續分發請求到web2,然后等待web2響應,直到我們的響應時間超時,才會把請求重新分發給web1,這里的響應時間如果過長,用戶等待的時間就會越長。
2.准備工作
三台裝有nginx的虛擬機,一台做反向代理服務器,另外兩台做真實服務器,模擬負載均衡。
192.168.13.129 #反向代理服務器 192.168.13.133 #真實服務器 192.168.13.139 #真實服務器
3.三台服務器的配置
#我們在反向代理服務器上(192.168.13.139)進行如下配置: [root@real-server ~]# vim /etc/nginx/conf.d/default.conf #清空並添加以下內容 upstream test_server { server 192.168.13.133:8080; server 192.168.13.139:8080; } server { listen 80; server_name localhost; location / { proxy_pass http://test_server; } } [root@server ~]# nginx -t [root@server ~]# nginx -s reload
第一台真實服務器配置(192.168.13.133): [root@real-server ~]# vim /etc/nginx/conf.d/default.conf 清空並添加以下內容 server { listen 80; server_name localhost; location / { root /usr/share/nginx/html/login; index index.html index.html; } } [root@real-server ~]# nginx -t [root@real-server ~]# nginx -s reload #創建目錄和文件並寫入測試數據 [root@real-server ~]# mkdir -p /usr/share/nginx/html/login [root@real-server ~]# echo "this is first real-server" > /usr/share/nginx/html/login/index.html
第二台真實服務器配置(192.168.13.139): [root@real-server ~]# vim /etc/nginx/conf.d/default.conf 清空並添加以下內容 server { listen 80; server_name localhost; location / { root /usr/share/nginx/html/login; index index.html index.html; } } [root@real-server ~]# nginx -t [root@real-server ~]# nginx -s reload #創建目錄和文件並寫入測試數據 [root@real-server ~]# mkdir -p /usr/share/nginx/html/login [root@real-server ~]# echo "this is second real-server" > /usr/share/nginx/html/login/index.html
測試:
打開網頁輸入反向代理服務器ip:http://192.168.13.129/
刷新一下
4.負載均衡算法
upstream 支持4種負載均衡調度算法:
A、輪詢(默認):每個請求按時間順序逐一分配到不同的后端服務器;
B、ip_hash:每個請求按訪問IP的hash結果分配,同一個IP客戶端固定訪問一個后端服務器。可以保證來自同一ip的請求被打到固定的機器上,可以解決session問題。
C、url_hash:按訪問url的hash結果來分配請求,使每個url定向到同一個后端服務器。后台服務器為緩存的時候效率。
D、fair:這是比上面兩個更加智能的負載均衡算法。此種算法可以依據頁面大小和加載時間長短智能地進行負載均衡,也就是根據后端服務器的響應時間來分配請求,響應時間短的優先分配。Nginx本身是不支持 fair的,如果需要使用這種調度算法,必須下載Nginx的 upstream_fair模塊。
配置實例
1、熱備:如果你有2台服務器,當第一台服務器發生事故時,才啟用第二台服務器給提供服務。
upstream test_server { server 192.168.13.133:80; server 192.168.13.139:80 backup; }
然后再次訪問方向代理服務器ip
2.輪詢:nginx默認就是輪詢其權重都默認為1,服務器的訪問順序就是第一台服務器,第二台,第一台,第二台然后再次循環(因為默認是輪詢,所以不需要加任何參數)
3、加權輪詢:跟據配置的權重的大小而分發給不同服務器不同數量的請求。如果不設置,則默認為1。
upstream test_server { server 192.168.13.133:80 weight=1; server 192.168.13.139:80 weight=3; }
4、ip_hash:nginx會讓相同的客戶端ip請求相同的服務器。
upstream test_server { server 192.168.13.133:80; server 192.168.13.139:80; ip_hash; }
5、nginx負載均衡配置狀態參數
down,表示當前的server暫時不參與負載均衡。
backup,預留的備份機器。當其他所有的非backup機器出現故障或者忙的時候,才會請求backup機器,因此這台機器的壓力最輕。
max_fails,允許請求失敗的次數,默認為1。當超過最大次數時,返回錯誤。
fail_timeout,在經歷了max_fails次失敗后,暫停服務的時間單位秒。max_fails可以和fail_timeout一起使用。
upstream test_server { server 192.168.13.133:80 weight=2 max_fails=2 fail_timeout=2; #加權輪詢的權值是2,允許請求失敗兩次,然后暫停服務兩秒 server 192.168.13.139:80 weight=3 max_fails=3 fail_timeout=3; #加權輪詢的權值是3,允許請求失敗三次,然后暫停服務三秒 }