什麼是負載均衡
當一臺服務器的性能達到極限時,我們可以使用服務器集群來提高網站的整體性能。那麼,在服務器集群中,需要有一臺服務器充當調度者的角色,用戶的所有請求都會首先由它接收,調度者再根據每臺服務器的負載情況將請求分配給某一臺後端服務器去處理。
那麼在這個過程中,調度者如何合理分配任務,保證所有後端服務器都將性能充分發揮,從而保持服務器集群的整體性能最優,這就是負載均衡問題。
基本環境
三臺centos虛擬機(windows也可以),都搭建好了nginx環境。當然也可以使用docker映射三個不同端口的nginx容器進行。centos使用docker搭建nginx環境方法:《使用docker快速搭建nginx+php環境》
三臺主機分別是:
192.168.73.128 主
192.168.73.130
192.168.73.131
首先我們解析個域名codehui.net到主服務器192.168.73.128上
192.168.73.128 codehui.net
步驟
主服務器配置
vi /etc/nginx/nginx.conf
在http節點中加入下面配置,負載均衡的幾種常用方式請查看文尾。
# 負載均衡服務器列表
upstream codehui.net {
server 192.168.73.130:80;
server 192.168.73.131:80;
}
# 監聽80端口的訪問
server{
listen 80;
server_name codehui.net;
location / {
proxy_pass http://codehui.net;
}
}
其他兩臺服務器配置
我們分別在兩臺服務器上新建個入口文件,作為區分
echo " index.php
echo " index.php
如果要配置其他功能,可以在nginx.conf中加入如下方法
server{
listen 80;
server_name codehui.net;
root /usr/share/nginx/www;
location / {
index index.php index.html;
}
}
注意重啟nginx服務
service nginx reload
測試
可以看到兩次請求分發到了不同服務器
![nginx搭建簡易負載均衡服務](http://p2.ttnews.xyz/loading.gif)
代碼匯
![nginx搭建簡易負載均衡服務](http://p2.ttnews.xyz/loading.gif)
代碼匯
負載均衡的幾種常用方式
1、 輪詢(默認)
每個請求按時間順序逐一分配到不同的後端服務器,如果後端服務器down掉,能自動剔除。
upstream nginx_server {
server server1;
server server1;
}
2、weight
指定輪詢幾率,weight和訪問比率成正比,用於後端服務器性能不均的情況。
upstream nginx_server {
server server1 weight=4;
server server2 weight=6;
}
權重越高,在被訪問的概率越大,如上例,分別是40%,60%。
3、 ip_hash
上述方式存在一個問題就是說,在負載均衡系統中,假如用戶在某臺服務器上登錄了,那麼該用戶第二次請求的時候,因為我們是負載均衡系統,每次請求都會重新定位到服務器集群中的某一個,那麼已經登錄某一個服務器的用戶再重新定位到另一個服務器,其登錄信息將會丟失,這樣顯然是不妥的。
我們可以採用ip_hash指令解決這個問題,如果客戶已經訪問了某個服務器,當用戶再次訪問時,會將該請求通過哈希算法,自動定位到該服務器。
每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個後端服務器,可以解決session的問題。
upstream nginx_server {
ip_hash;
server server1;
server server2;
}
4、 fair (第三方)
upstream nginx_server {
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;
}
每個設備的狀態設置為:
- down 表示單前的server暫時不參與負載
- weight 默認為1.weight越大,負載的權重就越大
- max_fails:允許請求失敗的次數默認為1.當超過最大次數時,返回proxy_next_upstream模塊定義的錯誤
- fail_timeout : max_fails次失敗後,暫停的時間
- backup: 其它所有的非backup機器down或者忙的時候,請求backup機器。所以這臺機器壓力會最輕。
- 配置實例:
#user nobody;
worker_processes 4;
events {
# 最大併發數
worker_connections 1024;
}
http{
# 待選服務器列表
upstream myproject{
# ip_hash指令,將同一用戶引入同一服務器。
ip_hash;
server 125.219.42.4 fail_timeout=60s;
server 172.31.2.183;
}
server{
# 監聽端口
listen 80;
# 根目錄下
location / {
# 選擇哪個服務器列表
proxy_pass http://myproject;
}
}
}
鏈接:https://www.jianshu.com/p/445e42429d62
閱讀更多 思夢PHP 的文章