Skip to content

Node.js 如何在 Nginx 代理下获取真实 IP

Posted on:2024年6月6日 at 04:43

在现代 Web 开发中,Node.js 常被用作后端服务器,而 Nginx 则被广泛用作反向代理服务器。当我们在 Nginx 代理后运行 Node.js 应用时,一个常见的问题是如何获取客户端的真实 IP 地址。由于请求会先通过 Nginx,再转发给 Node.js,因此 Node.js 服务器接收到的请求 IP 会是 Nginx 的 IP,而非客户端的真实 IP。本文将介绍如何在 Nginx 代理下正确配置和获取客户端的真实 IP。

配置 Nginx

为了让 Node.js 应用能获取到客户端的真实 IP,我们需要在 Nginx 配置文件中做一些调整,主要是利用 X-Forwarded-For 头。以下是一个示例配置:

server {
    listen 80;
    server_name your_domain.com;

    location / {
        proxy_pass http://localhost:3000;  # Node.js 应用的地址和端口
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
    }
}

在这个配置中:

这些头信息将传递给 Node.js 应用,以便在应用中获取。

Node.js 中获取真实 IP

在 Node.js 应用中,可以通过 request 对象的 headers 属性来获取这些头信息。以下是一个使用 Express 框架的示例:

const express = require("express");
const app = express();

app.use((req, res, next) => {
  const ip = req.headers["x-forwarded-for"] || req.connection.remoteAddress;
  console.log(`Client IP: ${ip}`);
  next();
});

app.get("/", (req, res) => {
  res.send("Hello World!");
});

app.listen(3000, () => {
  console.log("Server is running on port 3000");
});

在这个示例中:

这样,通过配置 Nginx 和修改 Node.js 应用,我们就可以在 Nginx 代理后获取到客户端的真实 IP 地址。

注意事项

  1. 信任代理:为了防止 IP 伪造攻击,务必确保 Node.js 应用只信任受信任的代理。可以在 Express 应用中配置受信任的代理:

    app.set("trust proxy", "127.0.0.1"); // 仅信任来自本地的代理
    

    或者如果你有多个代理服务器:

    app.set("trust proxy", ["127.0.0.1", "10.0.0.1"]); // 信任多个代理服务器
    
  2. 安全性:确保你的 Nginx 和 Node.js 配置仅在可信的环境中使用,以防止潜在的安全风险。

  3. 负载均衡:如果你在使用多个代理服务器(例如负载均衡器),X-Forwarded-For 头可能包含一个逗号分隔的 IP 地址列表。在这种情况下,客户端的真实 IP 地址是列表中的第一个 IP。