使用 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 地址的步骤:
app.set('trust proxy', true)
在您的 Express 应用中。
- 在服务器块的 Nginx 配置中添加
proxy_set_header X-Forwarded-For $remote_addr
。
- 您现在可以从
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;
}
我在使用 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 地址的步骤:
app.set('trust proxy', true)
在您的 Express 应用中。- 在服务器块的 Nginx 配置中添加
proxy_set_header X-Forwarded-For $remote_addr
。 - 您现在可以从
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; }