ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

正向代理与Nginx反向代理

正向代理与Nginx反向代理 版权声明本文原创作者谷哥的小弟作者博客地址http://blog.csdn.net/lfdfhl一、引言在 Java Web 开发中Nginx 经常被描述为“反向代理服务器”。要理解反向代理首先需要理解什么是代理以及正向代理与反向代理的区别。代理本质上是一个中间服务它位于通信双方之间代替其中一方发送或接收请求。根据代理所代表的对象不同可以分为正向代理和反向代理。对于初级软件开发工程师而言理解正向代理和反向代理有助于理解浏览器、Nginx、Spring Boot 之间的请求流转关系也有助于理解实际项目中的部署结构。本文将从基本概念出发结合生活化比喻和典型配置对正向代理与 Nginx 反向代理进行说明。说明本文讨论的代理均指标准 HTTP 协议中的代理机制以及企业内网、开发测试环境中的合规部署不涉及任何违反法律法规的网络访问方式或工具。二、代理的基本概念在 HTTP 通信中最直接的方式是客户端直接向服务器发送请求客户端 - 服务器例如浏览器直接访问 Spring Boot 应用浏览器 - Spring Boot:8080而代理模式下中间会多出一个代理服务器客户端 - 代理服务器 - 目标服务器代理服务器接收请求后可能直接返回结果也可能把请求继续转发给其他服务器再把结果返回给客户端。代理的关键区别不在于网络方向而在于它代表谁是代表客户端还是代表服务器。代表客户端的代理称为正向代理代表服务器的代理称为反向代理。需要说明的是浏览器访问网站时通常发送的是 HTTP 或 HTTPS 请求。一个页面通常也不是一次请求就全部返回浏览器一般先请求 HTML再根据 HTML 中的引用继续请求 CSS、JavaScript、图片等前端 JavaScript 还可能通过接口请求 JSON 数据。服务器接收到请求后进行处理再通过 HTTP 响应返回相应内容。服务器中通常运行专门的软件监听网络端口、接收 HTTP 请求并返回响应这类软件通常称为 Web 服务器软件。三、正向代理1. 定义正向代理是代表客户端的代理。客户端主动配置或使用一个代理服务器由代理服务器代替客户端访问目标网站。其基本流程如下客户端 - 正向代理 - 目标服务器2. 示例通过正向代理访问网站例如当用户在企业合规代理环境中访问https://www.example.com时浏览器不是直接连接目标网站而是先把请求发送给正向代理。正向代理代替客户端访问目标网站再把结果返回给浏览器。在这个过程中客户端知道自己在使用代理目标网站看到的是正向代理服务器的 IP 地址正向代理代表的是客户端。因此正向代理隐藏的是客户端而不是服务器。3. 常见用途正向代理的常见用途包括企业统一出口代理上网行为管理与访问控制缓存与出口审计合规的客户端代理配置。在这些场景中客户端通常需要显式配置代理或者通过某种工具间接使用代理。4. 生活化比喻可以用一个比喻来理解正向代理客户端请了一个跑腿小哥去商店买东西。商店不知道真正买东西的人是谁只知道跑腿小哥来了。这个跑腿小哥代表的是客户端。因此正向代理可以理解为“客户端的跑腿小哥”。5. HTTPS 场景下的限制在 HTTPS 场景下正向代理通常通过CONNECT方法建立加密通道客户端与目标服务器之间的 TLS 加密仍然存在。因此代理一般只能看到目标域名、IP、端口等元数据无法直接读取加密后的具体内容。企业通过代理进行出口审计、访问控制、缓存时这些能力通常主要针对 HTTP 请求对于 HTTPS 请求若需要在合规前提下进行安全审计通常需要在终端安装受信任的企业证书并满足授权与隐私要求。这一点在理解正向代理的能力边界时非常重要。四、反向代理1. 定义反向代理是代表服务器的代理。它通常部署在服务器端位于外部客户端和内部后端应用之间。客户端以为自己访问的就是目标服务器但实际上请求先到达反向代理再由反向代理转发给内部应用。其基本流程如下客户端 - 反向代理 - 后端应用2. 示例Nginx 转发到 Spring Boot例如用户访问http://example.com这个域名解析到的可能不是 Spring Boot 应用而是 Nginx。Nginx 接收请求后再根据配置决定直接返回静态资源把请求转发给 Spring Boot 应用把请求分配给多个后端实例。在这个过程中客户端通常不知道后端应用的真实地址和端口后端应用不直接暴露给外部客户端反向代理代表的是服务器端客户端一般不需要做任何代理配置。因此反向代理隐藏的是服务器而不是客户端。3. 常见用途反向代理的常见用途包括作为网站统一入口隐藏内部后端服务器提供静态资源访问终止 HTTPS集中管理证书实现负载均衡限流、缓存、压缩、访问日志提高安全性和可维护性。4. 生活化比喻同样可以用一个比喻来理解反向代理客户去一家公司办事先到前台。前台询问需求后把客户转给具体部门。客户不需要知道具体由谁处理也不需要知道内部如何分工。这个前台代表的是公司也就是服务器端。因此反向代理可以理解为“服务器的前台”。五、为什么说 Nginx 是反向代理Nginx 通常部署在服务器端监听 80 或 443 端口接收来自外部客户端的 HTTP 或 HTTPS 请求。它站在服务器这一侧作为后端应用的统一入口。典型结构如下外部客户端 - Nginx - Spring Boot:8080对于客户端而言Nginx 看起来就像目标服务器对于真正的后端应用而言Nginx 是请求的来源。Nginx 根据配置决定直接返回静态资源还是把请求转发给 Spring Boot。因此Nginx 扮演的是反向代理的角色。更严谨地说反向代理是一种架构角色Nginx 是常见的反向代理软件之一。当 Nginx 作为反向代理时它会代表服务器端接收客户端请求并将请求转发给后端应用。Java Web 项目中的常见部署方式在采用 Vue3 和 Spring Boot 的前后端分离项目中前端和后端通常独立开发、独立构建、独立部署。一个常见的生产部署方式是Nginx 监听 80/443 端口对外提供服务Spring Boot 应用监听 8080 端口通常只在内网或本机可访问Vue3 项目构建后的 HTML、CSS、JavaScript 等静态文件由 Nginx 直接返回浏览器访问后端接口时Nginx 将/api等请求转发给 Spring Boot如果后端有多个实例Nginx 还可以进行负载均衡。例如Nginx 配置可以简化为如下形式server { listen 80; server_name example.com; location / { root /var/www/vue-dist; try_files $uri $uri/ /index.html; } location /api/ { proxy_pass http://127.0.0.1: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; } }这段配置表达的含义是访问前端页面、JavaScript、CSS、图片时Nginx 直接返回 Vue3 构建后的静态文件访问/api/开头的接口时Nginx 把请求转发给本机 8080 端口的 Spring Boot 应用通过X-Forwarded-For等请求头后端可以获取原始客户端 IP 和协议信息。需要注意proxy_pass末尾是否带斜杠会影响转发后的路径。proxy_pass http://127.0.0.1:8080/;请求/api/user会被转发为/user即去掉/api前缀。proxy_pass http://127.0.0.1:8080;请求/api/user会被转发为/api/user即保留/api前缀。两种写法都合法但语义不同。实际配置应以后端接口路径为准。若希望保留/api前缀应使用不带末尾斜杠的写法若希望去掉/api前缀则应使用带末尾斜杠的写法。如果后端部署了多个 Spring Boot 实例还可以使用upstream配置负载均衡upstream backend { server 127.0.0.1:8080; server 127.0.0.1:8081; } location /api/ { proxy_pass http://backend; }此时Nginx 会按照配置把请求分配给不同的后端实例。这种能力称为负载均衡。反向代理和负载均衡经常一起使用但二者并不完全等同反向代理强调的是 Nginx 作为后端应用的统一入口负载均衡强调的是把请求分发给多个后端实例。六、正向代理与反向代理的对比对比项正向代理反向代理代理对象客户端服务器谁主动使用客户端主动配置客户端通常无感知对外表现目标服务器看到代理地址客户端不知道真实后端地址典型位置客户端侧或公网服务器侧或数据中心入口典型用途企业出口管理、访问控制、审计、缓存统一入口、静态资源、HTTPS、负载均衡、安全隔离典型软件Squid、企业级正向代理网关等Nginx、HAProxy、云负载均衡、API 网关等需要说明的是标准 Nginx 主要定位是 Web 服务器和反向代理并不是通用的正向代理软件。虽然通过第三方模块可以实现部分正向代理功能但通常不会把 Nginx 作为正向代理的首选。七、没有 Nginx 会怎么样Nginx 并不是 HTTP 访问的必需品。没有 NginxSpring Boot 仍然可以通过内置 Web 服务器提供 HTTP 服务。例如Spring Boot 默认可以监听 8080 端口该端口可以通过配置修改。在开发、测试或内网环境中浏览器可以直接访问http://服务器IP:8080但是在前后端分离项目中前端和后端通常独立开发、独立构建、独立部署。Vue3 项目构建后会生成dist目录其中包含 HTML、CSS、JavaScript 等静态文件。生产环境中通常由 Nginx 或其他静态资源服务器托管这些文件Spring Boot 只负责提供/api等后端接口。Nginx 接收外部请求后静态资源直接返回接口请求转发给 Spring Boot。这样前端和后端的构建、发布、回滚可以相对独立也更利于缓存、CDN、HTTPS 和负载均衡。当然在小型项目、教学示例或单体简化部署场景中也可以将 Vue3 构建产物放入 Spring Boot 的静态资源目录由 Spring Boot 同时提供页面和接口。但这属于一种简化部署方式并不代表前后端分离项目的主流生产实践。在生产环境中通常不会将 Spring Boot 的 8080 端口直接暴露到公网而是只开放 Nginx 的 80/443 端口由 Nginx 统一接收外部请求再转发给内网的 Spring Boot 应用。如果没有 Nginx很多事情会变得更麻烦用户可能需要通过带端口的地址访问网站例如http://example.com:8080HTTPS 证书可能需要在 Spring Boot 中配置。虽然技术上可行但不利于多实例统一管理和证书轮换。更常见的做法是由 Nginx、云负载均衡器或 API 网关统一终止 HTTPS后端应用只处理内网 HTTP 请求静态资源的高并发返回、多个 Spring Boot 实例的请求分配、只暴露 80/443 端口而隐藏后端端口等需要由其他组件承担限流、缓存、压缩、访问日志、跨域处理等也需要由 Spring Boot 应用层引入相应组件处理或者交给云负载均衡、API 网关、Caddy、Traefik 等其他组件。关于跨域问题需要特别说明跨域问题的根源是浏览器的同源策略。如果前端页面和后端接口通过不同域名或端口访问浏览器可能产生跨域问题需要在后端配置 CORS或在 Nginx 层统一添加响应头。若由 Nginx 作为统一入口使前端页面和/api接口同源则可以避免这类跨域问题。Nginx 本身不是“解决跨域”的专用组件它的作用主要是统一入口和转发请求。Nginx 的作用可以理解为网站的统一入口它接收外部请求然后决定直接返回静态资源还是转发给后端应用并在有多个后端实例时把请求分配到不同实例。因此真正必需的不是 Nginx而是有一个程序监听网络端口、接收 HTTP 请求并返回响应。Spring Boot 内置的 Web 服务器就能提供后端 HTTP 服务而前端静态资源通常由 Nginx 等专门的 Web 服务器提供。Nginx 是实际项目中常用的入口层和反向代理软件它让静态资源、后端接口、HTTPS、负载均衡等更容易统一管理。八、总结正向代理和反向代理的关键区别在于代理代表谁。正向代理代表客户端。客户端主动使用代理代理替客户端访问目标服务器目标服务器通常不知道真实客户端。反向代理代表服务器。客户端访问反向代理反向代理再把请求转发给内部后端应用客户端通常不知道真实后端。用两个比喻概括正向代理是“客户端的跑腿小哥”。反向代理是“服务器的前台”。Nginx 通常扮演的是后者。它部署在服务器端作为外部请求的统一入口负责返回静态资源、转发后端接口、终止 HTTPS、实现负载均衡等。对于 Java 后端开发人员而言理解 Nginx 是反向代理有助于理解 Vue3 前端、Spring Boot 后端和生产部署之间的请求流转关系。在实际项目中应当注意区分“技术上可行”与“生产实践推荐”。例如Spring Boot 可以直接提供静态资源也可以直接配置 HTTPS但在前后端分离的主流生产实践中更常见的是由 Nginx 托管前端静态资源、统一处理 HTTPS 和反向代理Spring Boot 专注于后端 API。理解这些边界和适用场景有助于建立更规范的工程认知。
返回列表