使用 nginx 和节点获取 ip 用户

get ip user with nginx and node

我在使用 nginx 和节点时遇到问题,因为当我想通过节点获取用户的 ip 时,在我的本地主机中工作正常(不使用 nginx)但在我的服务器中不能正常工作。我正在研究并看到节点号是第一个接收到 ip 的节点,它是 nginx 并且在 nginx 之后将请求发送到节点。那么节点收到的 ip 是我的服务器而不是用户的 ip。查看配置服务器 nignx:

location / {
        proxy_pass https://fotogena.co:8000;  <-nginx send req to node
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_connect_timeout   1000;
        proxy_send_timeout      1500;
        proxy_read_timeout      2000;
}

我使用 "req.connection.remoteAddress" 来了解用户的 ip,控制台显示我的服务器的 ip。有人知道如何解决这个问题吗?

谢谢 :D

------------2016-04-20--------

我可以解决这个问题,在 nginx 文件设置上使用这一行

proxy_set_header X-Real-IP $remote_addr;

和node.js

req.headers['x-forwarded-for']

您可以使用以下设置配置 NGINX 以传递客户端的 IP 地址:

location / {
        proxy_pass https://fotogena.co:8000;
        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;  # This line.
        proxy_connect_timeout   1000;
        proxy_send_timeout      1500;
        proxy_read_timeout      2000;
}

然后您可以使用来自 req.headers["x-real-ip"] 的 HTTP header X-Real-IP

proxy_set_header X-Real-IP $remote_addr; 对我没用

当 运行 Express 应用程序在代理后面时,您必须将应用程序变量 trust proxy 设置为 true。 Express 提供了一些其他的信任代理值,您可以在他们的文档中查看这些值,但现在,我们不必介意它们。

事不宜迟,这些是向您的应用程序显示访问者 IP 地址的步骤:

  1. app.set('trust proxy', true) 在您的 Express 应用中。
  2. 在服务器块的 Nginx 配置中添加 proxy_set_header X-Forwarded-For $remote_addr
  3. 您现在可以从 req.header('x-forwarded-for')req.connection.remoteAddress;

像下面的 Nginx 配置

location /  {
            proxy_pass    http://localhost:3001;
            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-Forwarded-For $remote_addr;  # this line
            proxy_cache_bypass $http_upgrade; 
    }