配置負載均衡服務器集羣php
upstream backend { server x.x.x.x:1023; server x.x.x.x:1024; server x.x.x.x:1025; }
對特定請求進行分發html
server { listen 1111; server_name www.siguoya.name; location / { proxy_pass http://backend; } }
nginx負載均衡在分發請求的時候,默認會採用輪詢的方式。即:nginx
請求順序 | 請求分發 |
---|---|
第一次訪問:http://www.siguoya.name:1111/ | x.x.x.x:1023 |
第二次訪問:http://www.siguoya.name:1111/ | x.x.x.x:1024 |
第三次訪問:http://www.siguoya.name:1111/ | x.x.x.x:1025 |
假如Nginx原本要將請求分發到 x.x.x.x:1024 這臺服務器的,結果這臺服務器掛掉了,那麼Nginx就會將這次請求再分發到x.x.x.x:1025,避免影響到用戶訪問。git
Nginx負載均衡判斷後端服務器掛了的依據:github
proxy_next_upstream
,能夠對後端響應40四、50二、50三、50四、500等狀態碼進行備用處理。ngx_http_upstream_check_module
若是咱們想要測試某個服務器down掉,負載均衡會怎樣處理,能夠登陸到特定的後端服務器,執行以下命令,僞裝該服務器已經down掉:redis
iptables -A INPUT -p tcp --dport 1024 -j DROP
upstream backend { #down表示當前的服務器暫時不可用,不參與負載均衡 server www.aaa.com down; #max_conns=100表示此服務器的最大鏈接數爲100 server www.bbb.com:1234 max_conns=100; #weight表示權重,權重越大,被分配到的次數就越多 server www.ccc.com weight=3; #backup表示這是預留的備份服務器,只在其餘的節點都不可用的時候才啓用 server www.ddd.com backup; #max_fails在連續超過3次失敗後,30秒內不要再分發請求到此服務器,默認fail_timeout爲10秒 server x.x.x.x:8080 max_fails=3 fail_timeout=30s; }
方式 | 說明 |
---|---|
輪詢 | 按時間順序逐一分配 |
加權輪詢 | 權重值越大,被分配到的次數就越多 |
ip_hash | 請求按訪問IP的hash結果來分配,同一個IP固定的訪問某臺後端服務器 |
least_conn | 哪臺服務器鏈接數少,就分發給哪臺服務器 |
url_hash | 按照訪問URL的hash結果來分配,同一URL固定的訪問某臺後端服務器 |
hash關鍵數值 | hash自定義的key |
通過實際測試,ip_hash並不能徹底保持cookies的連續性,最好仍是將cookies存放在redis等內存型數據庫中
upstream heartide { ip_hash; server x.x.x.x:1023; server x.x.x.x:1024; server x.x.x.x:1025; }
能夠經過以下方法,定位負載均衡到底將請求分配給了哪臺服務器,這有助於咱們針對後端集羣中特定的某臺服務器進行調試。shell
add_header Backend-Server $upstream_addr;
nginx.conf
中的 worker_processes
、php.ini
中的 pm
參數等是否設置爲auto
。若是都是 auto
,則能夠買不一樣配置的服務器。若是不是,則須要修改相關配置文件,避免性能參數設置與機器硬件不相匹配專有網絡+EIP+NAT
的解決方案,統一後端集羣服務器的出口IPOSS
中,便於統一存儲、分析Redis
、OSS
等位置進行集中存儲