Web集群-Nginx(五)
今日内容:
- 反向代理 vs 负载均衡区别
- wordpress动态网站接入到负载均衡
- 其他负载案例
一、复习
1.1 Nginx处理用户请求流程
处理用户请求流程,静态,无负载
处理用户请求流程,动态,无负载
1.2 负载均衡处理用户请求流程
参考:https://www.processon.com/view/link/619d93310e3e74287fe4e3de
二、负载均衡补充
2.1 负载均衡 VS 反向代理
一般出现在面试中,如果不是一般认为这两个是一致的.
区别在于处理用户请求的方式.
内容 |
共同点 |
区别 |
服务 |
负载 均衡 |
用户的请求分发到 后端节点上. |
用户—>lb—->web lb负载均衡做的是数据转发,不会产生新的请求. 1个请求1个响应 |
lvs |
反向 代理 |
用户的请求分发到后端节点上. |
中间有个中介,用户—>中介—>web 2个请求2个响应. 代理代替用户去找web服务器. |
ngx/tengine/openresty/haproxy |
图示如下:
2.2 负载均衡模块的选项
upstream模块 sever 指令支持的选项
选项说明:
选项 |
说明 |
应用场景 |
weight |
权重,根据权重ngx分配请求. |
如果web服务端配置不同,1c2g, 2c8g. 代码更新与测试的时候,给测试服务器较小的权重. |
max_fails |
ngx具备一些健康检查功能,指定失败的次数,超过这个次 数就认为节点挂了. |
一般情况下可以设置1-3即可. 不太重要,缓存业 务,可以设置为10. |
fail_timeout |
认为节点挂了后间隔多久再次检查健康情况. 默认是 10s. |
根据要求设置时间即可,可以长一些.30/60s. |
backup |
备胎服务器,其他所有服务器都挂了的时候,才启用. |
使用的时候需要考虑雪崩的情况 |
三、负载均衡案例
3.1 案例01:wordpress接入负载均衡
需求:
- nfs01挂载
- db数据库,库用户
- web01,web02 部署环境ngx+php,测试,部署代码,挂载nfs。
- 接入负载
图示:
3.1.1 NFS存储配置
nfs01服务器,10.0.0.31配置,
注意事项:
共享的/nfs/wordpress文件夹,所属用户和组都是www
3.1.2 数据库配置
db01服务器,10.0.0.51配置,为wordpress创建专门的数据库,以及数据库用户
3.1.3 web服务器配置
web01和web02均做同样配置,保持一致
注意事项:
nginx和php都要使用www用户和用户组
nginx:
- 主配置文件:/etc/nginx/nginx.conf,其中的user
- 站点目录,/app/code/blog,修改用户和属组
php:
www用户相关配置
子配置文件和挂载目录相关
3.1.4 接入负载均衡
lb01配置
3.1.5 测试
a) 负载均衡测试
先是走10.0.0.7
把0.7的nginx关了,仍可以正常访问,该走0.8
b) 文件上传测试
写一篇文章,上传图片
图片成功显示,且通过nfs上传到nfs01服务器中
3.2 案例02-会话保持
目前的站点虽然可以正常访问,但仍然存在问题:会话无法保持
什么是会话?
- 用户的登录状态,或者未来购物网站的购物车状态,都可以称之为对话。
- 以登录状态为例,如果会话不能保持统一,可能造成用户频繁需要重新登录的问题,体验不好
本节的目标: 实现会话保持/会话共享。
3.2.1 cookie和session
需要大致知晓cookie和session的含义
技术点 |
共同点 |
区别 |
其他 |
cookie |
存放用户的信息,如登录信息 |
存放在客户端浏览器 |
服务器给客户端响应,进行设置set-cookie,未来再次访问时,将携带着cookie访问服务端 |
session |
存放用户的信息,如登录信息 |
存放服务端(文件,数据 库…) |
浏览器cookie与服务端的session对应 |
浏览器F12查看网站cookie
3.2.2 会话保持方案
方案:
- cookie+session方式
- 登录状态写入cookie中
- 需要有统一存放session服务器(会话保持服务器)
- 客户端浏览器持cookie和服务器session对比
- 通过认证服务Oauth2.0实现
- 使用token方式—token古代的令牌
- 偏开发,了解即可
- ip_hash方案
- 第一次认证的那台服务器,后续就一直选择那台
- 跟负载均衡的作用有些冲突
- 通过redis实现
3.2.3 redis方案极速上手
案例:部署phpMyAdmin + redis会话保持
phpMyadmin是一个基于PHP的web页面版本的数据库管理工具,可以执行SQL语句。
只需要nginx + php,不需要创建库,只需在mysql添加用户(权限设大点).
流程如下:
- db: phpmyadmin用户,权限大一些.
- web: 部署代码,传输到另外一个web上
- 准备redis环境(db01)
- 修改php配置(创建新的端口)
- 接入负载均衡.访问与测试
a)db01准备用户
b)部署phpmyadmin
web01和web02做同样的操作
配置文件vim编辑时的替换方法:
配置hosts,测试访问,报错Permission denied
原因是因为session目录没有权限,解决方法:将session目录用户和属组修改为www
这里的www用户和用户组是根据nginx的配置文件来的:
user项里是什么,就改成什么,我的原来是nginx,后面改成www
再次访问,正常
phpmyadmin默认的数据库IP为localhost,因此需要在站点文件夹中,手动创建连接数据库的配置文件
测试访问(10.0.0.8单机部署),帐号密码为mysql用户,用之前创建的phpmyadmin用户登录
访问成功,10.0.0.7也做相同配置,站点代码保持一致
c)部署负载均衡
lb01部署
测试:经过负载均衡访问,无法正常登录了,报错
这是怎么回事?
- 跟session cookie相关,想必就是会话保持的问题引起的!
- 通过部署redis服务来保存会话,解决这个问题。
d)部署redis服务
此操作在数据库服务器操作(db01 - 10.0.0.51)
部署redis
e)php配置文件指定会话存放位置
此操作在web服务器操作(web01、web02)
通知php指定会话保持位置:redis tcp://172.16.1.51:6379
创建php配置文件
修改nginx配置文件,转发到9001端口处理
d)最终测试
再次登录正常
不断刷新,172.16.1.7和1.8都有,说明负载均衡生效,且不需要重新登录,会话保存成功