nginx-rewrite功能
- 重定向:也叫url重定向,也叫url改写
- 未来需求:
- 网站由http(80)---->https(443)
- http://www.baidu.com---->https://www.baidu.com
- 根据用户客户端类型进行跳转
- 如果用户客户端为ios、iPhone、Android,则访问m.www.baidu.com
- 否则:访问www.baidu.com
- 新老域名跳转:www.360buy.com---->jd.com
- 网站由http(80)---->https(443)
模块与指令
rewrite模块相关指令 | 说明 |
return | 实现对url的改写,一般与nginx一起使用,返回指定的状态码 |
rewrite | 实现对url的改写,使用正则匹配uri进行改写,还有各种标记 |
set | 创建或修改nginx变量 |
if | 判断(一般与nginx变量一起使用) |
return指令
格式 | 说明 |
格式1 | return code URL:返回状态码+新的url地址 |
格式2 | return code:返回指定状态码 |
命令存放位置 | server,location,if |
案例:如果用户访问/admin/页面返回403
[root@web01 ~]# cat /etc/nginx/conf.d/rewrite.test.cn.conf server {listen 80;server_name rewrite.test.cn;root /app/code/rewrite;location / {index index.html;}location /admin/ {return 403;} }
[root@web01 ~]# mkdir /app/code/rewrite
[root@web01 ~]# echo rewrite model index > /app/code/rewrite/index.html
案例:域名间跳转
用户访问rewrite.test.cn ----> www.baidu.com
[root@web01 /etc/nginx/conf.d]# cat rewrite.test.cn.conf server {listen 80;server_name rewrite.test.cn;return 301 http://www.baidu.com; }
if判断
if指令 | 说明 |
格式 |
if (条件) { 满足条件执行的内容 } |
命令存放位置 | server、location |
可以使用的符号 | ~ ~* !~ !~* |
案例:rewrite.linux.cn网站只允许GET、POST 2种请求方式访问
[root@web01 /etc/nginx/conf.d]# cat rewrite.test.cn.conf server {listen 80;server_name rewrite.test.cn;root /app/code/rewrite;if ($request_method !~ 'GET|POST') {return 403;}location / {index index.html;} }# 测试 [C:\~]$ curl -H Host:rewrite.test.cn http://10.0.0.7% Total % Received % Xferd Average Speed Time Time Time CurrentDload Upload Total Spent Left Speed 100 20 100 20 0 0 13280 0 --:--:-- --:--:-- --:--:-- 20000 rewrite model index[C:\~]$ curl -I -H Host:rewrite.test.cn http://10.0.0.7% Total % Received % Xferd Average Speed Time Time Time CurrentDload Upload Total Spent Left Speed0 153 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 HTTP/1.1 403 Forbidden Server: nginx/1.26.1 Date: Wed, 05 Mar 2025 03:38:23 GMT Content-Type: text/html Content-Length: 153 Connection: keep-alive
set(用于创建或修改nginx变量)
# set $变量名 变量值 set $name yuanxiaojiang;[root@web01 /etc/nginx/conf.d]# cat rewrite.test.cn.conf server {listen 80;server_name rewrite.test.cn;set $name yuanxiaojiang;return 200 $name; }# 测试 C:\~]$ curl rewrite.test.cn yuanxiaojiang
rewrite
rewrite正则用于匹配用户请求的uri
rewrite指令 | 说明 |
格式 | rewrite 旧地址(具体地址/正则) 替换成的新地址(具体地址/反向引用) [flag标记] |
rewrite存放位置 | server、location、if |
rewrite各种标记
标记 | 说明 | 补充 |
redirect | 302(临时),用户访问的时候,收到302提示及其新的位置Location(响应头),用户根据Location新的位置进行访问(让用户重新发出http请求) | 新旧地址都可以用 |
permanent | 301(永久),用户访问的时候,收到301提示及其新的位置Location(响应头),用户根据Location新的位置进行访问(让用户重新发出http请求) | 旧的地址不使用,只用新的地址 |
break | 用户请求匹配到包含break指令或rewrite规则后,即使后面还有Location规则,不会继续运行(终止运行) | |
last(了解) | 用户请求匹配到包含last标记的rewrite规则后,停止继续执行,nginx会重新发出内部请求,请求与Location规则进行匹配 | 开启nginx的rewrite_log才能看到 |
域名跳转
[root@web01 /etc/nginx/conf.d]# cat rewrite.test.cn.conf server {listen 80;server_name rewrite.test.cn;# return 301 http://www.baidu.com$request_uri;rewrite ^(.*)$ http://www.baidu.com$1 permanent; }
高可用服务(keepalived)
- 高可用:HA HighAvailablity ----> Keepalived
- 生成vip(虚拟ip),dns解析到这个ip地址即可
选型 | 说明 |
keepalived(保持活跃) | 高可用软件,负载使用,一般不涉及数据库 |
heartbeat(心跳) | 高可用软件,设计数据库、存储数据时使用 |
原理
- Keepalived利用VRRP协议的核心功能来实现主备切换,从而保证服务的高可用性
- VRRP(虚拟路由器冗余协议):最开始是使网络设备实现高可用,目前通过VRRP协议实现负载高可用
- 一般分为主备两个节点,主备之间通过VRRP协议发送数据包沟通
- 主节点给备节点定期发送数据包
- 备节点收到数据包表示主节点还活着
- 备无法收到数据包,表示主节点挂了,备节点转为主节点,接管用户请求流量
- vrrp协议使用组播ip地址: 224.xx.xx.xx
极速上手指南
高可用环境准备 | 需要安装的服务 |
lb01 10.0.0.5 | nginx + keepalived |
lb02 10.0.0.6 | nginx + keepalived |
yum install -y keepalived |
keepalived配置文件结构(/etc/keepalived/keepalived.conf)
/etc/keepalived/keepalived.conf 配置文件结构 | 说明 |
global_defs | 全局配置 |
vrrp_instance | vrrp实例配置:vip、主备、网卡 |
virtual_server | LVS配置:用于管理控制lvs |
global_defs {router_id lb01 # 当前网络中keepalived的唯一标识(一般用主机名) }vrrp_instance vip_1 { # vip实例名字(注意在同一对主备之间该名字要一致)state MASTER # 主/备 MASTER主 BACKUP备interface eth0 # 指定网卡virtual_router_id 51 # 在一对主备之间设置一个id号(一对主备之间id号要一致)priority 100 # 优先级(主>备 主备之间相差50)advert_int 1 # 心跳间隔:主节点多久发送一次vrrp数据包authentication { # 授权与认证,保持默认即可(对数据包进行加密)auth_type PASSauth_pass 1111}virtual_ipaddress { # 设置vip10.0.0.3 dev eth0 label eth0:0 # 该地址不能与网路中的地址冲突,label:设置别名 } }
脑裂故障
- 现象:主备节点都有vip
- 原因:
- 备节点认为主节点挂了,接管资源生成vip,实际上主节点没有挂,仍然有vip
- 导致脑裂原因:开启防火墙、selinux、物理线路原因、keepalived配置
- 解决:监控,只要备节点有VIP就报警
案例:keepalived基于主机高可用软件
keepalived只会在主节点主机挂了、主节点网络断开后、主节点keepalived服务关闭时才进行主备切换
默认情况下keepalived不会监控某个服务
项目目标:某个服务关闭了,keepalived就进行主备切换
[root@lb01 ~]# cat /server/scripts/check_ngx.sh #!/bin/bash #author: yuanxiaojiang #desc: 监控nginx端口数量 port_count=`ss -lntup |grep nginx |wc -l` if [ $port_count -eq 0 ];then systemctl stop keepalived fi# 需要给脚本执行权限 # 脚本中不要包含服务的名字
修改keepalived配置文件
定义脚本:vrrp_script 脚本名 { script 脚本路径和名称 }
调用脚本:vrrp_instance 中通过track_script调用
# 注意修改脚本的权限,否则操作失败 [root@lb01 ~]# ll /server/scripts/check_ngx.sh -rw-r--r-- 1 root root 173 Mar 5 17:14 /server/scripts/check_ngx.sh [root@lb01 ~]# chmod +x /server/scripts/check_ngx.sh [root@lb01 ~]# cat /etc/keepalived/keepalived.conf global_defs {router_id lb01 } vrrp_script my_check_ngx.sh { # 定义监控脚本script /server/scripts/check_ngx.shinterval 2 # 间隔多长时间执行一次脚本weight 1 # 权重user root # 用户 } vrrp_instance vip_1 {state MASTERinterface eth0virtual_router_id 51priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {10.0.0.3 dev eth0 label eth0:0}track_script { # 调用监控脚本 my_check_ngx.sh} }
非抢占模式
抢占模式(默认):主节点故障,备节点接管服务,主机点恢复,主节点接管服务
非抢占模式:主节点故障,备节点接管服务,主机点恢复不重新接管服务
- # 将两个节点的状态都配置成备节点(state BACKUP)
- # 配置nopreempt
双主模式
应对高并发的时候设置双主模式
数据加密服务(https)