完整教程:Nginx反向代理核心原理揭秘

news/2025/10/2 10:17:58/文章来源:https://www.cnblogs.com/slgkaifa/p/19123281

完整教程:Nginx反向代理核心原理揭秘

它触及了 Nginx 作为反向代理服务器的核心工作原理。观察到的现象正是 Nginx 设计的精妙之处。

核心原理:Nginx 是"中间人"

后端并没有直接"传给前端"数据,而是传给 Nginx,再由 Nginx 转发给前端

整个数据流是这样的:

前端浏览器 ←→ Nginx(90端口) ←→ 后端应用(8080端口)

详细的工作流程

1. 请求阶段(前端 → Nginx → 后端)

2. 响应阶段(后端 → Nginx → 前端)

后端Spring应用:8080端口
返回数据给 Nginx
Nginx 将数据返回给前端浏览器

为什么后端不需要知道前端的存在?

关键机制:反向代理配置

Nginx 的配置中定义了代理规则,告诉 Nginx:“当收到对90端口的请求时,实际去8080端口获取数据”。

# Nginx 配置文件示例 (nginx.conf)
server {listen 90;  # Nginx 监听90端口server_name localhost;# 静态文件服务location / {root /usr/share/nginx/html;  # 前端文件目录index index.html index.htm;}# API 代理配置 - 这是关键!location /api/ {proxy_pass http://localhost:8080/;  # 将/api请求转发到8080端口proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;}
}

后端视角:谁在调用我?

从后端应用的角度看,它并不知道前端浏览器的存在。它只知道:

  1. 有一个客户端(Nginx)向我的8080端口发起了请求
  2. 我处理这个请求并返回响应给这个客户端(Nginx)
  3. 至于这个客户端(Nginx)之后要做什么,我完全不关心
// 后端Spring应用(运行在8080端口)
@RestController
public class UserController {
@GetMapping("/api/users")
public List<User> getUsers() {// 这个方法只知道:有人调用了 /api/users// 它返回数据给调用者(Nginx),不知道最终是浏览器return userService.findAll();}}

这种架构的优势

1. 解耦前后端

2. 负载均衡

# Nginx 可以将请求分发到多个后端实例
upstream backend_servers {server localhost:8080 weight=3;  # 权重3server localhost:8081 weight=2;  # 权重2server localhost:8082 weight=1;  # 权重1
}
location /api/ {proxy_pass http://backend_servers/;
}

3. 安全性

  • 后端服务(8080)可以不暴露给外网,只允许 Nginx 访问
  • Nginx 可以作为安全屏障,过滤恶意请求

4. 性能优化

# Nginx 可以处理静态资源,减轻后端压力
location /static/ {root /usr/share/nginx/html;expires 30d;  # 缓存30天
}
location /api/ {proxy_pass http://localhost:8080/;# 添加缓存proxy_cache my_cache;proxy_cache_valid 200 302 10m;
}

实际的数据流示例

让我们跟踪一个具体的请求:

步骤1:浏览器发起请求

前端浏览器 → http://example.com:90/api/users

步骤2:Nginx 接收并转发

# Nginx 配置匹配到 location /api/
location /api/ {proxy_pass http://localhost:8080/;  # 转发到8080端口
}

实际转发为:http://localhost:8080/api/users

步骤3:后端处理并响应

// Spring 后端收到请求,返回JSON数据
@GetMapping("/api/users")
public List<User> getUsers() {return Arrays.asList(new User(1, "Alice"),new User(2, "Bob"));}// 响应:HTTP 200 + JSON数据

步骤4:Nginx 返回给浏览器

Nginx 收到后端响应,原样返回给浏览器
浏览器显示结果,但地址栏显示的是90端口

解决常见的跨域问题

这种架构还天然解决了前后端分离中的跨域问题

没有 Nginx 时的跨域问题:

前端: http://localhost:3000 (React开发服务器)
后端: http://localhost:8080 (SpringBoot)
浏览器阻止请求:不同端口被视为不同源,违反同源策略

使用 Nginx 反向代理解决:

浏览器访问: http://localhost:90
Nginx 服务静态文件(前端) + 代理API请求到8080端口
对浏览器来说,所有资源都来自同一个源(localhost:90),没有跨域问题

总结

Nginx 能够成功中转数据的核心原因是:

  1. 反向代理机制:Nginx 作为中间人,接收前端请求并转发给后端
  2. 配置规则:通过 proxy_pass 指令定义转发规则
  3. 网络可达性:Nginx 和后端应用在同一台机器或同一网络内,可以互相访问
  4. 透明传输:Nginx 只是中转数据,不修改业务逻辑(除非特别配置)

这种架构是现代 Web 应用的标准做法,它提供了更好的安全性、可扩展性和维护性。正好验证了 Nginx 反向代理正在正常工作!

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

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

相关文章

详细介绍:五大关系数据库(sqlserver、mysql、oracle、pgsql、sqlite)的对象名称和转义字符

详细介绍:五大关系数据库(sqlserver、mysql、oracle、pgsql、sqlite)的对象名称和转义字符2025-10-02 10:17 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !importa…

@RequestParam 什么时候可以省略?

参数名一致时 当HTTP请求中的参数名与控制器方法参数名完全一致时,@RequestParam可省略。 非必需参数 当请求参数为非必需(即允许未传递该参数时),可通过设置@RequestParam(required=false)或省略注解,此时即使未…

做全景效果图的网站wordpress适应ie6

《“爱读书”--给你讲技术》&#xff0c;我来看书&#xff0c;你来进步&#xff0c;让我们开始吧&#xff01;本书简介书名为《轻量级JavaEE企业应用实战》&#xff0c;是本人在学习JavaEE框架的时候阅读的第一本书&#xff0c;本书对于框架及相关基础知识讲述的比较详细和浅显…

段页式管理方式

分段分页管理中最大的优缺点优点 缺点分页管理 内存空间利用率高,不会产生外部碎片,只会有少量的页内碎片 不方便按照逻辑模块实现信息的共享和保护分段管理 很方便按照逻辑模块实现信息的共享和保护 如果段长过大,…

网站建设与单位干部作风的关系网站竞价推广都有哪些

有些粉丝&#xff0c;希望对自定义业务中&#xff0c;驳回到发起人进行处理&#xff0c;比如可以重新进行发起流程&#xff0c;下面就给出一种方式&#xff0c;当然不一定是最好的方式&#xff0c;只是提供一种参考而已&#xff0c;以后可以考虑动态根据流程状态或节点信息进行…

推进电子设计革新:为什么模拟仿真正是核心助力?

在高速发展的电子设计领域,模拟仿真已成为现代工程师的「得力助手」,它不仅能快速验证设计,还能显著提升流程效率与质量。1、仿真的三大优势:提前预见,精准优化,高效迭代 错误无处遁形 仿真能在设计实施前及时暴…

河北网站seo策划公司变更地址需要多少钱

T2-简单 MST题解 题意 设 ω ( x ) \omega(x) ω(x)为 x x x的质因数所构成的集合大小&#xff1b; 给两个正整数 l l l r r r&#xff0c;图上有 r − l 1 r-l1 r−l1个点&#xff0c;为 l , l 1 , l 2 , ⋯ , r − 2 , r − 1 , r l,l1,l2,\cdots,r-2,r-1,r l,l1,l2,…

网站域名 格式怎么做学校网站和微信公众号

日常工作中&#xff0c;经常会用到FTP&#xff0c;一般情况下&#xff0c;FTP站点在IE中&#xff08;尤其是IE7以后版本&#xff09;打开&#xff0c;默认都不是以文件夹视图方式打开的&#xff0c;这时IE也会给你提示“若要在 Windows 资源管理器中查看此 FTP 站点&#xff0c…

完整教程:深度解析ZStack Cloud v5.4.0 LTS 基础架构三大核心突破

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

深入解析:精读C++20设计模式:结构型设计模式:装饰器模式

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

*和 内存和地址 实例代码

#include <bits/stdc++.h> using namespace std; int main(){int number=42;int *ptr=&number;//ptr 存储 number 的地址 cout<<"变量值:"<<number<<endl; //42cout&l…

应用安全 --- 安卓加固 之 IPC

应用安全 --- 安卓加固 之 IPC应用安全 --- 安卓加固 之 IPC 会有一个调用者和被调用者,我们frida只能hook其中一个,无法获取全貌### 为什么看不到真实调用者信息?核心原因 :你看到的是一个 Binder IPC跨进程调用…

深入解析:前端开发,iframe 相关经验总结

深入解析:前端开发,iframe 相关经验总结pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "…

事业单位网站建设费入什么科目网站由谁备案

以下是一个使用DefaultsKit库的简单爬虫程序&#xff0c;用于爬取音频。代码中使用了https://www.duoip.cn/get_proxy的API获取代理服务器。 import Foundation import DefaultsKit ​ let url "https://www.douban.com/music" // 目标网站URL let proxyUrl "…

超市如何建立网站免费行情网站

文章目录 摘要Abstract文献阅读题目引言创新点方法利用长短期记忆网络学习时空演化特征构建用于气象辅助信息编码的堆叠自编码器使用多任务学习发现全市通用模式 模型实验数据集评估准则实验结果 深度学习Self-attentionself-Attention由来self-attention原理self attention代码…

寻找东莞微信网站建设三只松鼠软文范例500字

文章目录 0 前言1\. 目标检测概况1.1 什么是目标检测&#xff1f;1.2 发展阶段 2\. 行人检测2.1 行人检测简介2.2 行人检测技术难点2.3 行人检测实现效果2.4 关键代码-训练过程 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 毕业设计…

完整教程:Linux-01_2(vi / vim 编辑器)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

金华义乌网站建设企业建网站一般要多少钱

背景 在flink中&#xff0c;如果你想要访问记录的处理时间或者事件时间&#xff0c;注册定时器&#xff0c;或者是将记录输出到多个输出流中&#xff0c;你都需要处理函数的帮助&#xff0c;本文就来通过一个例子来讲解下副输出 副输出 本文还是基于streaming-with-flink这本…