当前位置: 首页 > news >正文

Nginx正反向代理与正则表达式

目录

一:正向代理

1.编译安装nginx

2.配置正向代理

二:反向代理

1.配置nginx七层代理

2.配置nginx四层代理

三:nginx 缓存

1.缓存功能的核心原理和缓存类型

2.代理缓存功能设置

四:nginx rewrite 和正则表达式

1.Nginx正则

2.nginx location

3.Rewrite 语法

Nginx作为一款高性能的开源Web服务器和反向代理工具,凭借其轻量级、高并发处理能力和灵活的模块化设计,已成为现代Web架构的基石。从全球顶尖网站到微服务架构,Nginx在负载均衡、缓存加速、安全防护等场景中扮演着关键角色。

一:正向代理

正向代理(Forward Proxy)是一种位于客户端和原始服务器之间的代理服务器,其主要作用是将客户端的请求转发给目标服务器,并将响应返回给客户端Nginx 的 正向代理 充当客户端的“中间人”,代表用户访问外部资源并隐藏真实 IP。它是企业内网管控、安全审计与加速访问的核心工具。用于场景一般是:

  • 内网访问空制:限制员工访问特定网站
  • 匿名访问:通过代理服务器隐藏用户真实身份
  • 资源缓存加速:缓存公共资源,减少外网带宽消耗

1.编译安装nginx

(1)安装支持软件

Nginx 的配置及运行需要 pcre、zlib 等软件包的支持,因此应预先安装这些软件的开发包(devel),以便提供相应的库和头文件,确保 Nginx 的安装顺利完成。

(2)创建运行用户,组和日志目录

(3)编译安装nginx

参数说明:

  • --user=nginx    指定nginx运行用户
  • --group=nginx    指定nginx运行组
  • --with-http _ssl module    支持https://
  • --with-http v2 module    支持http版本2
  • --with-http realip_module    支持ip透传
  • --with-http stub status module   支持状态页面
  • --with-http_gzip_static module   支持压缩
  • --with-pcre    支持正则
  • --with-stream      支持tcp反向代理
  • --with-stream ssl module     支持tcp的ssl加密
  • --with-stream realip module    支持tcp的透传ip
  • --add-module=./ngx http proxy connect module #支持https转发(默认nginx不支持https转发,需要添加第三方模块)

2.配置正向代理

(2)验证正向代理

用一台新主机,使用curl命令,并指定代理服务器进行测试

二:反向代理

Nginx的七层(应用层)反向代理基于 HTTP/HTTPS 协议,深度解析应用层内容(如 URL、Header、Cookie),将客户端请求精准转发至后端服务器。作为企业级架构的“智能调度器”,它实现了负载均衡、安全隔离与性能优化的核心能力。应用场景一般是:

  • 负载均衡:将流量分发至多台后端服务器,避免单点故障。
  • 动静分离:静态资源(图片、CSS/JS)由Nginx直接响应,动态请求(PHP、API)转发至 Apache/Tomcat。
  • SSL 终端:统一处理 HTTPS 加密/解密,降低后端服务器计算压力。
  • 灰度发布:根据请求特征(如IP、Header)将部分流量导向新版本服务。

Nginx的四层(网络层)反向代理基于 TCP/UDP 协议,直接转发原始数据流不解析应用层内容。它专为高性能、低延迟的传输层场景设计,是数据库、游戏服务器等非 HTTP 服务的理想选择。应用场景一般是:

  • 数据库代理:对外暴露统一端口,内部转发至 MySQL、Redis 集群。
  • 游戏服务器:代理 UDP 协议,实现实时数据包负载均衡
  • SSH 跳板机:通过端口映射安全访问内网服务器
  • 高可用服务:TCP服务(如 MQTT)的主备切换与健康检查。

反向代理,指的是浏览器/客户端并不知道自己要访问具体哪台目标服务器只知道去访问代理服务器 ,代理服务器再通过反向代理 +负载均衡实现请求分发到应用服务器的一种代理服务。

反向代理服务的特点是代理服务器 代理的对象是应用服务器,也就是对于浏览器/客户端 来说应用服务器是隐藏的。

操作系统配置ip服务
OpenEuler2C4G192.168.10.101Nginx
OpenEuler2C4G192.168.10.102Httpd

1.配置nginx七层代理

(1)环境安装

192.168.102上操作:

(2)配置nginx七层代理转发

192.168.10.101上操作:

上述配置中,使用upstream定义后端应用服务器的地址池“backend”,在1ocation块中,使用proxy_pass,转发请求至后端地址池,proxyset headerHost $host:将请求中的Host头部设置为客户端请求的主机名,proxy_set header X-Real-IP $remote addr:将请求中的 X-Real-IP 头部设置为客户端的真实 IP 地址。

验证转发效果

2.配置nginx四层代理

192.168.10.101上操作:

(2)验证四层代理

通过101的2222端口登陆后,实际登陆的是102的服务器

三:nginx 缓存

Nginx的缓存功能是其核心能力之一,主要用于加速内容响应和降低后端服务器负载。它的缓存功能主要基于反向代理(Proxy Cache),但也可用于其他场景(如 FastCGI 缓存)。以下是详细解析:

1.缓存功能的核心原理和缓存类型

缓存类型作用场景
代理缓存反向代理模式下缓存后端服务器(如 Tomcat、Apache)的响应内容。
FastCGI 缓存缓存 PHP/Python 等通过 FastCGI 协议处理的动态内容(需配FastCGI 缓存合 PHP-FPM 使用)。
uWSGI/SCGI 缓存似 FastCGI,用于其他后端协议。
静态资源缓存通过 expires指令设置客户端浏览器缓存(非服务端缓存)

代理缓存:

代理缓存原则:

第一步:客户端第一次向Nginx请求数据A;

第二步:当Nginx发现缓存中没有数据A时,会向服务端请求数据A;

第三步:服务端接收到Nginx发来的请求,则返回数据A到Nginx,并且缓存在Nginx;

第四步:Nginx返回数据A给客户端应用;

第五步:客户端第二次向Nginx请求数据A;

第六步:主当Nginx发现缓存中存在数据A时,则不会请求服务端:

第七步:Nginx把缓存中的数据A返回给客户端应用。

2.代理缓存功能设置

因代理缓存功能需在反向代理模式下缓存后端服务器(如 Tomcat、Apache)的响应内容。需要先配置七层反向代理

(2)设置缓存能

进入/usr/local/nginx/conf/nginx.conf 配置文件

(3)验证缓存功能

四:nginx rewrite 和正则表达式

在云计算与分布式架构的时代,Nginx凭借其高性能、高并发处理能力以及模块化设计,已成为现代Web服务的核心组件之一。它不仅是负载均衡、反向代理的首选工具,更是实现流量调度、安全防护和动态路由的关键枢纽。而在这其中,Rewrite模块作为Nginx的“规则引擎”,扮演着至关重要的角色--它赋子开发者精准控制URL的能力,让请求的流转不再受限于物理路径,而是通过逻辑规则灵活适配业务需求。

Rewrite的应用场景:

路径美化:将/product/123 转换为/index.php?id=123

旧链接迁移:将过期URL永久重定向(301)到新地址

强制HTTPS/域名统一:自动跳转http://到https://,或合并www与非www域

动态路由:适配单页应用(SPA)、RESTfu1API路由

灰度发布:按规则将部分流量导向新版本服务

1.Nginx正则

字符描述
^匹配输入字符串的起始位置
$匹配输入字符串的结束位置
*匹配前面的字符零次或多次。如“ol*"能匹配"o”及“ol”、“ol!”
+匹配前面的字符一次或多次。如“ol+”能匹配"o|"及“o|!”、“ol”,但不能匹配"o”
?匹配前面的字符零次或一次,例如“do(es)?"能匹配“do"或者“does","?"等效于”{0,1}”
.匹配除“n"之外的任何单个字符,若要匹配包括“"n"在内的任意字符,请使用诸如“[.\n]”之类的模式
\将后面接着的字符标记为一个特殊字符或一个原义字符或一个向后引用。如“\n"匹配一个换行符,而“S"则匹配“S”
\d匹配纯数字
{n}重复n次
{n,}重复n次或更多次
{c}匹配单个字符c
{a-z}匹配 a-z 小写字母的任意一个
{a-zA-Z}匹配 a-z 小写字母或 A-Z 大写字母的任意一个

2.nginx location

在学习rewrite前还要了解下location,因为rewrite 通常会与 location结合使用,但并非绝对。

二者的协作能实现更精细的路径控制,location是Nginx中用于匹配请求URI(路径:只能对域名后边的除去传递的参数外的字符串起作用,例如 http://www.kgc.com/index.php?id=1 只匹配/index.php )的核心指令,用于根据请求路径定义不同的处理逻辑(如静态资源服务、反向代理、重定向等)

模式说明
llocation = /      精确匹配:仅匹配完全相同的URI(优先级最高)。
location ~正则匹配:区分大小写的正则表达式匹配。
location ~*正则匹配:不区分大小写的正则表达式匹配。
location ~~精确前缀匹配:匹配前缀路径后,不再检查正则匹配(优先级高于正则)
location /通用匹配:默认方式,优先级最低,其他方式匹配不到时匹配

location 的优先级规则:

精确匹配 >精确前缀匹配 >正则匹配( 和~*同时存在时,文件中物理位置靠上的优先)>普通前缀匹配 >通用匹配。

3.Rewrite 语法

regex:正则匹配URL字符串

只能对域名后边的除去传递的参数外的字符串起regex:作用,例如 http://www.kgc.com/index.php?id=1 只对/index.php 重写)

replacement:重写跳转后的地址

flag类型:

last:重写后的 URI 会重新触发location 匹配,并执行新匹配到的location块中的指令,是默认类型

break:重写后的 URI 不会重新匹配location,直接在当前 location 中处理,且后续的rewrite 指令不再执行

redirect:返回302临时重定向,浏览器地址会显示跳转后的URL地址,爬虫不会更新url(因为是临时)

permanent:返回301永久重定向,浏览器地址栏会显示跳转后的URL地址:爬虫更新url。

在实际工作的应用中,Nginx跳转需求有三种方式可实现。可以直接用rewrite 进行匹配跳转,也可以使用 if 匹配全局变量后跳转。另外,还可以使用location 匹配再跳转。所以rewrite 只能放在 servert}、if{}、location{}配置段中:

server{} 块中的 rewrite

执行顺序:在请求进入server块后、匹配location前执行。

作用域:影响该server块下所有请求(全局生效)。

location{} 块中的rewrite

执行顺序:在请求匹配到该 location 后执行。

作用域:仅对该 location 匹配的请求生效(局部生效)

if{} 块中的 rewrite

执行顺序:在满足 if 条件时触发

作用域:依赖 if 表达式所在的上下文

(2)rewrite flag 验证

配置完成后验证

使用浏览器请求,发现内容是 this is def  说明last 标记后继续向下匹配

将标记改为break测试:

改为后,发现请求为找到页面,说明使用break 后不继续向下匹配

将标记改为permanent 测试

该为permanent后,发现浏览器直接显示跳转后的地址

(3)rewrite 中的捕获组

在 Nginx的 rewrite 指令中,小括号 ()用于定义正则表达式的捕获组(Capture Group),捕获的文本可以通过 $1,$2,$3 等变量在重写后的 URI中引用

捕获组“()”

在正则表达式中,(pattern)并捕获内容,按顺序存会匹配 pattern 并捕获内容 ,按顺序存入 $1 $2  $3 等变量中。

引用方式

在 rewrite 的替换字符中,通过 $1 表示第一个捕获组,然后第二个,以此类推

测试访问

(4)nginx中的set指令

在 Nginx 中,set 指令用于定义变量并赋值,这些变量可以用于后续的条件判断、日志记录、重写规则等场景。它提供了灵活的动态配置能力,尤其在处理复杂的请求逻辑时非常有用。

测试访问

相关文章:

  • 从OpenMP中的不兼容,窥探AI应用开发中的并行编程
  • GStreamer开发笔记(三):测试gstreamer/v4l2+sdl2/v4l2+QtOpengl打摄像头延迟和内存
  • 《深入理解 Java 虚拟机》笔记
  • 手表关于MPU6050中的功能实现
  • 架构思维:构建高并发读服务_基于流量回放实现读服务的自动化测试回归方案
  • Kubernetes控制平面组件:Controller Manager 之 NamespaceController 全方位讲解
  • 基于windows安装MySQL8.0.40
  • Dubbo(97)如何在物联网系统中应用Dubbo?
  • 【PDF拆分+提取内容改名】批量拆分PDF提取拆分后的每个PDF物流面单数据改名或导出表格,基于WPF的PDF物流面单批量处理方案
  • 【计算机视觉】3d人脸重建:3DDFA_V2:实时高精度3D人脸重建与密集对齐技术指南
  • Linux 怎么使用局域网内电脑的网络访问外部
  • Python cv2图像几何变换全攻略:从理论到实战
  • 开源模型应用落地-qwen模型小试-Qwen3-8B-快速体验-批量推理(三)
  • 【Elasticsearch入门到落地】12、索引库删除判断以及文档增删改查
  • (一)Modular Monolith Architecture(项目结构/.net项目初始化/垂直切片架构)
  • 【NLP】30. 深入理解 In-Context Learning 的核心机制与策略
  • 浅析AI大模型为何需要向量数据库?【入门基础】
  • 【全队项目】智能学术海报生成系统PosterGenius--前后端系统介绍
  • NGINX 的 ngx_http_auth_jwt_module模块
  • 《繁花》投资、交易启示及思考
  • 微软通讯软件Skype正式停止运营:斥资85亿美元购入,月活用户曾超3亿
  • “五一”假期国内出游3.14亿人次,国内游客出游总花费1802.69亿元
  • 新闻1+1丨多地政府食堂开放 “舌尖上的服务”,反映出怎样的理念转变?
  • 沙发上躺赢又如何?告别冠军绝缘体的凯恩,要开始收割荣誉了
  • 伊朗公布新型弹道导弹,“萨德”系统无法拦截
  • 伊朗港口爆炸事故遇难人数最终确定为57人