Nginx 核心功能之正反代理

目录

一、Nginx

二、正向代理 

三、反向代理

四、Nginx 缓存

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

2. 代理缓存功能设置

五、Nginx rewrite和正则

(1)Nginx 正则

(2)nginx location

(3)Rewrite

(4)实例:


一、Nginx

概述:Nginx 是一款高性能的 开源 Web 服务器 和 反向代理服务器,以高并发处理、低内存消耗和模块化架构著称。

核心功能:

功能说明
静态资源服务高效处理 HTML、CSS、JS、图片等静态文件,支持 Gzip 压缩和缓存优化。
反向代理将客户端请求转发到后端服务器集群,实现负载均衡和高可用。
SSL/TLS 终止处理 HTTPS 加密和解密,减轻后端服务器压力。
限流与防护支持请求速率限制、IP 黑白名单、防 DDoS 攻击。
动态内容处理通过 FastCGI 协议与 PHP、Python 等后端语言交互(需配合 PHP-FPM 等工具)。

注意:配置代理前提 nginx的版本必须高些

二、正向代理 

概述:正向代理是 客户端与目标服务器之间的中间服务器,代表客户端向外部服务器发送请求。

 

工作流程

  1. 客户端配置代理服务器(如浏览器设置代理 IP 和端口)。

  2. 客户端发送请求到代理服务器。

  3. 代理服务器转发请求到目标服务器。

  4. 目标服务器返回响应到代理服务器。

  5. 代理服务器将响应返回给客户端。

配置步骤:

#正向代理
vim /usr/local/nginx/conf/nginx.conf
......省略部分信息server {listen       8080;resolver 114.114.114.114 8.8.8.8;proxy_connect;proxy_connect_allow 80 443;proxy_connect_connect_timeout 10s;proxy_connect_read_timeout 10s;proxy_connect_send_timeout 10s;server_name  localhost;location / {#    root   html;#    index  index.html index.htm;proxy_pass $scheme://$http_host$request_uri;proxy_set_header Host $http_host;proxy_buffers 256 4k;proxy_max_temp_file_size 0;proxy_http_version 1.1;proxy_set_header Connection "";}nginx -t	##检查文件配置

三、反向代理

概述:反向代理是 客户端与后端服务器之间的中间服务器,代表后端服务器接收客户端请求,隐藏真实服务器信息。

  • 核心优势

    • 负载均衡:分发请求到多个后端服务器。

    • 安全防护:隐藏后端服务器 IP,防止直接暴露。

    • 缓存加速:缓存静态内容,减少后端压力。

配置步骤:

#反向代理(七层代理)
进行反向代理的配置,写在server外面(准备两台httpd网站,两个网站,两个网站内容不同,记得关防火墙,启动httpd)vim /usr/local/nginx/conf/nginx.confupstream myhttp {server 192.168.10.103:80;server 192.168.10.104:80;}#下面这个修改server里面的location location / {# root   html;# index  index.html index.htm;proxy_pass http://myhttp;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;}nginx -t	##检查文件配置(四层反向代理)并不在http里面写,在ecents下面写
vim /usr/local/nginx/conf/nginx.confstream {upstream myssh{server 192.168.10.102:22;}server {listen 2222;proxy_pass myssh;proxy_connect_timeout 10s;proxy_timeout 1h;}
}nginx -t	##检查文件配置

四、Nginx 缓存

Nginx 缓存通过存储响应内容(静态或动态)减少后端服务器负载,提升响应速度和并发能力。

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

(1)代理缓存

  • 核心作用:通过缓存后端服务器的响应内容,减少重复请求对后端的压力,加快客户端访问速度。

  • 缓存类型

    • 代理缓存(Proxy Cache):针对反向代理场景,缓存后端服务器的响应(如动态接口、静态页面)。

    • 静态资源缓存:直接缓存静态文件(如 CSS、JS、图片),通过 expires 或 Cache-Control 头控制浏览器缓存。

(2)代理缓存原理

  • 缓存键(Cache Key):根据请求的 URL、HTTP 方法、请求头(如 Host)生成唯一标识,用于判断是否命中缓存。

  • 缓存存储:将响应内容以文件形式存储在磁盘(或内存),并通过 proxy_cache_path 配置管理。

  • 缓存有效性

    • 基于 HTTP 响应头(如 Cache-ControlExpires)自动判断缓存过期时间。

    • 可手动设置缓存有效期(如 proxy_cache_valid)。

  • 缓存更新:当缓存过期或无效时,向后端服务器重新请求并更新缓存。

2. 代理缓存功能设置

(1)反向代理配置

upstream backend {server 10.0.0.1:80;server 10.0.0.2:80;
}server {listen 80;server_name example.com;location / {proxy_pass http://backend;proxy_set_header Host $host;}
}

(2)设置缓存功能

分两步:定义缓存路径启用缓存规则

  1. 定义缓存路径(在 http 块中配置):

    http {proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m use_temp_path=off;# 参数说明:# - `/var/cache/nginx`: 缓存文件存储路径# - `levels=1:2`: 目录层级结构(1层子目录,2位哈希字符)# - `keys_zone=my_cache:10m`: 定义缓存区域名称和共享内存大小(10MB)# - `max_size=1g`: 最大磁盘缓存空间# - `inactive=60m`: 60分钟内未被访问的缓存自动删除# - `use_temp_path=off`: 禁用临时文件路径,直接写入缓存目录
    }
  2. 启用缓存规则(在 location 块中配置):

    server {location / {proxy_pass http://backend;proxy_cache my_cache;  # 关联缓存区域proxy_cache_valid 200 302 10m;  # 状态码200/302缓存10分钟proxy_cache_valid 404      1m;  # 状态码404缓存1分钟proxy_cache_key "$scheme$request_method$host$request_uri";  # 定义缓存键add_header X-Cache-Status $upstream_cache_status;  # 添加响应头显示缓存状态}
    }

(3)验证缓存功能

  1. 查看响应头

    • 通过浏览器开发者工具或 curl 检查响应头是否包含 X-Cache-Status

      curl -I http://example.com
    • 可能的取值:

      • HIT:缓存命中

      • MISS:未命中,从后端获取

      • EXPIRED:缓存已过期

      • BYPASS:绕过缓存

  2. 检查缓存文件

    • 到 /var/cache/nginx 目录查看是否生成缓存文件(文件名基于哈希值)。

  3. 压力测试

    • 使用工具(如 ab 或 wrk)模拟高并发请求,观察后端服务器的负载是否降低。

五、Nginx rewrite和正则

Rewrite 功能通过正则表达式实现 URL 重写、跳转和逻辑控制,是 SEO 优化和路由管理的核心工具

Rewrite的应用场景:

  • 路径美化:将/product/123 转换为 /index.php?id=123
  • 旧链接迁移:将过期URL永久重定向(301)到新地址
  • 强制HTTPS/域名统一:自动跳转http://到https://,或合并www与非www域名
  • 动态路由:适配单页应用(SPA),RESTful API 路由
  • 灰度发布:按规则将部分流量导向新版本服务
(1)Nginx 正则
符号含义示例
^匹配字符串开头^/admin 匹配以 /admin 开头的路径
$匹配字符串结尾.html$ 匹配以 .html 结尾的 URL
.匹配任意单个字符(除换行符)a.c 匹配 abcaac
\d匹配数字(等价于 [0-9]user/\d+ → user/123
\w匹配字母、数字、下划线\w+ 匹配 user_123
()分组捕获,替换时用 $1$2 引用^/(\w+)/(\d+)$ → /$1?id=$2
*匹配前一个字符 0 次或多次a* 匹配空、aaa
+匹配前一个字符 1 次或多次\d+ 匹配 1123
?匹配前一个字符 0 次或 1 次https? 匹配 http 或 https
{n,m}匹配前一个字符 n 到 m 次a{2,4} 匹配 aaaaaaaaa
[abc]匹配括号内任意一个字符[aeiou] 匹配元音字母
[^abc]匹配不在括号内的任意字符[^0-9] 匹配非数字字符
(2)nginx location
  • location 的语法:
    location [匹配模式] {# 处理逻辑 (如 root, proxy_pass, rewrite 等)
    }

    常用修饰符

    修饰符作用
    =精确匹配(完全相等)
    ^~前缀匹配(优先于正则匹配)
    ~正则匹配(区分大小写)
    ~*正则匹配(不区分大小写)
    无修饰符普通前缀匹配(优先级最低)
  • location 的优先级规则:精确匹配 > 精确前缀匹配 > 正则匹配 (~ 和 ~* 同时存在时,文件中物理位置靠上的优先)> 普通前缀匹配 > 通用匹配

  •  Location 匹配流程

精确匹配:检查是否有 location = 精确匹配当前 URI,若有则立即使用。

前缀匹配

        查找最长匹配的普通前缀(无修饰符)。

        检查是否有 ^~ 前缀匹配,若有则停止后续正则匹配。

正则匹配:按配置文件中的顺序依次匹配,首次匹配成功后停止。

默认处理:若未匹配任何规则,使用普通前缀匹配的最长路径

  • location 验证:

(3)Rewrite

rewrite
语法:rewrite <regex> <replacement> [flag];

regex:正则匹配URL字符串(只能对域名后边的除去传递的参数外的字符串起作用)

replacement: 重写跳转后的地址

  • 正则表达式:匹配请求 URI(如 ^/old/(.*))。

  • 替换规则:生成新 URI(如 /new/$1)。

  •  Flag 类型

    Flag作用
    last重写后重新匹配新 URL 的 location 块(类似循环,最多 10 次)
    break立即停止处理后续规则,直接返回结果
    redirect返回 302 临时重定向(浏览器地址栏显示新 URL)
    permanent返回 301 永久重定向(SEO 友好,浏览器缓存跳转)

Nginx 跳转:

  • 1. server{ } 块中的 rewrite

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

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

  • 2. location{ } 块中的 rewrite

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

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

  • 3. if{ } 块中的 rewrite

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

作用域:依赖 if 表达式所在的上下文(如在server中或location中)

  • rewrite flag 验证

    验证方法:查看响应头:curl -I http://example.com/old-path  
    # 输出示例(301 重定向):  
    # HTTP/1.1 301 Moved Permanently  
    # Location: http://example.com/new-path  检查 Nginx 日志:rewrite_log on;  
    error_log /var/log/nginx/error.log notice;  # 查看重写过程日志  
  • rewrite 中的捕获组

    小括号()用于定义正则表达式的捕获组捕获组“( )”
    在正则表达式中, (pattern)  会匹配 pattern 并捕获内容,按顺序存入 $1,  $2,  $3 等变量中。引用方式
    在 rewrite 的替换字符串中,通过 $1 表示第一个捕获组,$2 表示第二个,依此类推。[root@ localhost ~]# vim /usr/local/nginx/conf/nginx.conf
    location / category/ {#匹配 / category/ tech/123, 捕获 tech 到 $1,123 到 $2rewrite ^/ category/(.+)/(\d+)$ /archive/$1/$2 last;
    )
    location /archive/ {#返回捕获的分类和 IDreturn 200" Category: $1, ID: $2";测试访问
    [root@ localhost~]# curl http://localhost/category/tech/456
    Category: tech, ID: 456
  • nginx 中的set指令

    语法: set $variable valuevim /usr/local/nginx/conf/nginx.conflocation /demo {set $name "Nginx";        #定义变量 $namereturn 200 "Hello, $name!";        #输出:Hello,Nginx!
    }测试:
    curl http://localhost/demo
    Hello,Nginx!
(4)实例:

1. 基于域名的跳转

vim /usr/local/nginx/conf/nginx.conf
if ($host = 'www.kgc.com')
{
rewrite ^/(.*)$ http://www.newkgc.com/$1 permanent;
}

2. 基于客户端IP访问跳转

vim /usr/local/nginx/conf/nginx.conf
set $rewrite true;
if ($remote_addr = "192.168.6.125") {
set $rewrite false;
}
if ($rewrite = true {
rewrite (.+) /maintenance.html;
}
location = /maintenance.html {
root /usr/share/nginx/html;
}

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

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

相关文章

ssh连接云服务器记录

文章目录 1. 背景2. ssh连接2.1 win 下通过终端工具进行连接2.2 Linux下通过ssh指令连接2.3 ssh使用publickey来连接 ssh连接云服务器记录 1. 背景 最近开始接触docker技术、mysql技术&#xff0c;加上本人工作基本都在Linux下进行&#xff0c;因此需要一套Linux环境进行练习。…

软考-软件设计师中级备考 12、软件工程

一、软件工程概述 定义&#xff1a;软件工程是一门研究用工程化方法构建和维护有效的、实用的和高质量软件的学科。它涉及到软件的开发、测试、维护、管理等多个方面&#xff0c;旨在运用一系列科学方法和技术手段&#xff0c;提高软件的质量和开发效率&#xff0c;降低软件开…

【多次弹出“获取打开此tobiieyetracking链接的应用”的窗口】解决办法

使用联想R9000P突然出现“获取打开此tobiieyetracking链接的应用”的窗口&#xff0c;每隔几分钟就弹一次&#xff0c;特别恶心人&#xff0c;解决办法&#xff1a; 找到【此电脑】&#xff0c;鼠标右键【管理】&#xff1b;选择【服务】&#xff0c;如下所示&#xff0c;找到…

项目选择的三个核心因素:市场前景、竞争优势和成本控制

能保持持续增长和赚钱的项目就是好项目。 每个创业者创业之初&#xff0c;遇到的第一个难题就是选择做什么项目&#xff1f; 俗话说&#xff1a;方向不对&#xff0c;努力白费。 选错项目&#xff0c;意味着你所有的付出都是打水漂。 能做的项目那么多&#xff0c;在没有价值…

裸机 Kubernetes 集群负载均衡器:MetalLB 深度解析与实战指南

一、引言 在云原生架构中&#xff0c;Kubernetes 默认的负载均衡能力依赖于云厂商&#xff08;如 AWS ELB、GCP LB&#xff09;&#xff0c;但在裸机或本地数据中心环境中&#xff0c;这一功能缺失导致 LoadBalancer 类型的 Service 始终处于 Pending 状态。此时&#xff0c;M…

2025年- H20-Lc128-240. 搜索二维矩阵 II(矩阵)---java版

1.题目描述 2.思路 遍历矩阵&#xff0c;然后如果遇到矩阵中的值正好等于target&#xff0c;输出true。否则&#xff0c;输出false。 3.代码 public class H240 {public boolean searchMatrix(int[][] matrix, int target) {//1.计算出总的行值&#xff0c;总的列值。int mm…

系统架构设计师:设计模式——行为设计模式

一、行为设计模式 行为模式涉及算法和对象间职责的分配。行为模式不仅描述对象或类的模式&#xff0c;还描述它们之间的通信模式。这些模式刻画了在运行时难以跟踪的、复杂的控制流。它们将用户的注意力从控制流转移到对象间的联系方式上来。 行为类模式使用继承机制在类间分…

java springboot实现MCP Server SSE

参考&#xff1a; https://juejin.cn/post/7491881721278529570 SpringAI 实现 SSE MCP Server项目 - Auler - 博客园 springboot-MCPserver-JUnit: 使用springboot支持mcp项目搭建&#xff0c;同时有着便捷的单元测试来进行敏捷开发对话即服务&#xff1a;Spring BootMCP让…

LeetCode 热题 100 48. 旋转图像

LeetCode 热题 100 | 48. 旋转图像 大家好&#xff0c;今天我们来解决一道经典的算法题——旋转图像。这道题在LeetCode上被标记为中等难度&#xff0c;要求我们将一个 n n 的二维矩阵&#xff08;图像&#xff09;顺时针旋转90度&#xff0c;并且必须原地修改矩阵&#xff0…

嵌入式按键原理、中断过程与中断程序设计(键盘扫描程序)

按键去抖动  通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时&#xff0c;电压信号波型如下图。由于机械触点的弹性作用&#xff0c;一个按键开关在闭合时不会马上稳定地接通&#xff0c;在断开时也不会一下子断开。因而在闭合及断开的瞬间均伴随有一连串的抖动。…

数据结构之哈夫曼树

8.哈夫曼树 8.1 哈夫曼编码 哈夫曼编码&#xff08;Huffman Coding&#xff09;&#xff0c;又称霍夫曼编码&#xff0c;是一种可变字长编码&#xff08;VLC&#xff09;方式 这种编码方法完全依据字符出现的概率来构造异字头的平均长度最短的码字&#xff0c; 因此有时也被…

机器学习实操 第一部分 机器学习基础 第5章 支持向量机(SVM)

机器学习实操 第一部分 机器学习基础 第5章 支持向量机&#xff08;SVM&#xff09; 内容概要 第5章深入介绍了支持向量机&#xff08;SVM&#xff09;&#xff0c;这是一种功能强大且应用广泛的机器学习模型。SVM适用于线性或非线性分类、回归以及 novelty detection。本章详…

Webug4.0靶场通关笔记14- 第18关 文件上传之Nginx解析缺陷

目录 第18关 渗透实战 1.打开靶场 2.构造php脚本 3.源码分析 &#xff08;1&#xff09;客户端源码 &#xff08;2&#xff09;服务的源码 4.Nginx解析法渗透 &#xff08;1&#xff09;缺陷原因 &#xff08;2&#xff09;缺陷条件 &#xff08;3&#xff09;构造脚…

【QT】QT中的网络编程(TCP 和 UDP通信)

QT中的网络编程&#xff08;TCP 和 UDP通信&#xff09; 1.tcp1.1 tcp通信1.1.1 相比linux中tcp通信:1.1.2 QT中的tcp通信: 1.2 tcp通信流程1.2.1 服务器流程&#xff1a;1.2.1.1 示例代码1.2.1.2 现象 1.2.2 客户端流程&#xff1a;1.2.2.1 示例代码1.2.2.2 现象&#xff1a; …

架构思维:使用懒加载架构实现高性能读服务

文章目录 一、引言二、读服务的功能性需求三、两大基本设计原则1. 架构尽量不要分层2. 代码尽可能简单 四、实战方案&#xff1a;懒加载架构及其四大挑战五、改进思路六、总结与思考题 一、引言 在任何后台系统设计中&#xff0c;「读多写少」的业务场景占据主流&#xff1a;浏…

永磁同步电机控制算法--基于PI的位置伺服控制

一、原理介绍 永磁同步伺服系统是包含了电流环、速度环和位置环的三环控制系统。 伺服系统通过电流检测电路和光电编码器检测电动机三相绕组电流和转子位置θ&#xff0c;通过坐标变换&#xff0c;计算出转矩电流分量iq和励磁电流分量id。 位置信号指令与实际转子位置信号的差…

linux系统线程实现原理浅析

背景 对进程和线程的理解&#xff0c;之前一直都是凭一些零碎不完整的信息在理解&#xff1b; linux的进程和线程基本上一样&#xff0c;线程是轻量级进程&#xff0c;彼此有关联又独立。 得亏内核支持的好&#xff0c;写用户态程序可以不依赖于实现的理解&#xff0c;只需要…

MySQL连接报错处理:1130-host ... is not allowed to connect to this MySql server

在MySQL安装完成后&#xff0c;很多开发者会遇到这样一个问题&#xff1a; 错误代码 1130&#xff1a;host xxx.xxx.xxx.xxx is not allowed to connect to this MySql server 这个错误通常出现在你尝试通过远程工具&#xff08;如 Navicat、DBeaver 等&#xff09;连接 MySQL …

Linux系统之----进程控制

1.进程创建 进程创建部分由于就是fork函数&#xff0c;还有写时拷贝&#xff0c;在上一篇已经讲述过了&#xff0c;这里不在进行赘述&#xff0c;有疑问的读者可以前往上一篇博文《Linux系统--程序地址空间》中阅读&#xff01; 这里在多说一嘴写时拷贝吧 我们可以对比一下写…

Spring框架的设计目标,设计理念,和核心是什么 ?

Spring框架是一个为简化企业级应用开发而设计的开源框架&#xff0c;它提供了全面的基础设施支持&#xff0c;使得Java应用开发更加简单、快速和可维护。下面我将详细解释Spring框架的设计目标、设计理念以及核心组件。 设计目标 简化Java企业级应用开发&#xff1a;通过提供…