我也不知取啥名

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

模块与指令

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  Current
                                 Dload  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  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0   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 PASS
        auth_pass 1111
    }
    virtual_ipaddress {  # 设置vip
        10.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.sh
    interval 2  # 间隔多长时间执行一次脚本
    weight 1  # 权重
    user root  # 用户
}
vrrp_instance vip_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.0.3 dev eth0 label eth0:0
    }
    track_script {  # 调用监控脚本
        my_check_ngx.sh
    }
}
复制代码

非抢占模式

抢占模式(默认):主节点故障,备节点接管服务,主机点恢复,主节点接管服务

非抢占模式:主节点故障,备节点接管服务,主机点恢复不重新接管服务

  • # 将两个节点的状态都配置成备节点(state BACKUP)
  • # 配置nopreempt

 

双主模式

应对高并发的时候设置双主模式

 

 

数据加密服务(https)

 

posted @   猿小姜  阅读(3)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示