Nginx:綜合架構負載均衡 -- nginx負載均衡介紹部署及應用


綜合架構負載均衡

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遺留問題:

  1. 上傳主題提示主題比較大,413 Request Entity Too Large --- nginx需要添加一個指令???
  2. 圖片保存在服務器什么位置了,如何將圖片保存在存儲服務器中
  3. 數據庫服務安裝在web服務器本地有沒有問題???
  4. 如何將數據庫數據遷移到指定服務器中

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
  • 第二個歷程: 使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: 集群中每天服務器的配置一模一樣

  • 企業環境中:

    1. 先部署好一台LNMP服務器,上傳代碼信息
    2. 進行訪問測試
    3. 批量部署多台web服務器
    4. 將nginx配置文件進行分發
    5. 將站點目錄分發給所有主機
  • 虛擬機實驗中:

    1. 將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相當於客戶端

    image-20200423155252638

負載均衡訪問網站異常排錯思路:

  • 第一步: 負載均衡服務器上, 測試后端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. 參數說明:

   ![image-20200423165540089](C:%5CUsers%5Czhangfd%5CPictures%5Ctypora%5Cimage-20200423165540089.png)

   ![image-20200423165552448](C:%5CUsers%5Czhangfd%5CPictures%5Ctypora%5Cimage-20200423165552448.png)
  • 實現不同調度算法
    1. rr 輪詢調度算法
    2. wrr 權重調度算法
    3. ip_hash 算法 (出現反復登錄的時候)
    4. least_conn 根據服務器連接數分配資源(分配給連接少的)
    5. fair -- 分配給響應最快的(目前已經不支持次功能)

ngx_http_proxy_module --- proxy_pass

proxy_set_header Host
    1. 訪問不同的網站地址,不能顯示不同的網站頁面 (面試題)
## 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
    1. 訪問網站用戶地址信息無法進行分析統計 (面試題)

說明:在統計訪問地址時, /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
    1. 訪問負載均衡會出現錯誤頁面,影響用戶體驗

當頁面訪問錯誤,超時,無效頭部等情況,如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;
    }

總結:

  1. 總結Module ngx_http_proxy_module
  2. 總結Module ngx_http_upstream_module
  3. 高可用服務 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]#


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM