Nginx 容器中的Node.js始终获取docker0 ip

Nginx 容器中的Node.js始终获取docker0 ip,nginx,docker,Nginx,Docker,我在docker容器中托管一个node.js服务器和express.js。 我的集装箱地址是172.17.0.62 我使用nginx将流量重定向到172.17.0.62 我可以访问我的服务器。 但是当我使用 console.log(req.ip + ' ' + req.protocol + ' ' + req.originalUrl); 记录流量。 请求ip始终为172.17.42.1。 我想获得我的网页的浏览者的ip 我在nginx配置中使用它 proxy_set_header X-Real

我在docker容器中托管一个node.js服务器和express.js。 我的集装箱地址是172.17.0.62 我使用nginx将流量重定向到172.17.0.62

我可以访问我的服务器。 但是当我使用

console.log(req.ip + ' ' + req.protocol + ' ' + req.originalUrl);
记录流量。 请求ip始终为172.17.42.1。 我想获得我的网页的浏览者的ip

我在nginx配置中使用它

proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;


我没有使用docker-但您应该能够从x-forwarded-for获得所需的信息:

从以上链接:

var ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress;
哦,有趣的是,上面的第二个答案可能更适合你的需要。而不是在任何地方更改代码,它会尝试获取用户的ip地址。您只需更改初始化express的方式即可:

app.enable('trust proxy');

仅供参考,这在群集情况下是不可能的。我在寻找解决方案时偶然发现了这一点。我在docker compose设置中有一个nginx容器,无法获取客户端的IP,因此我需要从swarm中删除nginx路由。这显然是一个众所周知的问题:

它有效!谢谢你证明了这个链接。这有助于我进一步了解ip转发。酷!
app.enable('trust proxy');