You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Nginx代理未传递真实IP问题排查:生产与测试环境差异

问题定位求助

我用Ubuntu Server 22.04搭建了Nginx 1.24 + Node.js(PM2)的多站点环境,其中一个Next.js前端会连接PHP后端API,Nginx负责处理API和PHP请求并代理至Node服务器。目前遇到的问题是:当应用通过getServerSideProps调用API时,Nginx访问日志记录的是服务器外部IP而非用户真实IP,但测试服务器与生产服务器配置一致,测试环境却能正常记录用户真实IP,不清楚还需排查两处配置的哪些差异来定位问题,恳请帮助或建设性意见。

Next.js 配置(next.config.js)

async rewrites() {
    return [
        {
            source: '/api/:path*',
            destination: `${process.env.NEXT_PUBLIC_API_BASE_URL}/api/:path*`,
        },
        {
            source: '/public/:path*',
            destination: `${process.env.NEXT_PUBLIC_API_BASE_URL}/public/:path*`,
        },
    ]
},

Nginx 服务器块代理配置

location / {
    proxy_pass http://localhost:9003;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    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;
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-Port $server_port;
}

location /api {
    try_files $uri $uri/ /api/index.php$is_args$args;
}

排查方向建议

  • 检查生产服务器网络拓扑:是否存在额外的反向代理、CDN或负载均衡器?这类设备会先接收用户请求再转发给Nginx,此时Nginx获取的$remote_addr会是中间设备的IP而非用户真实IP,测试环境可能无此类层级所以正常。
  • 核对NEXT_PUBLIC_API_BASE_URL取值:生产环境中该变量是否指向服务器外部IP/域名?如果是,getServerSideProps在服务器端发起请求时相当于从服务器自身访问API,日志自然记录服务器IP;测试环境若指向localhost或内部地址则不会出现此问题。
  • 对比Nginx日志格式配置:确认生产与测试环境的日志格式是否一致,是否正确包含$remote_addr或$http_x_forwarded_for字段,若生产环境日志未使用$http_x_forwarded_for,即使头部已传递也不会记录真实IP。
  • 检查Nginx全局配置:对比两处服务器的/etc/nginx/nginx.conf,看生产环境是否存在覆盖或缺失的全局proxy_set_header配置项。
  • 验证服务器防火墙/安全组规则:生产服务器是否有特殊规则导致请求源IP被改写,比如SNAT转发规则改变了请求源地址。

内容的提问来源于stack exchange,提问作者Sonny

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 16:22:55