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
相关产品推荐
相关产品推荐

