一  nginx关于日志的配置

备注: main'不是日志级别',而是采用的'日志格式'

日志官方参考

(1)错误日志配置

针对虚拟主机设置

server {
        access_log /data/log/www;  '核心'
        listen 80;
        server_name www.wzj.com;
        location / {
                root /data/www/www;
                index index.html index.htm;
        }
        error_log    logs/error_www.wzj.com.log    error; '核心'
}
access_log off;  --> 关闭access_log,即'不记录访问日志'

(2)日志格式

注意:log_format配置'必须放在http内',否则会出现'警告'信息

$request_time:'整个请求'的总时间

$upstream_response_time:请求过程中,'upstream的响应时间' -->'502和504报错'

二  Nginx日志分隔

三  Nginx日志了解业务状态

四   通过代理获取客户端真实的ip

具体的业务场景: 通过'WAF和CDN'去获取客户端的'真实ip'

CDN获取客户端真实的ip

默认 'ngx_http_realip_module' 这个模块是安装的 --> Nginx作为负载均衡'获取真实IP'依赖该http_realip_module模块
环境说明: A nginx'配置了反向代理','后端服务器'B也是nginx,'后端服务器B'去'获取客户端真实的ip',而'不是'代理服务器的ip

++++++++++'各组件的说明'++++++++++

'proxy':172.25.2.100

'backend':172.25.2.200、172.25.2.201

'client': 172.25.2.202

 1)代理服务器的配置

'错误的'方式

备注:'正确'方式

2)backend的首页面的修改

3)客户端测试

备注: 172.25.2.202没有做本地解析'/etc/hosts',curl通过'--resolve'来进行本地解析

查看proxy的日志

查看两个backend的日志

结论: 很明显'默认的配置',backend并不能'获取客户端真实的ip'

4)获取客户端的ip

各种场景获取客户端真实的ip

CDN下nginx获取用户真实IP地址

备注: 从上面的日志中我们可以看出'proxy'已经获取客户端的ip,我们只需要让'proxy'在转发请求的时候'透传'出去即可

++++++++++++++'分割线'

备注: 我们需要知道整个流量的走向,换句话说'经过了多少个代理'-->'proxy'

与代理相关的变量

场景1: '不修改'backend的日志格式

+++++++++++++'分割线'+++++++++++++

上面我们已经知道:默认情况下,'remote_addr'是跟其直连的ip,可能为'proxy'或者'client'

思路1: proxy在透传的时候直接修改'backend'要获取的'remote_addr'的数值
log_format默认的 '$http_x_forwarded_for'就是'proxy_set_header X-Forwarded-For $remote_addr;'这个'代理转发请求头'的值

++++++++++'分割线'++++++++++

从'默认的日志'可以看出: 该变量的值为'-'表示置空,即表示设置该请求头

172.25.2.200 - - [26/Dec/2020:22:18:53 -0500] "GET / HTTP/1.0" 200 7 "-" "curl/7.29.0" "-"

修改proxy的配置文件

测试

两个'backend'都'获取客户端的真实ip'

'场景2': 修改proxy的配置文件-->修改'backend'的日志格式

5)二层代理

场景说明: 172.25.2.202('client') --> 172.25.2.100(proxy) --> 172.25.2.200(proxy) --> 172.25.2.201('backend')

核心两个请求头

 proxy_set_header   X-Real-IP        $remote_addr;

 获取的是'直接TCP连接'的客户端IP这个是'无法伪造'的

 proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;  --> 特点: 将上一层的'X-Forwarded-For' 进行叠加传给'proxy_add_x_forwarded_for'作为心得XFF头

 拿到用户从请求源头到应用'所经过的各个代理IP呢'

一级代理

这个理解不错

只有'客户端直接请求到'的那个'proxy nginx'能够拿到'客户端的真实IP',所以第一级'proxy nginx'配置了

proxy_set_header X-Real-IP $remote_addr;  

备注: 这个请求头在'日志中没有体现' --> '$http_x_real_ip'加入日志的格式中

原因: 'http_x_real_ip' 记录的是和自己直接相连接的'上游服务器的ip',也即自己接受的请求是从哪里'发送或转发'过来的

+++++++++++++++'分割线'+++++++++++++++

说明:下面的日志中都没有'进行改动'

说明: 实际上'X-Real-IP'这个请求头在这里'没有意义',日志中'没有体现'的到

二级代理

客户端测试

说明: 显然每级'proxy'中XFF为-->'client ip proxy1 proxy(n-1)' -->'以空格隔开'

备注:n>2 为上面的格式

说明:n=1为'-',n=2为'client ip'

说明: 'remote_addr' 从二级代理一直到第最后一级的代理,包括backend,都是'第一级'代理的IP

+++++++++++++'思考'

为什么backend的'remote_addr'不是上一级的'proxy'的IP?

备注: '后台服务器'获取真实的客户端ip地址,headers中的X-Forwarded-For选项中'逗号前第一个'ip就是真实客户端ip

比较有研究价值的博客

从限流谈到伪造 IP

获取客户端的ip

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐