请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

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

你好老师

我使用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?

正在回答 回答被采纳积分+3

1回答

天经地义 2020-10-10 14:04:55
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 回复 有任何疑惑可以回复我~
  • 提问者 stevenfung #1
    我的是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 14:12:15
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信