Nginx代理、缓存与Rewrite

目录

一、正向代理

(一)核心概念与应用场景

(二)Nginx正向代理编译安装(以OpenEuler为例)

(三)验证正向代理

二、反向代理

(一)七层代理(HTTP/HTTPS,应用层)

(二)四层代理(TCP/UDP,网络层)

三、代理缓存

(一)核心原理

(二)配置步骤(基于七层反向代理)

四、Rewrite与正则

(一)正则表达式基础

(二)Location匹配模式与优先级

(三)Rewrite语法与Flag参数

(四)捕获组与Set指令

五、总结


一、正向代理

(一)核心概念与应用场景

正向代理是客户端(如浏览器)的代理,客户端明确配置代理服务器,由代理服务器代为向目标服务器发起请求。其核心作用包括:

  • 突破网络限制:访问被屏蔽的网站或资源。
  • 节省带宽:缓存公共资源(如软件包、镜像文件),减少重复请求。
  • 隐藏真实IP:客户端通过代理服务器访问目标,隐藏自身IP地址。
(二)Nginx正向代理编译安装(以OpenEuler为例)

1. 安装依赖软件

Nginx编译需要GCC、PCRE、Zlib、OpenSSL等开发包支持:

[root@localhost ~]# dnf install -y gcc make pcre-devel zlib-devel openssl-devel perl-ExtUtils-MakeMaker git wget tar

2. 创建专用用户与日志目录

为提升安全性,创建非交互式用户​​nginx​​,并设置日志目录权限:

[root@localhost ~]# useradd -M -s /sbin/nologin nginx
[root@localhost ~]# mkdir -p /var/log/nginx
[root@localhost ~]# chown -R nginx:nginx /var/log/nginx

3. 下载与编译配置

  • 解压Nginx源码(示例版本1.26.3),并下载支持HTTPS转发的第三方模块​​ngx_http_proxy_connect_module​​(若源码已包含则无需下载):
[root@localhost ~]# tar zxf nginx-1.26.3_http_proxy.tar.gz
[root@localhost ~]# cd nginx-1.26.3
[root@localhost nginx-1.26.3]# ./configure \--prefix=/usr/local/nginx \--user=nginx \--group=nginx \--with-http_ssl_module \--with-http_v2_module \--with-http_realip_module \--with-http_stub_status_module \--with-http_gzip_static_module \--with-pcre \--with-stream \--with-stream_ssl_module \--with-stream_realip_module \--add-module=./ngx_http_proxy_connect_module  # 关键:支持HTTPS转发
  • 关键参数解析:
  • ​--add-module​​:引入第三方模块,解决Nginx默认不支持HTTPS转发的问题。
  • ​--with-http_ssl_module​​:开启HTTPS支持。
  • ​--with-stream​​:支持TCP/UDP四层代理。
  • 编译并安装:
[root@localhost nginx-1.26.3]# make && make install

4. 创建便捷执行链接

[root@localhost nginx-1.26.3]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/nginx
(三)验证正向代理

配置客户端(如Windows)的代理IP和端口为Nginx服务器地址,访问任意网站。通过查看Nginx访问日志(​​/usr/local/nginx/logs/access.log​​),可观察到客户端请求经代理转发,实现IP隐藏与流量代理。

二、反向代理

(一)七层代理(HTTP/HTTPS,应用层)

1. 核心功能与场景

  • 负载均衡:将流量分发到多台后端服务器(如Tomcat、Apache),避免单点故障。
  • 动静分离:静态资源(图片、CSS/JS)由Nginx直接响应,动态请求转发至后端。
  • SSL终端:统一处理HTTPS加密/解密,减轻后端压力。

2. 实战配置:转发HTTP请求到后端Httpd服务器

  • 环境准备(两台主机)
  • 代理服务器(192.168.10.101):运行Nginx。
  • 后端服务器(192.168.10.102):安装Httpd并部署静态页面:
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# dnf install httpd -y
[root@localhost ~]# echo "这是后端主机" > /var/www/html/index.html
[root@localhost ~]# systemctl start httpd
  • Nginx配置(代理服务器)
http {upstream backend {  # 定义后端服务器地址池server 192.168.10.102:80;}server {listen 80;server_name example.com;location / {proxy_pass http://backend;  # 请求转发到后端地址池proxy_set_header Host $host;  # 传递客户端请求的主机名proxy_set_header X-Real-IP $remote_addr;  # 传递客户端真实IP}}
}
  • 验证
[root@localhost ~]# curl 192.168.10.101  # 应返回“这是后端主机”
(二)四层代理(TCP/UDP,网络层)

1. 核心功能与场景

  • 非HTTP服务代理:如数据库(MySQL/Redis)、游戏服务器(UDP协议)、SSH跳板机。
  • 高性能转发:直接转发原始数据流,不解析应用层内容,低延迟。

2. 实战配置:SSH请求代理(端口2222转发到后端22)

stream {  # 与http模块平级,独立处理TCP/UDP流量upstream ssh_cluster {server 192.168.10.102:22;  # 后端SSH服务地址}server {listen 2222;  # 代理服务器监听端口proxy_pass ssh_cluster;  # 转发到后端地址池proxy_connect_timeout 5s;  # 连接超时时间proxy_timeout 1h;  # 长连接保持时间}
}
  • 验证
[root@localhost ~]# ssh root@192.168.10.101 -p 2222  # 成功登录后端服务器

三、代理缓存

(一)核心原理

Nginx缓存后端服务器的响应内容,当相同请求再次到达时,直接返回缓存数据,减少后端压力并加速响应。支持按URL、请求方法、协议等维度缓存。

(二)配置步骤(基于七层反向代理)

1. 创建缓存目录并设置权限

[root@localhost ~]# mkdir -p /data/nginx/cache
[root@localhost ~]# chown nginx:nginx /data/nginx/cache -R

2. 配置缓存参数

http {# 定义缓存路径与参数proxy_cache_path /data/nginx/cache \levels=1:2 \  # 缓存目录层级(一级目录1个字符,二级目录2个字符)keys_zone=my_cache:10m \  # 共享内存区,存储缓存键与元数据(10MB约存8万个键)inactive=60m \  # 60分钟未访问则删除缓存max_size=1g \  # 最大缓存空间,超出后按LRU算法清理use_temp_path=off;  # 禁用临时文件,直接写入缓存目录提升性能upstream backend {server 192.168.10.102:80;}server {listen 80;server_name example.com;location / {proxy_pass http://backend;proxy_cache my_cache;  # 启用名为my_cache的缓存区proxy_cache_key "$scheme$request_method$host$request_uri";  # 缓存键:协议+方法+主机+URIproxy_cache_valid 200 302 10m;  # 200/302状态码缓存10分钟proxy_cache_valid 404 1m;  # 404缓存1分钟proxy_cache_valid any 5s;  # 其他状态码缓存5秒add_header X-Cache-Status $upstream_cache_status;  # 添加缓存状态头(调试用)}}
}

3. 验证缓存效果

  • 首次请求(MISS,未命中缓存):
[root@localhost ~]# curl -I 192.168.10.101
# 响应头包含:X-Cache-Status: MISS
  • 再次请求(HIT,命中缓存):
[root@localhost ~]# curl -I 192.168.10.101
# 响应头包含:X-Cache-Status: HIT

四、Rewrite与正则

(一)正则表达式基础

Nginx Rewrite依赖正则匹配,常用元字符:

  • ​^​​​:匹配字符串开头,如​​^/api​​​匹配以​​/api​​开头的URI。
  • ​$​​​:匹配字符串结尾,如​​.jpg$​​匹配以.jpg结尾的文件。
  • ​+​​​:匹配前一个字符1次或多次,如​​ab+​​​匹配​​ab​​​、​​abb​​等。
  • ​()​​​:捕获组,如​​/user/(\d+)​​​捕获用户ID到​​$1​​。
(二)Location匹配模式与优先级

1. 语法与模式

location [匹配模式] { ... }
  • 精确匹配:​​location = /uri​​​,优先级最高(如​​location = /index.html​​仅匹配完全相同的URI)。
  • 正则匹配:​​location ~ /abc​​​(区分大小写)、​​location ~* /ABC​​(不区分大小写)。
  • 普通前缀:​​location /abc​​​匹配以​​/abc​​开头的URI。
  • 通用匹配:​​location /​​,优先级最低。

2. 优先级规则

精确匹配 > 精确前缀 > 正则匹配(文件中位置靠上的优先) > 普通前缀 > 通用匹配。

(三)Rewrite语法与Flag参数

1. 基本语法

rewrite <regex> <replacement> [flag];
  • ​regex​​:匹配当前URI的正则表达式(不包含域名和参数)。
  • ​replacement​​:重写后的目标URI。
  • ​flag​​:
  • ​last​​:重写后重新匹配location(默认值)。
  • ​break​​:重写后不再匹配location,直接处理当前请求。
  • ​redirect​​:返回302临时重定向(浏览器地址栏更新)。
  • ​permanent​​:返回301永久重定向(搜索引擎更新URL)。

2. 实战示例

  • 路径美化:将​​/product/123​​​转换为​​/index.php?id=123​​:
location /product/ {rewrite ^/product/(\d+)$ /index.php?id=$1 last;
}
  • 强制HTTPS跳转
server {listen 80;server_name example.com;rewrite ^(.*)$ https://$server_name$1 permanent;  # 永久重定向到HTTPS
}
  • 旧链接迁移(301永久重定向)
location /old-page {rewrite ^ /new-page permanent;
}
(四)捕获组与Set指令

1. 捕获组应用

通过​​()​​​捕获正则匹配内容,使用​​$1​​​、​​$2​​引用:

location /category/ {# 匹配/category/tech/123,捕获“tech”到$1,“123”到$2rewrite ^/category/(.+)/(\d+)$ /archive/$1/$2 last;
}
location /archive/ {return 200 "Category: $1, ID: $2";  # 输出捕获结果
}

2. Set指令定义变量

location /demo {set $name "Nginx";  # 定义变量$namereturn 200 "Hello, $name!";  # 输出:Hello, Nginx!
}

五、总结

本文全面解析了Nginx的三大核心功能:

  1. 正向代理:客户端代理,突破限制、隐藏IP。
  2. 反向代理:服务器端代理,支持七层(HTTP/HTTPS)与四层(TCP/UDP),实现负载均衡、动静分离等。
  3. 代理缓存:通过缓存后端响应,降低延迟、提升性能。
  4. Rewrite与正则:灵活控制URL,实现路径美化、重定向、动态路由等。

通过合理配置Nginx,可显著提升网站的性能、安全性和可维护性。在实际应用中,需根据业务需求选择合适的代理模式,结合缓存策略和Rewrite规则,打造高效稳定的Web应用架构。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/web/81623.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PortSwigger-02-XXE

一&#xff1a;漏洞原理 1、XXE XXE全称xml外部实体注入 XML&#xff1a;是一种用于标记电子文件使其具有结构性的标记语言&#xff0c;提供统一的方法来描述和交换独立于应用程序或者供应商的结构化数据&#xff0c;它可以用来标记数据&#xff0c;定义数据类型、是一种允许…

常规算法学习

算法 1. 排序算法1. 归并排序1.1 普通归并排序1.2 优化后的归并排序&#xff08;TimSort&#xff09; 2. 插入排序2.1 直接插入排序2.2 二分插入排序2.3 成对插入排序 3. 快速排序3.1 单轴快速排序3.2 双轴快排 4. 计数排序 2. 树1. 红黑树&#xff08;Red Black Tree&#xff…

关于线程死锁的相关知识

前言 今天学习了线程死锁的相关知识。线程死锁是非常重要的知识&#xff0c;写成博客&#xff0c;加深自己对于知识的理解。 线程死锁 结语 希望可以帮助到大家~

EMQX启用单向认证的SSl/TLS连接的配置步骤

先确保您已经安装了 OpenSSL 执行openssl version -a 获取 openssl.cnf 目录 生成自签名服务端证书 CA 证书生成 server-ca.crt openssl req \-new \-newkey rsa:2048 \-days 365 \-nodes \-x509 \-subj "/CCN/OEMQ Technologies Co., Ltd/CNEMQ CA" \-keyout s…

依赖nacos实例动态创建线程池并监听服务上下线

版本 Spring Booot 版本 3.2.4Spring Cloud 版本 2023.0.1Spring Cloud Alibaba 版本 2023.0.1.2 依赖 <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </depe…

全面指南:使用Node.js和Python连接与操作MongoDB

在现代Web开发中&#xff0c;数据库是存储和管理数据的核心组件。MongoDB作为一款流行的NoSQL数据库&#xff0c;以其灵活的数据模型、高性能和易扩展性广受开发者欢迎。无论是使用Node.js还是Python&#xff0c;MongoDB都提供了强大的官方驱动和第三方库&#xff0c;使得数据库…

LeetCode 3068.最大节点价值之和:脑筋急转弯+动态规划(O(1)空间)

【LetMeFly】3068.最大节点价值之和&#xff1a;脑筋急转弯动态规划&#xff08;O(1)空间&#xff09; 力扣题目链接&#xff1a;https://leetcode.cn/problems/find-the-maximum-sum-of-node-values/ 给你一棵 n 个节点的 无向 树&#xff0c;节点从 0 到 n - 1 编号。树以长…

HTTPS加密通信详解及在Spring Boot中的实现

HTTPS&#xff08;Hyper Text Transfer Protocol Secure&#xff09;是HTTP的安全版本&#xff0c;通过SSL/TLS协议为通讯提供加密、身份验证和数据完整性保护。 一、HTTPS核心原理 1.加密流程概述 客户端发起HTTPS请求&#xff08;连接到服务器443端口&#xff09;服务器返…

解决线程安全问题

前言 昨天学习了如何去解决线程不安全的问题。一般方法都是通过加锁来处理&#xff0c;跟大家分享一波 。 解决线程安全问题 结语 希望可以帮助到大家~ byebye

网络常识:网线和光纤的区别

网络常识&#xff1a;网线和光纤的区别 一. 介绍二. 网线2.1 什么是网线&#xff1f;2.2 网线的主要类别2.3 网线的优势2.4 网线的劣势 三. 光纤3.1 什么是光纤&#xff1f;3.2 光纤的主要类别3.3 光纤的优势3.4 光纤的劣势 四. 网线 vs 光纤&#xff1a;谁更适合你&#xff1f…

win11 禁用/恢复 内置笔记本键盘(保证管用)

文章目录 禁用启用 禁用 1&#xff09;按下 win x&#xff0c;点击 设备管理器 2&#xff09;拔掉所有笔记本外设&#xff08;一定要都拔掉&#xff0c;不然后面禁用设备会混淆&#xff09;&#xff0c;然后右键点击 键盘 > HID Keyboard Device 2&#xff09;点击 更新…

Three.js搭建小米SU7三维汽车实战(5)su7登场

汽车模型加载 我们在sktechfab上下载的汽车是glb的文件格式&#xff0c;所以使用gltfLoader进行加载。这里将小车直接加载进来看看效果&#xff1b; import { GLTFLoader } from "three/addons/loaders/GLTFLoader.js"; ....其余代码省略 const gltfLoader new GLT…

ETL怎么实现多流自定义合并?

随着信息技术的迅猛发展以及数据生成环境的多样化&#xff0c;互联网、物联网和社交媒体的广泛应用导致各种设备和平台不断产生大量数据&#xff0c;需要整合这些数据&#xff0c;从而进行数据融合。数据集成和管理平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;…

数据结构- 10种常见树:二叉树、平衡二叉树、完全二叉树

一、树 树型结构是一类重要的非线性数据结构。其中以树和二叉树最为常用&#xff0c;直观看来&#xff0c;树是以分支关系定义的层次结构。把它叫做“树”是因为它常看起来像一棵倒挂的树&#xff0c;也就是说它常是根朝上&#xff0c;而叶朝下的。 1.树的定义&#xff1a; 树…

Java常用加密方式

一&#xff0c;加密算法分类 对称加密&#xff1a;指加密和解密的密钥相同&#xff0c;优点就是加解密的效率高且易于实现。 非对称加密&#xff1a;指加密和解密的密钥不相同&#xff0c;也称为公私要加密。 不可逆加密&#xff1a;特征就是加密过程不需要密钥&#xff0c;…

SQLite软件架构与实现源代码浅析

概述 SQLite 是一个用 C 语言编写的库&#xff0c;它成功打造出了一款小型、快速、独立、具备高可靠性且功能完备的 SQL 数据库引擎。本文档将为您简要介绍其架构、关键组件及其协同运作模式。 SQLite 显著特点之一是无服务器架构。不同于常规数据库&#xff0c;它并非以单独进…

让 Deepseek GPS测速

下面是一个简单的微信小程序GPS测速功能的实现代码&#xff0c;包括前端页面和后端逻辑。 1. 页面结构 (index.wxml) <view class"container"><view class"speed-display"><text class"speed-value">{{speed}}</text>…

什么是软件的生命周期,以及常见的开发测试模型

目录 一、软件的生命周期 1、什么是生命周期&#xff1f; 2、每个阶段都要做些什么&#xff1f; 二、常见的开发模型 1、瀑布模型 2、螺旋模型 3、增量模型、迭代模型 4、敏捷模型 scrum模型 三个角色 五个会议 一、软件的生命周期 1、什么是生命周期&#xff…

JWT安全:弱签名测试.【实现越权绕过.】

JWT安全&#xff1a;假密钥【签名随便写实现越权绕过.】 JSON Web 令牌 (JWT)是一种在系统之间发送加密签名 JSON 数据的标准化格式。理论上&#xff0c;它们可以包含任何类型的数据&#xff0c;但最常用于在身份验证、会话处理和访问控制机制中发送有关用户的信息(“声明”)。…

数据分析与应用-----使用scikit-learn构建模型

目录 一、使用sklearn转换器处理数据 &#xff08;一&#xff09;、加载datasets模块中的数据集 &#xff08;二&#xff09;、将数据集划分为训练集和测试集 ​编辑 train_test_spli &#xff08;三&#xff09;、使用sklearn转换器进行数据预处理与降维 PCA 二、 构…