本地搭建4台nginx虛拟機,其中一台做負載均衡伺服器,做轉發處理。
192.168.0.104 主伺服器,做轉發處理
192.168.0.106
192.168.0.107
192.168.0.108
我本地虛拟機搭建用的軟體是VMware+center os7+寶塔
負載均衡幾種常用方式
1、輪詢(預設)
每個請求按時間順序逐一配置設定到不同的後端伺服器,如果後端伺服器down掉,能自動剔除。
upstream backserver {
server 192.168.0.14;
server 192.168.0.15;
}
2、weight
指定輪詢幾率,weight和通路比率成正比,用于後端伺服器性能不均的
情況。
upstream backserver {
server 192.168.0.14 weight=3;
server 192.168.0.15 weight=7;
}
權重越高,在被通路的機率越大,如上例,分别是30%,70%。
3、ip_hash
上述方式存在一個問題就是說,在負載均衡系統中,假如使用者在某台伺服器上登入了,那麼該使用者第二次請求的時候,因為我們是負載均衡系統,每次請求都會重新定位到伺服器叢集中的某一個,那麼已經登入某一個伺服器的使用者再重新定位到另一個伺服器,其登入資訊将會丢失,這樣顯然是不妥的。
我們可以采用ip_hash指令解決這個問題,如果客戶已經通路了某個伺服器,當使用者再次通路時,會将該請求通過雜湊演算法,自動定位到該伺服器。
每個請求按通路ip的hash結果配置設定,這樣每個訪客固定通路一個後端伺服器,可以解決session的問題。
upstream backserver {
ip_hash;
server 192.168.0.14:88;
server 192.168.0.15:80;
}
4、fair(第三方)
按後端伺服器的響應時間來配置設定請求,響應時間短的優先配置設定。
upstream backserver {
server server1;
server server2;
fair;
}
5、url_hash(第三方)
按通路url的hash結果來配置設定請求,使每個url定向到同一個(對應的)後端伺服器,後端伺服器為緩存時比較有效。
upstream backserver {
server squid1:3128;
server squid2:3128;
hash $request_uri;
hash_method crc32;
}
在需要使用負載均衡的server中增加
proxy_pass http://backserver/;
upstream backserver{
ip_hash;
server 127.0.0.1:9090 down; (down 表示單前的server暫時不參與負載)
server 127.0.0.1:8080 weight=2; (weight 預設為1.weight越大,負載的權重就越大)
server 127.0.0.1:6060;
server 127.0.0.1:7070 backup; (其它所有的非backup機器down或者忙的時候,請求backup機器)
}
max_fails :允許請求失敗的次數預設為1.當超過最大次數時,傳回proxy_next_upstream 子產品定義的錯誤
fail_timeout:max_fails次失敗後,暫停的時間
實操
主伺服器配置
upstream 192.168.0.104{
#ip_hash;# ip_hash方式
server 192.168.0.106;
server 192.168.0.107;
server 192.168.0.108;
}
server
{
listen 80;
server_name 192.168.0.104;
index index.php index.html index.htm default.php default.htm default.html;
root /www/wwwroot/192.168.0.104;
# 省略寶塔預設配置...
# 添加代理轉發
location / {
proxy_pass http://192.168.0.104;
}
access_log /www/wwwlogs/192.168.0.104.log;
error_log /www/wwwlogs/192.168.0.104.error.log;
}
其他3個伺服器配置,均解析主伺服器ip
# 192.168.0.106
server
{
listen 80;
server_name 192.168.0.104 192.168.0.106;# 這裡
# 省略寶塔預設配置...
}
# 192.168.0.107
server
{
listen 80;
server_name 192.168.0.104 192.168.0.107;# 這裡
# 省略寶塔預設配置...
}
# 192.168.0.108
server
{
listen 80;
server_name 192.168.0.104 192.168.0.108;# 這裡
# 省略寶塔預設配置...
}
其他3個伺服器目錄下的腳本
<?php
echo '2';// 其他2個改成 3 4
echo '<pre>';
var_dump($_SERVER);
然後通路 http://192.168.0.104/,會依次轉發到3個伺服器
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5iYlNzNlRDOmRWYhlDOyEmYhRGOxAzM1UTZwQTZ5MDOj9CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
模拟其中一台故障
直接把nginx停止了,再通路,nginx會自動排除這台故障機,隻給其中2台轉發。
假如負載均衡服務故障了呢?
使用Keepalived實作高可用
參考我的另一篇:
https://blog.csdn.net/qq_31288929/article/details/111523539
參考其他部落客文章:
https://www.jianshu.com/p/b61b24324c32
https://blog.csdn.net/l1028386804/article/details/72801492
https://www.jianshu.com/p/a6b5ab36292a
session共享問題
可以使用ip_hash方式,或者參考
https://www.cnblogs.com/phper12580/p/10520908.html
1、使用Ip_hash
直接在upstream裡添加 ip_hash;
2、使用Redis或者Memcache
這裡使用redis測試。
主伺服器開啟redis伺服器。
其他3台伺服器安裝php-redis拓展,并修改session儲存方式為redis
我這裡是用的寶塔,如果不是用的寶塔就百度一下安裝php-redis拓展和修改php儲存方式為redis的方法。
如果出現 warning:session_start(): Failed to read session data,請重載主伺服器的redis配置
3、測試
在第二台伺服器添加一個session,檢視其他幾台有沒有。
第二台代碼:
第三、四台:
通路:
現在session已經成功在3台伺服器中共享。
以下省略。。。
最近弄了幾個站,留個外鍊
ITM遊戲資源
ITM資源