如何使用Nginx在日志文件中记录实际用户的IP地址

时间:2020-01-09 10:42:18  来源:igfitidea点击:

我的Nginx服务器位于反向代理负载平衡器的后面。
当nginx在负载均衡器后面时,如何在nginx日志文件中显示正确的客户端IP地址?
如果在反向代理,负载均衡器和HTTPS前端(例如HAProxy/Pound)之后使用nginx,则可能会难以记录或者获取真实IP地址。

HAproxy LB并将实际用户IP记录在Nginx日志文件中而不是代理服务器中

如何记录真实用户IP而不是代理服务器?

您需要使用ngx_http_realip_module模块。
它用于将客户端地址和可选端口更改为在指定的标头字段中发送的地址。
编辑您的nginx.conf或者default.conf文件:

$ sudo vi /etc/nginx/conf.d/default.conf

并设置以下两个指令:

set_real_ip_from  192.168.1.4;
    real_ip_header    X-Forwarded-For;

保存并关闭文件。
其中:

  • set_real_ip_from 192.168.1.4;设置已知可发送正确替换地址的可信地址。 192.168.1.4是我的负载平衡器或者反向代理服务器。
  • real_ip_header X-Forwarded-For;您需要定义请求标头字段,其值将用于替换客户端地址。 X-Real-IP和X-Forwarded-For参数包含客户端的真实IP地址。通常在您的负载均衡器或者客户端IP地址中设置此标头。

您必须重新启动或者重新加载您的nginx服务器:

$ sudo service nginx restart

或者

$ systemctl reload nginx

验证

在nginx.conf中设置set_real_ip_from之前:

$ sudo tail -f /var/log/nginx/access.log

输出示例:

192.168.1.4 - - [18/Jan/2016:20:34:02 +0000] "GET / HTTP/1.0" 200 700 "https://theitroad.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36"

在nginx.conf中设置set_real_ip_from后:

$ sudo tail -f /var/log/nginx/access.log
204.55.22.11 - - [18/Jan/2016:20:34:02 +0000] "GET / HTTP/1.0" 200 700 "https://theitroad.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36"