暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

nginx记录客户端真实ip问题与日志时间格式修改

孤岛鱼夫 2018-07-14
1931

本公众号内容大多由平时操作整理记录,如果有错误的地方欢迎留言指正

nginx日志记录客户端ip问题

nginx在使用负载均衡时后端服务的日志记录默认会记录反向代理服务器的ip地址,不记录客户端真实ip,要使后端服务器记录真实客户端ip,需要在代理服务器添加一些设置。并且后端服务要确保使用realip模块, realip 模块的作用是:当本机的nginx处于一个反向代理的后端时获取到真实的用户
ip。

nginx代理上的设置

#负载均衡设置

        location ~ \.(html|jpg|png|jpeg)$ {

                proxy_pass http://webserver;
                proxy_next_upstream http_404;
                proxy_set_header Host     $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-forwarded-for $proxy_add_x_forwarded_for;
        }

后端nginx服务器设置

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
set_real_ip_from 192.168.214.148;
real_ip_header X-Real-IP;

proxy_set_header指令: 允许将字段重新定义或附加到传递给代理服务器的请求标头

  • Host $host
    ;  : 允许将字段重新定义或附加到传递给代理服务器的请求标头,Host 是定义的变量名称,host获取的值赋值给Host

  • proxy_set_header X-Real-IP $remote_addr
    ;    作用同上,nginx代理服务器获取到的ip的真实的客户端ip地址

  • proxy_set_header X-forwarded-for

    不能识别此Latex公式:
    proxy_add_x_forwarded_for;  用于识别通过HTTP代理或负载平衡器原始IP一个连接到Web服务器的客户机地址的非rfc标准,如果有X-Forwarded-For设置的话,每次经过proxy转发都会有记录,格式就是client1, proxy1, proxy2,以逗号隔开各个地址,那么后端的日志中就会把客户端ip和经过的每一级代理服务器ip都记录下来,获取客户端ip就取第一个ip。(使用X-forwarded-for那么在每一级代理服务器上都要设置该参数)多级代理时使用该参数




  • set_real_ip_from 192.168.214.148;  realip模块的作用,告诉服务器 192.168.214.148是代理服务器,

  • real_ip_header X-Real-IP;   告诉服务器真正的用户IP

日志中的时间格式修改

默认的日志定义如下:

log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

生成日志

192.168.214.134 - - [30/Jun/2018:03:14:23 +0800] "GET /index.html HTTP/1.0" 200 18 "-" "curl/7.29.0"
192.168.214.134 - - [30/Jun/2018:03:14:23 +0800] "GET /index.html HTTP/1.0" 200 18 "-" "curl/7.29.0"
192.168.214.134 - - [30/Jun/2018:03:14:43 +0800] "GET /index.html HTTP/1.0" 200 18 "-" "curl/7.29.0"

上面的日志中时间格式不是标准时间格式,不好查看和匹配,日志内容参数有其他格式可以替换,如下对比:

  • $time_iso8601
    : ISO 8601标准格式的当地时间

  • $time_local
    : 通用日志格式的本地时间


将日志格式该为
time_iso8601

192.168.214.134 - - [2018-06-30T04:01:24+08:00] "GET /index.html HTTP/1.0" 200 18 "-" "curl/7.29.0" "-"
192.168.214.134 - - [2018-06-30T04:01:24+08:00] "GET /index.html HTTP/1.0" 200 18 "-" "curl/7.29.0" "-"
192.168.214.134 - - [2018-06-30T04:01:24+08:00] "GET /index.html HTTP/1.0" 200 18 "-" "curl/7.29.0" 

时间中的 T 是将日期与时间隔开的分隔字符








文章转载自孤岛鱼夫,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论