Web集群-Nginx(六)
今日内容:
- 常见负载均衡轮询算法(面试会问)
- rewriter规则
一、轮询算法
什么是轮询算法?
- 决定负载均衡如何把请求分发给后端节点
- 这种分发的方式就是轮询算法
1.1 常见轮询算法
轮询算法 |
说明 |
rr轮询 |
round robin 轮询,默认的循环访问. |
wrr |
加权轮询,在轮询的基础上增加权重功能。 server中的weight就是加权轮询。 |
ip_hash |
ip哈希,只要客户端ip一样,就会一直访问同一个后端节点.(用户请求与web服务器绑定) 用于解决会话保持/会话共享。 可能导致负载不均。 |
xxx_hash |
如url_hash 只要用户访问的url相同/uri相同,就访问相同的web服务器. 用于缓存服务器:静态资源缓存 |
least_conn; |
最小连接数,lc算法。 也可以配合上权重 weight, wlc权重的最小连接数 |
一致性hash算法 |
自己研究 |
1.2 轮询算法实现案例
1.2.1 ip_hash
lb01配置如下
1.2.2 url_hash
lb01配置如下
补充:
hash算法下,一台机器宕机,会报错吗?
二、负载均衡状态检查
主要内容:
- 掌握负载均衡状态检查模块的使用 — 基于Tengine
- 需要使用到第三方中间件(Tengine),编译安装,生成nginx命令文件
- 用tengine源码编译生成的nginx文件替换原来的nginx
步骤:
- 找一台db01(无ngx即可),编译tengine
- 生成ngx命令,替代lb上ngx的命令即可
tengine是什么?
- Tengine是阿里基于Nginx二次开发的高性能HTTP服务器
- 它把ngx常用的第3方模块放在了源代码中的modules目录下面,
2.1 编译tengine
下载tengine代码
安装依赖
编译
编译完成不需要install安装,检查编译后生成的命令即可
2.2 替换nginx命令
把在db01编译出的tengine-nginx命令文件,替换到lb01中
2.3 tengine chek说明
根据官方案例进行配置:
https://tengine.taobao.org/document_cn/http_upstream_check_cn.html
各选项说明:
表格如下:
upstream_check模块指令说明 |
|
check |
指定检查频率,失败几次,成功几次,检查间隔,检查方式 |
check_http_send |
通过http方式发出请求报文,请求报文起始行,请求方法,请求的URI,请求协议(默认使用的是ip方式 访问.) |
check_http_expect_alive |
收到指定的状态码,就认为是存活的. |
check_status; |
开启负载均衡状态检查功能,web页面.location 使用 如果加强安全. |
2.4 配置tengine check
配置文件如下
2.5 测试
重新加载nginx服务,访问测试页面:http://lb.oldboylinux.cn/lb_status
注意: 如果后端web有多个虚拟主机
upstream check进行访问的时候默认使用的ip方式进行访问.
在发出http请求的时候指定域名
三、Nginx平滑升级案例
平滑升级的步骤
平滑更新步骤 |
说明 |
1、准备好新的nginx命令(已经测试的) |
|
2、把当前环境的nginx的命令备份,使用新的替换. |
|
3、通过kill命令向当前运行ngx发出信号,准备被替代 -USR2 pid |
把当前运行ngx的pid文件改个名 使用新的nginx命令启动ngx进程 |
4、测试调试,关闭旧的ngx的进程即可.(kill即可.) |
|
找一台负载均衡服务器(lb01),执行操作
2.1 检查当前环境
2.2 升级nginx
替换新老nginx
PID相关处理
四、Nginx重定向功能
4.1 概述
重定向(rewrite),也叫URL重定向,也叫URL改写
用于未来的需求:
- 1、URL重定向:网站是http(80) —> https(443)
- 2、根据客户端访问类型进行跳转(如客户端类型)
- 3、新老域名跳转: www.360buy.com —-> jd.com
- 4、需要我们调整url格式:改成伪静态(方便搜索引擎收入) ,满足运营要求
4.2 重定向模块的指令
相关的指令 |
说明 |
return |
实现对url的改写,一般与ngx变量一起使用,返回指定的状态码. |
rewrite |
实现对url的改写,使用正则匹配uri,进行改写.,还有各种标记. |
set |
创建或修改ngx变量. |
if |
判断,一般与ngx变量一起使用. |
4.2.1 return指令
格式 |
说明 |
格式1 |
return code URL;返回状态码+新的url地址. |
格式2 |
return code; 返回指定状态码. |
放哪 |
server、location、if |
案例01:返回状态码
return 403
所有人禁止访问/admin/页面.
命令行测试:
浏览器测试:
访问:http://rewrite.oldboylinux.cn/
访问:http://rewrite.oldboylinux.cn/admin
案例02:域名间跳转
用户访问http://rewrite.oldboylinux.cn/admin/跳转到www.baidu.com
也可以访问http://rewrite.oldboylinux.cn就跳转到www.baidu.com
curl命令行测试
curl -L –location 跟随跳转:
响应是301、302跳转的时候使用
案例03:http跳转https(TODO)
完整流程等讲完https再说,大致如下
4.2.2 if指令
if可以用于进行判断,配合ngx中的变量使用:
- 可以比大小.
- 也可以进行等于,不等于.
- 也可以进行匹配(过滤).
格式:
可以放在:
可以使用的符号:
- 常用
~, ~*, !~, !~*
匹配正则
~
大小写敏感,~*
大小写不敏感
- ngx取反,排除,只能用if
案例01:限定请求方法
rewrite.oldboylinux.cn 网站只准许GET、POST这2种请求方法,其他访问禁止访问
测试
4.2.3 set指令
用于自己创建或修改ngx变量 ,一般与if
搭配使用
案例01:基本使用
测试访问
可以根据变量显示网站uri
测试访问,显示输入的uri
案例02:设置网站维护状态
设置网站是否为维护状态:
变量文件可以单独写到一个文件中,再导入
测试访问
4.2.4 rewrite指令
rewrite正则用于匹配用户请求的uri.
命令的格式与sed 's###g'
类似,实现替换功能,rewrite替换url内容.(改写)
指令 |
说明 |
格式 |
rewrite 找什么(具体内容/正则/保护分组) 替换成什么(具体内容,后向引用) [标记]; 标记可以省略,默认使用 redirect标记(302) |
放在哪里 |
server , location , if |
⚠ |
rewrite匹配的内容,匹配uri. |
rewrite的301,302标记
rewrite的301,302标记 |
|
redirect |
302 |
permanent |
301 |
案例01:域名跳转
测试访问
案例02:http跳转https(TODO)
案例03:rewrite的各种标记
标记 |
说明 |
补充 |
redirect |
302 临时 用户访问的时候,收到302提示及新的位置Location(响应头),用户根据 Location新的位置进行访问(让用户重新发出http请求) |
新旧地址都可以用. |
permanent |
301 永久 用户访问的时候,收到302提示及新的位置Location(响应头),用户根据 Location新的位置进行访问(让用户重新发出http请求) |
旧的地址排名取消,旧地旧的 不用了,只用新的网站. |
break |
用户的请求匹配到包含break指令或rewrite规则后,及时后面还有location规则, 不会继续运行.终止运行. |
|
last |
用户请求匹配到包含last标记的rewrite规则后,停止继续执行,ngx会重新发出内部请求,请求与location规则进行匹配. |
开启ngx rewrite_log才能看到 |
rewrite标记使用
测试rewrite:
break标记使用:
测试break,跳转到2.html就结束了
last标记使用
last标记测试,重新发送请求,至b.html结束
五、Nginx总结
https://www.processon.com/view/link/63e992c0d0902d35a13e18a1
访问密码:oldboylidao996