返回顶部

zhangfd

个人博客,仅供学习使用

导航

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]#

posted on 2020-04-24 11:23  zhangfd  阅读(816)  评论(0编辑  收藏  举报