使用nginx反向代理 在web服务器日志获取客户ip

来源:14-5 nginx负载均衡注意事项

stevenfung

2020-10-10

你好老师

我使用nginx作反向代理,然后下面又有3个nginx作web服务器,
我在反向代理nignx的设置中增加了你之前提及的3条参数:

proxy_set_header Host $host; 
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

在web服务器中可以使用tp提供的方法获取到用户的正式ip
如:

$header = $this->request->header();
dump($header);

输出如:

"x-forwarded-for" => "223.234.23.121"
"x-real-ip" => "223.234.23.121"

但是我从web服务器的日志中还是无法得到此客户真实IP,显示的还是内网的反向代理nginx的IP
请问有何方法,使得在web服务器的日志中记录客户真实IP?

写回答

1回答

天经地义

2020-10-10

proxy_set_header Host $host; # 设置header中的Host参数,值为$host这个变量的值
proxy_set_header X-Real-IP $remote_addr; # 设置header中的X-Real-IP参数,值为$remote_addr这个变量的值
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 设置header中的X-Forwarded-For参数,值为$proxy_add_x_forwarded_for这个变量的值

上面这三个设置请求的header,目的是想要将下游客户端的ip传递给上游的服务


反向代理时可以使用nginx的ngx_http_realip_module模块传递真实IP可以参考下面这个官方文档

http://nginx.org/en/docs/http/ngx_http_realip_module.html


php能获取到真实IP,而您的nginx日志还不是,主要是用错了变量,您可以尝试将nginx的log_format中“$remote_addr”改为“$http_x_forwarded_for”或“$http_x_real_ip”,或者直接添加这两个变量,重启下nginx再次请求看下

0
1
stevenfung
我的是docker 在web服务nginx设置文件中增加了两条就可以了: server { # Add option for x-forward-for (real ip when behind elb) real_ip_header X-Forwarded-For; set_real_ip_from 192.168.1.2; 192.168.1.2是我的反向代理内网ip
2020-10-12
共1条回复

全流程开发 TP6.0实战高并发电商服务系统

一课就能掌握TP6.0基础及运用,打造完整高并发的电商后端项目

1463 学习 · 1332 问题

查看课程