Nginx日志分析
1. 访问日志
由 ngx_http_log_module 模块负责 官方文档
格式定义 log_format
规定一个日志格式 (默认配置)
log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"';
使用日志格式 (默认配置)
access_log logs/access.log main;
配置位置在 http 标签内。log_format 为日志格式的参数关键字,不能改变。
main 是为日志格式指定的标签,记录日志时通过这个main标签选择指定的格式。其后所接的所有内容都是可以记录的日志信息。注意,所有的日志段以空格分隔,一行可以记录多个列

如果nginx位于负载均衡器,.squid,nginx反向代理之后,web服务器无法直接获取到客户端真实的IP地址了。
$remote_addr 获取反向代理的IP地址。反向代理服务器在转发请求的http头信息中,可以增加X-Forwarded-For信息,用来记录客户端IP地址和客户端请求的服务器地址...
$http_x_forwarded_for 当前端有代理服务器时,设置web节点记录客户端地址的配置,此参数生效的前提是代理服务器也要进行相关的http_x_forwarded_for设置
$remote_user 记录客户端用户名称, 一般默认为空
$request 记录请求的URL和HTTP协议
$body_bytes_sent 发送给客户端的字节数,不包括响应头的大小. 该变量与Apache模块mod_log_config里的“%B”参数兼容。
$bytes_sent 发送给客户端的总字节数。
$connection_requests 当前通过一个连接获得的请求数量。
$http_referer 记录从哪个页面链接访问过来的
$http_user_agent 记录客户端浏览器相关信息
$request_length 客户端请求的长度(包括请求行,请求头和请求正文)。
$request_time 请求处理时间,单位为秒,精度毫秒; 从读入客户端的第一个字节开始,直到把最后一个字符发送给客户端后进行日志写入为止。
$time_local 记录访问时间
$http_host 请求地址,即浏览器中你输入的地址(IP或域名)
$request_body 记录POST数据
$request_length 客户端请求的长度
$upstream_status upstream状态,成功是200
$upstream_addr 后台upstream的地址,即真正提供服务的主机地址
$upstream_response_time 请求过程中,upstream响应时间
日志选项 access_log
access_log logs/access_www.log main gzip buffer=32k flush=5s;
buffer=size为存放访问日志的缓冲区大小,flush=time为将缓冲区的日志刷到磁盘的时间,gzip[=level]表示压缩级别,[if=condition]表示其他条件。一般这些参数都无须配置,极端优化时才可能会考虑这些参数。
access_log中的off,表示不记录访问日志。
access_log 可在 http server location 中
[root@smartclass-web-server nginx]# gunzip access.log-2010627.gz
[root@smartclass-web-server nginx]# awk '{print $NF}' /var/log/nginx/access.log-20190627|sort |uniq -c |sort -nr |head -3
36043 "-"
16117 "171.90.88.197"
2730 "171.90.86.182"
[root@smartclass-web-server nginx]# gzip access.log-2010627
日志分析
统计访问ip前十
awk '{print $1}' access.log|sort |uniq -c |sort -nr |head
最近5分钟访问量前十
cat /var/log/nginx/access.log| awk 'BEGIN{ "date -d \"-5 minute\" +'%H:%M:%S'" | getline min5ago } { if (substr($4, 14) > min5ago) print $0 }'|awk '{print $NF}'|sort |uniq -c |sort -nr |head

cat /var/log/nginx/access.log| awk 'BEGIN{ "date -d \"-5 minute\" +'%H:%M:%S'" |getline min5ago } { if (substr($4, 14) > min5ago) print $0 }'|awk '{print $NF}'|sort|uniq -c |sort -nr |sed -n '1p'|awk '{if($2 == "\"-\""){print 99}else print$1}'
[root@smartclass-web-server ~]# awk '{print $NF}' /var/log/nginx/access.log-20190621|sort |uniq -c |sort -nr |sed -n '1p'
34451 "-" [root@smartclass-web-server ~]# awk '{print $NF}' /var/log/nginx/access.log-20190621|sort |uniq -c |sort -nr |sed -n '1p'|awk '{if($2 == "\"-\""){print 100}else print$1}'
100 [root@smartclass-web-server ~]# awk '{print $NF}' /var/log/nginx/access.log-20190621|sort |uniq -c |sort -nr |sed -n '2p'|awk '{if($2 == "\"-\""){print 100}else print$1}'
9571
总请求数
less access.log |wc -l
访问的独立IP总数
awk '{print $1}' access.log|sort |uniq |wc -l
每秒客户端请求数前十
awk '{print $6}' access.log|sort|uniq -c|sort -rn|head
访问最频繁的URL
awk '{print $7}' access.log|sort |uniq -c |sort -nr |head
响应大于5秒的URL
awk '{if ($7 > 5){print $6}}' access.log|sort|uniq -c|sort -rn |head
HTTP状态码(非200)统计
awk '{if ($11 != 200){print $11}}' access.log|sort|uniq -c|sort -rn|head -5
分析请求数大于50000的源IP
cat access.log|awk '{print $NF}'|sort |uniq -c |sort -nr|awk '{if ($1 >50000){print $2}}'

浙公网安备 33010602011771号