綜合架構負載均衡
00. 內容說明:
1) LNMP架構和存儲服務器建立關系
2) LNMP架構和數據庫服務器建立關系(數據遷移)
3) nginx負載均衡概念介紹
4) nginx負載均衡環境准備
5) nginx負載均衡設置過程
6) nginx負載均衡擴展說明
7) nginx負載均衡企業應用
a 根據用戶的訪問uri信息進行負載均衡(動靜分離的架構)
b 根據用戶的user-agent信息進行負載均衡
(user-agent表示不同瀏覽器或手機和客戶端顯示不同頁面)
01. nginx及LNMP回顧:
https://www.cnblogs.com/moox/category/1696785.html
1) 網站服務器nginx服務概念
2) 網站服務器nginx服務部署
3) 網站服務器nginx服務配置
4) 網站服務器nginx服務應用
5) 網站LNMP架構(搭建網站頁面-wordpress)
02. 上文LNMP遺留問題:
- 上傳主題提示主題比較大,413 Request Entity Too Large --- nginx需要添加一個指令???
- 圖片保存在服務器什么位置了,如何將圖片保存在存儲服務器中
- 數據庫服務安裝在web服務器本地有沒有問題???
- 如何將數據庫數據遷移到指定服務器中
1) 上傳wordpress主題,報413錯誤,如何解決?
總結:
第一個歷程: 修改nginx配置文件(http、server、location都可以)
vim /etc/nginx/conf.d/blog.conf
server{
listen 80;
server_name blog.moox.com;
client_max_body_size 50m; --- 指定用戶上傳數據的大小限制(默認1M)
location ~ \.php$ {
root /html/blog;
fastcgi_index index.php; #url #uri
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass 127.0.0.1:9000;
include fastcgi_params; #變量配置文件
}
}
nginx -t
systemctl reload nginx
第二個歷程: 修改/etc/php.ini配置文件
upload_max_filesize = 50M --- 使PHP接收用戶上傳的更大的數據(默認2M)
systemctl reload php-fpm.service
2) 如何讓LNMP架構和存儲服務器建立關系
-
第一個歷程: 找出圖片存儲的目錄
- 01方法: 根據圖片鏈接地址uri獲取圖片存儲位置
http://blog.oldboy.com /wp-content/uploads/2020/04/meinv-1024x1024.jpg
url uri - 02方法: 先定位數據存放在站點目錄中
find /html/blog -type f -mmin -5 -- 5分鍾內查找,Mtime參數是按天查找
inotifywait -mrq /html/blog
- 01方法: 根據圖片鏈接地址uri獲取圖片存儲位置
-
第二個歷程: 使web服務器和存儲服務器建立關系
檢查存儲服務是否正常
編寫存儲服務配置文件
## web服務器172.16.1.7
[root@web01 conf.d]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data 172.16.1.0/24
[root@web01 conf.d]# mount -t nfs 172.16.1.31:/data /mnt
[root@web01 conf.d]# df -h
Filesystem Size Used Avail Use% Mounted on
172.16.1.31:/data 17G 1.7G 16G 10% /mnt
--------------------------------------------------
## nfs服務器172.16.1.31
[root@nfs01 etc]# cat exports
#/data 172.16.1.0/24(rw,sync)
/data/blog 172.16.1.0/24(rw,sync)
/data/www 172.16.1.0/24(rw,sync)
/data/bbs 172.16.1.0/24(rw,sync)
[root@nfs01 etc]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data/bbs 172.16.1.0/24
/data/www 172.16.1.0/24
/data/blog 172.16.1.0/24
mkdir /data/{bbs,blog,www}
--------------------------------------------------
## web服務器172.16.1.7
## 將web服務器blog存儲的數據進行遷移
mv /html/blog/wp-content/uploads/ /tmp
mount -t nfs 172.16.1.31:/data/blog /html/blog/wp-content/uploads
mv /tmp/2020/ /html/blog/wp-content/uploads/
## 此時查看## nfs服務器172.16.1.31:/data/blog下存儲服務器無法存儲數據,看下方解決
- 默認存儲服務器無法存儲數據:
[root@nfs01 data]# cat /var/lib/nfs/etab
/data/blog 172.16.1.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,\
root_squash,no_all_squash,\ ## 此處指定了用戶權限
no_subtree_check,secure_locks,acl,no_pnfs,\
anonuid=65534,anongid=65534,\ ## 此處指定了用戶id
sec=sys,rw,secure,root_squash,no_all_squash)
管理用戶無法存儲: root_squash ## root映射成nfsnobody,root用戶無法存儲
普通用戶無法存儲: no_all_squash
解決:
第一個歷程: 普通用戶--修改nfs配置文件,定義映射用戶為www
## web服務器172.16.1.7上www用戶id為1001
[root@web01 wp-content]# id www
uid=1001(www) gid=1001(www) groups=1001(www)
## 在nfs服務器172.16.1.31上創建一樣id為1001的www用戶
[root@nfs01 data]# useradd www -u 1001
[root@nfs01 data]# chown -R www /data
第二個歷程: root用戶-- 可以上傳數據的方法
[root@nfs01 data]# sed -ri.bak 's#(sync)#\1,anonuid=1001,anongid=1001#g' /etc/exports
[root@nfs01 data]# systemctl reload nfs
## 再次上傳數據或將數據移回,即可看到數據已同步遷移。問題解決
3) 如何讓LNMP架構和數據庫服務器建立關系???
為什么要建立聯系?因為多台web服務器負載均衡時,額外的一台服務器nfs可以共享文件,但不能共享數據庫;此時就另外需要一台數據庫服務器作為共享數據庫服務器。數據庫獨立出來
- 第一個歷程: 將web服務器(172.16.1.7)本地數據庫數據進行備份
mysqldump -uroot -poldboy123 --all-database >/tmp/web_back.sql
- 第二個歷程: 將備份數據進行遷移(172.16.1.7)
scp -rp /tmp/web_back.sql 172.16.1.51:/tmp
- 第三個歷程: 恢復數據信息(172.16.1.51)
yum install -y mariadb-server mariadb
systemctl start mariadb.service
systemctl enable mariadb.service
mysqladmin -u root password='oldboy123'
mysql -uroot -poldboy123 </tmp/web_back.sql
mysql -uroot -poldboy123;show databases;--查看是否有WordPress
- 第四個歷程: 修改數據庫服務器中數據庫用戶信息
-- 查詢數據庫用戶信息
MariaDB [(none)]> select user,host from mysql.user;
+-----------+-----------+
| user | host |
+-----------+-----------+
| root | 127.0.0.1 |
| root | ::1 |
| | localhost |
| root | localhost |
| wordpress | localhost | -- 此處localhost默認只能本地連接
| | web01 |
| root | web01 |
+-----------+-----------+
7 rows in set (0.00 sec)
-- 優化: 刪除無用的用戶信息
delete from mysql.user where user="" and host="localhost";
delete from mysql.user where user="" and host="web01";
-- 添加或授權: 添加新的用戶信息,允許172.16.1.%網段的主機能遠程連數據庫
grant all on wordpress.* to 'wordpress'@'172.16.1.%' identified by 'oldboy123';
flush privileges; -- 授權后刷新權限
-- 測試是否添加成功(172.16.1.7)
mysql -uwordpress -poldboy123 -h 172.16.1.51
-
第五個歷程: 修改web服務器代碼文件信息(172.16.1.7/8/9)
vim wp-config.php /** MySQL hostname */ define( 'DB_HOST', '172.16.1.51' ); ## 修改另外兩台web rsync -avz /html/blog/wp-config.php 172.16.1.8:/html/blog/
-
第六個歷程: 停止web服務器上數據庫服務(172.16.1.7/8/9)
systemctl stop mariadb.service systemctl disable mariadb.service
問題01:
數據庫服務沒有正確啟動: Error establishing a database connection 連接不上3306端口
問題02:
PHP服務沒有開啟,報502錯誤。客戶端請求nginx,nginx需要php處理,但php沒有啟動。
4) 代碼信息遷移問題
web01代碼信息遷移到web02服務器,並且修改了網站域名無法正確訪問
訪問新域名會自動跳轉到老的域名
方法一:
修改wordpres后台設置信息,將后台中老的域名改為新的域名
方法二:
修改數據庫中的一個表, 在表中修改一個和域名有關的條目信息 (update phpmyadmin)
03. (反向代理)負載均衡的概念說明
什么是集群?
完成相同任務或工作的一組服務器 (web01 web02 web03 -- web集群)
什么是負載均衡?
1) 實現用戶訪問請求進行調度分配
2) 實現用戶訪問壓力分擔
什么是反向代理?
反向代理: 外網 ---> (eth0外網) 代理服務器 (eth1內網) ---> 公司網站服務器web(內網)
外網用戶(客戶端) --- 代理服務器 (服務端)
代理服務器(客戶端) --- web服務器(服務端)
正向代理: 內網(局域網主機) --- (內網)代理服務器(外網) --- 互聯網 --- web服務器(日本)
FQ的操作
04. 准備負載均衡的環境搭建
集群服務器部署(web01 web02 web03)
負載均衡服務器部署
集群服務器部署:
PS: 集群中每天服務器的配置一模一樣
-
企業環境中:
- 先部署好一台LNMP服務器,上傳代碼信息
- 進行訪問測試
- 批量部署多台web服務器
- 將nginx配置文件進行分發
- 將站點目錄分發給所有主機
-
虛擬機實驗中:
- 將web01作為模板主機克隆兩台主機
## 修改web02-- 172.16.1.8 [root@web01 ~]# grep 7 /etc/sysconfig/network-scripts/ifcfg-ens3[34] /etc/sysconfig/network-scripts/ifcfg-ens33:IPADDR=10.0.0.7 /etc/sysconfig/network-scripts/ifcfg-ens34:IPADDR=172.16.1.7 sed -i 's#\.7#.8#g' /etc/sysconfig/network-scripts/ifcfg-ens3[34] hostnamectl set-hostname web02 grep 8 /etc/sysconfig/network-scripts/ifcfg-ens3[34] systemctl restart network.service ## 修改web03-- 172.16.1.9 sed -i 's#\.7#.9#g' /etc/sysconfig/network-scripts/ifcfg-ens3[34] hostnamectl set-hostname web03 grep 9 /etc/sysconfig/network-scripts/ifcfg-ens3[34] systemctl restart network.service
-
2.利用手動方式實現負載均衡:
修改windows的hosts主機地址和域名映射文件
10.0.0.7 blog.moox.com -- 此時在博客上發布時,切換到10.0.0.8或10.0.0.9時不能看到 ## 10.10.0.0.8 blog.moox.com -- 此時在博客上發布時,切換到10.0.0.7或10.0.0.9時不能看到 ## 10.10.0.0.9 blog.moox.com -- 此時在博客上發布時,切換到10.0.0.8或10.0.0.7時不能看到 ## 以上問題的原因: 手動模擬負載均衡時,上傳的文件aa.jpg存放在不同的服務器上(如10.0.0.7),域名映射不同的主機地址(如10.0.0.8)時,由於各服務器之間沒有實現文件共享,自然文件就不存在aa.jpg了。 ## 解決辦法:共享文件 將各web服務器都共享文件到存儲服務器(nfs上) mount -t nfs 172.16.1.31:/data/blog/ /html/blog/wp-content/uploads 這樣就通過存儲服務器實現了個web服務器的文件共享。
負載均衡服務器部署:
模板機克隆一台負載均衡服務器lb01-172.16.1.5
修改IP信息*.5,修改主機名lb01
- 第一個歷程: 安裝部署nginx軟件
## 安裝nginx源
[root@lb01 ~]# cat /etc/yum.repos.d/nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
## yum 安裝
yum install -y nginx
## 瀏覽器網頁輸入172.16.1.5測試是否安裝成功
- 第二個歷程: 編寫nginx負載服務配置文件
ngx_http_upstream_module --- upstream 負載均衡 OK
ngx_http_proxy_module --- proxy_pass 反向代理
## 編寫/etc/nginx/nginx.conf
cd /etc/nginx && cp nginx.conf{,.bak}
grep -Ev "^$|#" /etc/nginx/nginx.conf.bak > nginx.conf
useradd www -u 1001 -s /sbin/nologin -M
user www;
----------------------------------------------------------------------------
## 編寫 /etc/nginx/conf.d/lb.conf
/etc/nginx/conf.d && grep -Ev "^$|#" default.conf > lb.conf
## 注意:upstream 模塊只能放在http中,也就是放在/etc/nginx/nginx.conf中的http;
## 但server模塊默認也會被加載,所以放在/etc/nginx/conf.d/*.conf中也可以
## 定義可以將請求分配給哪些服務器
upstream moox {
server 10.0.0.7:80;
server 10.0.0.8:80;
server 10.0.0.9:80;
}
## 將請求分配給指定集群(即指定組)
server {
listen 80;
server_name www.moox.com; ## 負載均衡的域名
location / {
proxy_pass http://moox; ## 組名稱(集群名稱)
}
}
systemctl reload nginx
- 第三個歷程: 實現負載功能測試
- 搭建集群測試環境:
# 各Linux web服務器
for name in www bbs blog;do echo "$name 10.0.0.7">/html/$name/wenwen.html;done
for name in www bbs blog;do echo "$name 10.0.0.8">/html/$name/wenwen.html;done
for name in www bbs blog;do echo "$name 10.0.0.9">/html/$name/wenwen.html;done
## linux /etc/hosts解析
172.16.1.7 web01 www.moox.com bbs.moox.com blog.moox.com (8,9不解析)
172.16.1.8 web02 www.moox.com bbs.moox.com blog.moox.com (7,9不解析)
172.16.1.9 web03 www.moox.com bbs.moox.com blog.moox.com (8,7不解析)
#修改windows解析文件
10.0.0.5 www.moox.com blog.moox.com bbs.moox.com
## 測試負載均衡
瀏覽器輸入並刷新: www.moox.com/wenwen.html或bbs.moox.com/wenwen.html
或blog.moox.com/wenwen.html
-
抓包效果10.0.0.1相當於客戶端
負載均衡訪問網站異常排錯思路:
- 第一步: 負載均衡服務器上, 測試后端web節點服務器是否能夠正常訪問
[root@lb01 conf.d]# curl -H host:www.moox.com 10.0.0.7/wenwen.html
www 10.0.0.7
[root@lb01 conf.d]# curl -H host:www.moox.com 10.0.0.8/wenwen.html
www 10.0.0.8
[root@lb01 conf.d]# curl -H host:www.moox.com 10.0.0.9/wenwen.html
www 10.0.0.9
- 第二步: 負載均衡服務器上, 利用curl命令訪問負載均衡服務器
主配置文件/etc/nginx/nginx.conf和
負載均衡文件/etc/nginx/conf.d/lb.conf
- 第三步: 打開一個xshell連接 ping www.moox.com
- 第四步: 配置文件編寫不正確
05. 負載均衡配置模塊詳細說明
ngx_http_upstream_module --- upstream 負載均衡 OK
ngx_http_proxy_module --- proxy_pass 反向代理
ngx_http_upstream_module --- upstream
- 實現不同調度功能
1. 輪詢分配請求(平均)
```bash
## /etc/nginx/conf.d/lb.conf
upstream moox {
server 10.0.0.7:80;
server 10.0.0.8:80;
server 10.0.0.9:80;
}
curl -H host:www.moox.com 10.0.0.5:/wenwen.html
```
2. 權重分配請求(weight)
```bash
## /etc/nginx/conf.d/lb.conf
upstream moox {
server 10.0.0.7:80 weight=3; -- 權重值越大,責任越大
server 10.0.0.8:80 weight=2;
server 10.0.0.9:80 weight=1;
}
測試:
curl -H host:www.moox.com 10.0.0.5:/wenwen.html
```
3. 實現熱備功能(backup)
```bash
## /etc/nginx/conf.d/lb.conf
upstream moox {
server 10.0.0.7:80;
server 10.0.0.8:80;
server 10.0.0.9:80 backup; -- 只有當7,8都全部不能使用時,backup的9才能使用
}
```
4. 定義最大失敗次數 健康檢查參數
max_fails=5
5. 定義失敗之后重發的間隔時間 健康檢查參數
fail_timeout=10s 會給失敗的服務器一次機會
6. 參數說明:


- 實現不同調度算法
- rr 輪詢調度算法
- wrr 權重調度算法
- ip_hash 算法 (出現反復登錄的時候)
- least_conn 根據服務器連接數分配資源(分配給連接少的)
- fair -- 分配給響應最快的(目前已經不支持次功能)
ngx_http_proxy_module --- proxy_pass
proxy_set_header Host
-
- 訪問不同的網站地址,不能顯示不同的網站頁面 (面試題)
## proxy_set_header Host $host;
## 放在/etc/nginx/conf.d/lb.conf的每個server中location下
server {
listen 80;
server_name bbs.moox.com;
location / {
proxy_pass http://moox_lb;
proxy_set_header Host $host; ## 注意位置,作用是將負載的主機設置為客戶端請求的主機
}
proxy_set_header X-Forwarded-For
-
- 訪問網站用戶地址信息無法進行分析統計 (面試題)
說明:在統計訪問地址時, /var/log/nginx/access.log中第一列是web主機地址或負載均衡服務器主機地址,
最后一列是客戶端主機地址,在/etc/nginx/nginx.conf的log_format中定義的最后胡一個字段"$http_x_forwarded_for"
proxy_set_header X-Forwarded-For $remote_addr; ## $remote_addr表示客戶端地址
## 負載均衡服務器/etc/nginx/conf.d/lb.conf中每個serve中的location
server {
listen 80;
server_name bbs.moox.com;
location / {
proxy_pass http://moox_lb;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr; ## bbs和www所在server也要添加
}
### 網頁刷新測試www.moox.com/wenwen.html
tail -f /var/log/nginx/www_access.log
10.0.0.5 - oldboy [24/Apr/2020:10:51:27 +0800] "GET /wenwen.html HTTP/1.0"
200 13 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.122 Safari/537.36"
"10.0.0.1"
proxy_next_upstream
-
- 訪問負載均衡會出現錯誤頁面,影響用戶體驗
當頁面訪問錯誤,超時,無效頭部等情況,如web01中mv /html/www/wenwen.html /tmp
此時由於負載均衡,頁面能正常訪問,但有時會報404-NOT FOUND錯誤,影響體驗
##proxy_next_upstream error timeout http_404 http_502 http_403; --更多的可加http_***;
server {
listen 80;
server_name www.moox.com;
location / {
proxy_pass http://moox_lb;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_next_upstream error timeout http_404 http_502 http_403;
}
總結:
- 總結Module ngx_http_proxy_module
- 總結Module ngx_http_upstream_module
- 高可用服務 keepalived
提前克隆好一台新的lb02主機 lb01+lb02 高可用集群(HA)
負載均衡完整配置文件
[root@lb01 conf.d]# cat lb.conf
upstream moox_lb{
server 10.0.0.7:80 ;
server 10.0.0.8:80 ;
server 10.0.0.9:80 ;
}
server {
listen 80;
server_name www.moox.com;
location / {
proxy_pass http://moox_lb;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_next_upstream error timeout http_404 http_502 http_403;
}
}
server {
listen 80;
server_name blog.moox.com;
location / {
proxy_pass http://moox_lb;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_next_upstream error timeout http_404 http_502 http_403;
}
}
server {
listen 80;
server_name bbs.moox.com;
location / {
proxy_pass http://moox_lb;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_next_upstream error timeout http_404 http_502 http_403;
}
}
[root@lb01 conf.d]#