【问题标题】:How to forward request IP from NGINX to node.js application?如何将请求 IP 从 NGINX 转发到 node.js 应用程序?
【发布时间】:2019-08-29 10:19:43
【问题描述】:

我让 NGINX 作为反向代理运行,它将所有 http 和 https 流量转发到我的 node.js 应用程序,该应用程序监听 localhost:port

但是我遇到的问题是 node.js 应用程序将所有传入请求视为来自 ::ffff:127.0.0.1

如何更改 NGINX 配置,以便将真实 IP 传递并转发到 node.js 应用程序?

server {
    listen 80;
    listen [::]:80;
    listen 443;
    listen [::]:443;

    root /var/www/example.com/html;
    index index.html index.htm;

    server_name example.com;

location / {
proxy_set_header X-Real-IP $remote_addr;
    proxy_pass http://localhost:myport;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection 'upgrade';
    proxy_set_header Host $host;
    proxy_cache_bypass $http_upgrade;
}

 # Requests for socket.io are passed on to Node on port x
  location ~* \.io {
  proxy_set_header X-Real-IP   $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header Host $http_host;
  proxy_set_header X-NginX-Proxy true;

  proxy_pass http://localhost:myport;
  proxy_redirect off;

  proxy_http_version 1.1;
  proxy_set_header Upgrade $http_upgrade;
  proxy_set_header Connection "upgrade";
}


}

编辑:express.js/node.js 应用程序处理 req.ip 并具有 app.enable('trust proxy');启动时

【问题讨论】:

  • proxy_set_header X-Real-IP $remote_addr 我想你已经猜对了。您应该能够从“X-Real-IP”标头中读取真实 IP。现在怎么了?
  • 你的nodejs应用是如何读取IP的?
  • 感谢您的回答。来自 req.ip
  • 我相信您是在专门谈论“express.js 应用程序”而不是任何一般的“node.js 应用程序”。我建议修改您的问题以反映这一点。
  • 另外,我相信你已经读过这个guide。看起来你已经做对了大多数事情,除了一个:在 nginx conf 中你 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for。我相信正确的答案应该是proxy_set_header X-Forwarded-For $remote_addr

标签: node.js express ubuntu nginx


【解决方案1】:

Express.js 官方网站有这个guide。说明:

  1. app.set('trust proxy', true) 在 js 中。
  2. proxy_set_header X-Forwarded-For $remote_addr 在 nginx.conf 中
  3. 您现在可以从 req.ip 属性中读取客户端 IP 地址

【讨论】:

  • 您的意思是“app.set”还是“app.enable”?因为在官方快递文档中我只能用“app.set”找到它。顺便说一句:任何想法当我编辑我的 nginx 配置(当然重新启动)并添加 app.enable('trust proxy') (也尝试使用 app.set)并且没有任何更改时可能是什么原因。如果配置有任何影响,你能以某种方式调试吗?
  • 终于完成了。我必须使用“app.set('trust proxy', true)”(而不是 true,您可以使用反向代理的 IP 地址 - nginx)。而且我必须在服务器部分的 nginx/sites-available/default 中设置 nginx.conf 而不是 nginx.conf。
【解决方案2】:

考虑到上面的 NGINX 配置,这解决了它。

var ip = req.headers['x-real-ip'] || req.connection.remoteAddress;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-19
    • 2015-03-16
    • 2021-11-17
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    相关资源
    最近更新 更多