推荐答案
要使用 ngx_http_realip_module
获取真实客户端 IP,首先需要在 Nginx 配置文件中加载该模块,并配置 set_real_ip_from
和 real_ip_header
指令。以下是一个示例配置:
-- -------------------- ---- ------- ----------- ---------------------------------- ---- - --- ---------------- --------------- ---------------- ----------- -------------- ---------------- ----------------- --- --- -
在这个配置中:
set_real_ip_from
指定了可信的代理服务器 IP 地址或 CIDR 范围。real_ip_header
指定了包含真实客户端 IP 的 HTTP 头字段,通常是X-Forwarded-For
。real_ip_recursive
启用递归查找,确保从X-Forwarded-For
中提取最左边的非可信 IP。
本题详细解读
1. ngx_http_realip_module
的作用
ngx_http_realip_module
模块用于在 Nginx 作为反向代理时,获取真实的客户端 IP 地址。当请求经过多个代理服务器时,客户端的原始 IP 地址可能会被代理服务器的 IP 地址覆盖。该模块通过解析 X-Forwarded-For
等 HTTP 头字段,提取出真实的客户端 IP。
2. 配置指令详解
set_real_ip_from
: 指定可信的代理服务器 IP 地址或 CIDR 范围。只有来自这些地址的请求,Nginx 才会尝试解析X-Forwarded-For
头字段。real_ip_header
: 指定包含真实客户端 IP 的 HTTP 头字段。通常使用X-Forwarded-For
,但也可以根据实际情况使用其他字段。real_ip_recursive
: 启用递归查找。当X-Forwarded-For
头字段中包含多个 IP 地址时,Nginx 会从右向左查找第一个不在set_real_ip_from
列表中的 IP 地址,并将其作为真实客户端 IP。
3. 示例配置解析
在示例配置中:
set_real_ip_from 192.168.1.0/24;
和set_real_ip_from 10.0.0.0/8;
指定了两个可信的代理服务器 IP 范围。real_ip_header X-Forwarded-For;
指定了X-Forwarded-For
头字段作为真实 IP 的来源。real_ip_recursive on;
启用了递归查找,确保从X-Forwarded-For
中提取最左边的非可信 IP。
4. 注意事项
- 确保
ngx_http_realip_module
模块已正确加载。可以通过nginx -V
命令检查模块是否已编译进 Nginx。 - 配置
set_real_ip_from
时,确保所有可信的代理服务器 IP 地址或范围都已包含在内,否则可能导致真实 IP 提取错误。 - 如果
X-Forwarded-For
头字段中包含多个 IP 地址,且未启用real_ip_recursive
,Nginx 默认会使用最右边的 IP 地址作为真实客户端 IP。