详解正向代理的真实场景应用

详解正向代理的真实场景应用

我们项目中大量使用 Nginx 作为正向代理和反向代理,这里举一个我用 Nginx 作为正向代理的真实案例。

背景

公司生产一些硬件设备,而这些设备在生产的过程中,需要调用我们后台系统的接口,我们后台系统所在的网络和设备的网络并不在同一个网段内,想要实现网络互通,我们在设备和系统之间加了一层正向代理服务器,设备先将请求发送给代理服务器,由代理服务器将请求转发给后台系统。

解决方案

如下图所示:

设备 1 和设备 2 的 IP 在 192.168.1.0/24 IP 地址段内,HTTP 请求先发到代理服务器,然后转发到后台服务器集群的网关地址(192.168.52.123)。

代理服务器上有两个网卡,和设备之间的网络是通的,和服务器集群之间的网络也是通的。这样就能保证设备的请求能够正常发送到系统了。

疑问:为啥不把后台系统的服务器 IP 改成和设备同一网段?

答: 问题出在不能保证设备和后台系统在同一局域网内。有的设备是在其他局域网内生产的,即使在同一个网段内,但是是跨局域网的,设备和后台系统也是无法连通的。

项目中如何使用正向代理

以下是一个 Nginx 的正向代理的配置,

ini 复制代码
http {
    server {
        listen       80;
        server_name  www.passjava.cn;

        location / {
            proxy_pass http://target_server;
            proxy_set_header Host $host;
        }
    }
}

完整的 NGINX 配置如下:

正向代理后如何获取真实 IP

另外我们的系统还需要获取设备的真实 IP,这就需要在 Nginx 加上配置:

bash 复制代码
# location 模块中加入以下配置:
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

上述配置可以暴露客户端的真实 IP 地址给目标服务器,特别是 proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 这两行配置。

让我解释一下这三行配置的含义:

  1. proxy_set_header Host $host;:这一行配置将客户端请求中的 Host 头部信息传递给目标服务器。这是正常的 HTTP 头部信息传递,不涉及客户端 IP 地址。
  2. proxy_set_header X-Real-IP $remote_addr;:这一行配置将客户端的真实 IP 地址作为 X-Real-IP 头部信息传递给目标服务器。这意味着目标服务器可以访问到客户端的真实 IP 地址。
  3. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;:这一行配置将客户端的 IP 地址添加到 X-Forwarded-For 头部信息中,并传递给目标服务器。这是为了记录代理请求的前几个客户端的 IP 地址,通常包括客户端的真实 IP 地址。

当目标服务器收到这些头部信息时,它可以通过 X-Real-IPX-Forwarded-For 头部来获取客户端的真实 IP 地址。

相关推荐
LabVIEW开发6 小时前
LabVIEW QMH 队列消息处理架构
架构·labview·labview知识·labview功能·labview程序
代码搬运媛6 小时前
Jest 测试框架详解与实现指南
前端
counterxing7 小时前
我把 Codex 里的 Skills 做成了一个 MCP,还支持分享
前端·agent·ai编程
wangqiaowq7 小时前
windows下nginx的安装
linux·服务器·前端
rising start7 小时前
二、全面理解MySQL架构
mysql·架构
之歆7 小时前
DAY_12JavaScript DOM 完全指南(二):实战与性能篇
开发语言·前端·javascript·ecmascript
发现一只大呆瓜8 小时前
Vite凭什么这么快?3分钟带你彻底搞懂 Vite 热更新的幕后黑手
前端·面试·vite
麦客奥德彪8 小时前
Android Skills
架构·ai编程
Maimai108088 小时前
React如何用 @microsoft/fetch-event-source 落地 SSE:比原生 EventSource 更灵活的实时推送方案
前端·javascript·react.js·microsoft·前端框架·reactjs·webassembly
candyTong8 小时前
Claude Code 的 Edit 工具是怎么工作的
javascript·后端·架构