编程 使用 Nginx 获取客户端真实 IP

2024-11-18 14:51:58 +0800 CST views 709

使用 Nginx 获取客户端真实 IP

在使用 Nginx 作为反向代理或负载均衡器时,我们常常需要获取客户端的真实 IP 地址。然而,默认情况下,Nginx 的 $remote_addr 变量记录的 IP 地址可能是上游代理或负载均衡器的 IP,而非实际客户端的 IP。为了确保我们能够正确获取和记录客户端的真实 IP,本文将介绍如何配置 Nginx,并进行调试。

一、配置 Nginx 获取客户端真实 IP

1、基本配置说明

首先,我们需要确保 Nginx 能够正确解析来自上游代理或负载均衡器的 X-Forwarded-For 头部信息。通过配置 real_ip_headerset_real_ip_from,Nginx 可以将 $remote_addr 更新为客户端的真实 IP。

示例配置:

http {
    include       mime.types;
    default_type  application/octet-stream;
    server_tokens off;

    # 设置真实 IP 的头部信息
    real_ip_header X-Forwarded-For;

    # 指定可信任的上游代理 IP 范围,这里以 172.0.0.0/8 为例
    set_real_ip_from 172.0.0.0/8;

    # 其他配置
    ...
}
  • real_ip_header X-Forwarded-For;:指定从哪个头部获取客户端的真实 IP 地址,常见的头部包括 X-Forwarded-ForX-Real-IP 等。
  • set_real_ip_from 172.0.0.0/8;:指定哪些 IP 地址段的请求可以被信任。如果请求来自这些地址段,那么 Nginx 会根据 real_ip_header 的配置更新 $remote_addr

2、set_real_ip_from详解

1. 请求来源 IP 在 set_real_ip_from 范围内

如果请求来源的 IP 地址在 set_real_ip_from 指定的范围内,Nginx 会信任该请求,并使用 real_ip_header 指定的头部(如 X-Forwarded-For)中的值作为客户端的真实 IP 地址。

行为:
Nginx 使用 X-Forwarded-For 头中的第一个(最左边的)IP 地址作为 $remote_addr(即客户端的真实 IP 地址)。

2. 请求来源 IP 不在 set_real_ip_from 范围内

如果请求来源的 IP 地址不在 set_real_ip_from 指定的范围内,Nginx 不会信任这个请求中的 X-Forwarded-For 头部中的 IP 地址。

行为:
Nginx 直接使用请求来源的 IP 地址(即 $remote_addr)作为客户端的 IP 地址。

3、log_format 配置(参考)

配置日志格式时,可以直接使用 $remote_addr 变量。Nginx 在解析 real_ip_header 后,会自动将 $remote_addr 替换为解析后的真实 IP 地址。

日志格式配置:

log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                '$status $body_bytes_sent "$http_referer" '
                '"$http_user_agent" "$http_x_forwarded_for"';
  • $remote_addr:在配置了 real_ip_header 之后,这个变量将代表客户端的真实 IP 地址。

二、调试与测试

为了确保配置正确,我们可以使用一个简单的调试日志来测试 X-Forwarded-For 头部的内容。

添加调试日志

可以通过下面的配置,将 X-Forwarded-For 头部记录到一个专门的调试日志文件中。

调试日志配置:

log_format debug '$http_x_forwarded_for';
access_log /path/to/log/debug.log debug;

通过这一配置,你可以在调试过程中直接查看 X-Forwarded-For 头部的内容,以确认它是否包含客户端的真实 IP 地址。

检查调试日志

配置完成后,重启 Nginx,并通过访问应用生成一些日志。然后,查看调试日志 /path/to/log/debug.log 以验证 X-Forwarded-For 头部的值。

tail -f /path/to/log/debug.log

三、Lua 中使用客户端真实 IP(参考)

在实际应用中,如果你使用了 OpenResty 或 Nginx 的 Lua 模块,可以在 Lua 代码中使用 ngx.var.remote_addr 来获取解析后的真实 IP。

示例代码:

access_by_lua "
local uid = ngx.var.cookie_bb_id
if not uid then
    uid = ngx.md5(ngx.now() .. ngx.var.remote_addr .. ngx.var.http_user_agent)
    ngx.header['Set-Cookie'] = 'bb_id=' .. uid .. '; path=/; Expires=' .. ngx.cookie_time(ngx.time() + 3650*86400) .. '; Secure; SameSite=None'
end
";

在上面的 Lua 代码中,ngx.var.remote_addr 会获取到解析后的客户端真实 IP。这在用户跟踪或日志记录中非常有用。

四、总结

通过正确配置 real_ip_headerset_real_ip_from,我们可以确保 Nginx 能够通过 $remote_addr 获取并记录客户端的真实 IP 地址。在配置完成后,通过调试日志可以验证配置是否生效。如果你在 Lua 中需要获取真实 IP,可以直接使用 ngx.var.remote_addr

复制全文 生成海报 Nginx 网络配置 服务器管理

推荐文章

JavaScript设计模式:桥接模式
2024-11-18 19:03:40 +0800 CST
pycm:一个强大的混淆矩阵库
2024-11-18 16:17:54 +0800 CST
html一个包含iPhoneX和MacBook模拟器
2024-11-19 08:03:47 +0800 CST
Vue中的异步更新是如何实现的?
2024-11-18 19:24:29 +0800 CST
一个简单的打字机效果的实现
2024-11-19 04:47:27 +0800 CST
JavaScript设计模式:观察者模式
2024-11-19 05:37:50 +0800 CST
使用Rust进行跨平台GUI开发
2024-11-18 20:51:20 +0800 CST
MySQL用命令行复制表的方法
2024-11-17 05:03:46 +0800 CST
js生成器函数
2024-11-18 15:21:08 +0800 CST
mysql 优化指南
2024-11-18 21:01:24 +0800 CST
go错误处理
2024-11-18 18:17:38 +0800 CST
在 Rust 生产项目中存储数据
2024-11-19 02:35:11 +0800 CST
基于Flask实现后台权限管理系统
2024-11-19 09:53:09 +0800 CST
Vue3中的JSX有什么不同?
2024-11-18 16:18:49 +0800 CST
Plyr.js 播放器介绍
2024-11-18 12:39:35 +0800 CST
CSS 特效与资源推荐
2024-11-19 00:43:31 +0800 CST
js常用通用函数
2024-11-17 05:57:52 +0800 CST
Golang Select 的使用及基本实现
2024-11-18 13:48:21 +0800 CST
Golang 中应该知道的 defer 知识
2024-11-18 13:18:56 +0800 CST
JavaScript设计模式:发布订阅模式
2024-11-18 01:52:39 +0800 CST
Vue3中的Scoped Slots有什么改变?
2024-11-17 13:50:01 +0800 CST
一键压缩图片代码
2024-11-19 00:41:25 +0800 CST
前端代码规范 - Commit 提交规范
2024-11-18 10:18:08 +0800 CST
FcDesigner:低代码表单设计平台
2024-11-19 03:50:18 +0800 CST
jQuery `$.extend()` 用法总结
2024-11-19 02:12:45 +0800 CST
程序员茄子在线接单