一、Nginx均衡调度算法
Nginx七层负载均衡分为5种调度算法
调度算法 |
概述 |
轮询(常用) |
按时间顺序逐一分配到不同的后端服务器(默认) |
weight(面试点) |
加权轮询,weight值越大,分配到的访问几率越高 |
ip_hash(面试点) |
每个请求按访问IP的hash结果分配,这样来自同一IP的固定访问一个后端服务器 |
url_hash |
按照访问URL的hash结果来分配请求,是每个URL定向到同一个后端服务器 |
least_hash |
最少链接数,那个机器链接数少就分发 |
1.1 加权轮询
比如实现访问5次web01,1次web02
当web服务器配置不相同,有差距时,可以用此方法
在lb01
配置
1.2 ip_hash
PS:不能与weight一起使用
根据请求的IP地址,固定访问到某一后端,除非已选择的后端down了,有点浪费资源
在lb01
配置
二、Nginx负载均衡后端状态
状态 |
概述 |
down |
当前的server暂时不参与负载均衡 |
backup |
预留的备份服务器 |
max_conns |
限制最大的接收连接数 |
max_fails(健康检查) |
允许请求失败的次数(不够精准,作用不大,得知道,面试会问) |
fail_timeout(健康检查) |
经过max_fails失败后, 服务暂停时间 |
2.1 down状态
一般用于停机维护
在lb01
配置,可见当两台web的Nginx服务都正常时,只能访问web02,当web02的Nginx服务挂了,返回502
2.2 backup状态
在lb01
配置,可见当两台web都正常时,只能访问web02,如果web02的服务挂了,会访问web01,当web02恢复后,再次访问到的是web02
2.3 健康检查
自带的健康检查不够精准,且看不到信息,面试会问
三、第三方健康检查模块check_upstream
检测更精准,且有页面可以展示服务端的状态,需要编译安装
3.1 编译安装Nginx
1、安装依赖包
2、下载Nginx源码及第三方模块源码
PS:为保持一致,先通过yum源安装nginx,这是当前实验环境的Nginx版本
[root@lb01 nginx]# nginx -version
nginx version: nginx/1.20.1
3、解压nginx源码包以及第三方模块
4、打补丁
打补丁(nginx的版本是1.20.1补丁就选择1.20.1的,p1代表在nginx目录,p0是不在nginx目录)
5、编译Nginx,附带模块参数
通过nginx -V获取configure参数,尽量保持一致
–add-module=/root/nginx_upstream_check_module-master
6、在已有的负载均衡上增加健康检查的功能
3.2 功能测试
1、正常情况下的检测数据
2、测试将web01的nginx服务关掉
3、日志分析
四、如何解决网站重复登录的问题
有三种方法解决:
- ip_hash – 会造成某一台主机的压力过大
- session复制
- session共享
- 本地文件 –> nfs共享
- 通过程序,写入redis数据库(常用)
- 通过程序,写入mysql数据库
本案例,选用3.2配置,session共享,写入redis数据库
4.1 安装phpmyadmin重现问题
web01
和web02
都需要安装
1、配置Nginx
2、安装phpmyadmin
3、配置phpmyadmin连接远程数据库
4、配置授权
这个文件夹中会记录session,需要权限
session_start(): Failed to read session data: files (path: /var/lib/php/session)
5、将web01上配置好的phpmyadmin以及nginx的配置文件推送到web02主机上
6、重载Nginx服务,授权访问权限
7、接入负载均衡,并重启nginx服务,lb01
操作
9、测试访问
4.2 解决问题
1、在db01
安装redis数据库
2、配置并启动redis
3、web01
的php配置session连接redis
4、注释php-fpm.d/www.conf里面的两条内容,否则session内容会一直写入/var/lib/php/session目录中
5、重启php-fpm
6、将web01
的配置文件推送到web02
上
7、重启服务
8、再次测试访问网站
可以登录,并且session的值将记录到redis数据库
9、刷新页面的负载均衡效果展示
10、cookie保存到redis展示