nginx real_ip && deny 协作

1. 没有 real_ip 模块时

  • Nginx 拿到的客户端 IP = 直接和它建立 TCP 连接的 IP

  • 如果前面有 负载均衡 / 代理 / CDN,那 nginx 看到的就是这些代理的内网 IP。

  • 这时 deny 针对的就是 代理的 IP,而不是用户的真实 IP。

例子:

 
用户(1.2.3.4) → CDN(10.0.0.2) → nginx
  • nginx 看到的客户端 IP = 10.0.0.2

  • deny 1.2.3.4; 不起作用,因为 nginx 根本看不到 1.2.3.4


2. 配置了 real_ip 模块后

real_ip 模块的作用就是:

  • 告诉 nginx 信任哪些代理 IP(通过 set_real_ip_from

  • 从请求头里(如 X-Forwarded-ForX-Real-IP)提取出真正的客户端 IP(通过 real_ip_header

配置示例:

 
set_real_ip_from 10.0.0.0/8; # 信任代理的内网 IP real_ip_header X-Forwarded-For;

这样:

 
用户(1.2.3.4) → CDN(10.0.0.2, 加上请求头 X-Forwarded-For: 1.2.3.4) → nginx
  • nginx 识别的客户端 IP = 1.2.3.4

  • deny 1.2.3.4; 就会生效


3. 总结效果

  • 没配 real_ipdeny 针对的是代理/CDN 的 IP。

  • 配了 real_ipdeny 针对的就是真实用户 IP。【nginx会提取出真实的客户端地址】

 

注意:

nginx 日志文件(比如 /var/log/nginx/access.log 或你提到的 /var/log/supervisor/nginx.log)里,不要直接用 vi 打开修改。原因是:

  1. 日志文件是由 nginx 或 supervisor 进程不断写入的

    • vi 打开后,文件会被占用或截断(尤其是你保存退出时),导致日志写入异常。

  2. 如果 vi 保存时文件被清空或 inode 改变,nginx 仍然写入旧的文件句柄,而新的日志就进不去了,看起来就像“日志不再写入”。

posted on 2025-09-08 23:35  星星眨着眼  阅读(13)  评论(0)    收藏  举报

导航