综合架构负载均衡
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]#