nginx访问日志分析

本文详细介绍如何利用Shell脚本解析Nginx日志,包括IP、状态码、流量、请求方法等关键信息的统计,以及如何根据特定状态码筛选日志记录,实现对网站访问情况的深入分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

日志格式设置:

log_format abc '$remote_addr - $remote_user [$time_local] "$request" '
               '$status $body_bytes_sent "$http_referer" '
               '"$http_user_agent" "$http_x_forwarded_for" '
               '"$upstream_addr" "$upstream_status" "$upstream_response_time" "$request_time"';

要筛选的日志内容:

115.192.201.137 - - [12/Sep/2016:00:00:01 +0800] "POST /process_upload/upload?ktvid=571012&dir=%5Cvod_score&filename=H20362_571012_02.10.00.00.1e.a6_20160911031948_Eva_20160910191932_201606271832_201412091434.score HTTP/1.1" 502 166 "-" "Apache-HttpClient/4.3.5 (java 1.5)" -

脚本:

#!/bin/bash
read -p "请输入日志文件名:" logname
echo "IP:"
awk '{ip[$1]++}END{for(i in ip){print i,ip[i]}}' $logname | sort -t ' ' -k2 -n | tail -5
echo "状态:"
awk -v FS='"' '{print $3}' $logname | awk '{state[$1]++}END{for(i in state){print i,state[i]}}' | sort -t ' ' -k2 -n | tail -5
echo "流量:"
awk -v FS='"' '{print $3}' $logname | awk '{sum += $2}END{print sum/1024/1024/1024"GB"}'
echo “请求方法”
awk -v FS='"' '{print $2}' $logname | awk '{way[$1]++}END{for(i in way){print i,way[i]}}'
echo "GET请求内容排序:"
grep "http://bigdata.changecan.com" $logname | grep GET | awk -v FS='"' '{print $4}' | awk '{context[$1]++}END{for(i in context){print i,context[i]}}'| sort -t ' ' -k2 -n | tail 

测试:

# grep fabu.changecan.com access.log | awk -v FS='"' '{print $3}' | awk '{sum += $2}END{print sum/1024/1024/1024"GB"}'

查看某状态下的时间段:

cat $logname | awk -F' ' '{if ( $9 == 502 )print $0}' | cut -d: -f1,2,3 | awk '{time[$4]++}END{for(i in time){print i,time[i]}}' | sort -t' ' -k2 -n > time.txt

统计每秒的请求数,top5的时间点(精确到秒)

awk '{print $4}' access_20180319.log |cut -c 14-21|sort|uniq -c|sort -nr|head -n 5

统计每分钟的请求数,top100的时间点(精确到分钟)

awk '{print $4}' access.log |cut -c 14-18|sort|uniq -c|sort -nr|head -n 100

统计每小时的请求数,top100的时间点(精确到小时)

awk '{print $4}' access.log |cut -c 14-15|sort|uniq -c|sort -nr|head -n 100

查看当前TCP连接数

netstat -tan | grep "ESTABLISHED" | grep ":80" | wc -l

用tcpdump嗅探80端口的访问看看谁最高

tcpdump -i eth0 -tnn dst port 80 -c 1000 | awk -F"." '{print $1"."$2"."$3"."$4}' | sort | uniq 

列出php页面请求时间超过3秒的页面,并统计其出现的次数,显示前10条

cat access.log|awk '($NF > 1 && $7~/\.php/){print $7}'|sort -n|uniq -c|sort -nr|head -10

统计网络连接数:

netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a,S[a]}'
SYN_RECV        //一个连接请求已经到达,等待确认
ESTABLISHED     //正常数据传输状态/当前并发连接数
FIN_WAIT2       //另一边已同意释放
ITMED_WAIT          //等待所有分组死掉
CLOSING         //两边同时尝试关闭
TIME_WAIT       //另一边已初始化一个释放
LAST_ACK        //等待所有分组死掉
netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"t",state[key]}'
LAST_ACK N 即为正在等待处理的请求数,查服务器的tcp 新建连接数

访问日志格式:

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

 $server_name:虚拟主机名称。
 $remote_addr:远程客户端的IP地址。
-:空白,用一个“-”占位符替代,历史原因导致还存在。
$remote_user:远程客户端用户名称,用于记录浏览者进行身份验证时提供的名字,如登录百度的用户名scq2099yt,如果没有登录就是空白。
[$time_local]:访问的时间与时区,比如18/Jul/2012:17:00:01 +0800,时间信息最后的"+0800"表示服务器所处时区位于UTC之后的8小时。
$request:请求的URI和HTTP协议,这是整个PV日志记录中最有用的信息,记录服务器收到一个什么样的请求
$status:记录请求返回的http状态码,比如成功是200。
$body_bytes_sent:发送给客户端的文件主体内容的大小,比如899,可以将日志每条记录中的这个值累加起来以粗略估计服务器吞吐量。请求页面大小,默认为B(byte)。

$http_referer:记录从哪个页面链接访问过来的。
$http_user_agent:客户端浏览器信息
$http_x_forwarded_for:客户端的真实ip,通常web服务器放在反向代理的后面,这样就不能获取到客户的IP地址了,通过$remote_add拿到的IP地址是反向代理服务器的iP地址。反向代理服务器在转发请求的http头信息中,可以增加x_forwarded_for信息,用以记录原有客户端的IP地址和原来客户端的请求的服务器地址。

查看502状态下的时间段:

cat access_20161020.log | awk -F' ' '{if ( $9 == 502 )print $0}' | awk '{time[$4]++}END{for(i in time){print i,time[i]}}' | sort -t' ' -k2 -n > test.txt

http状态码:

304 - Not Modified 客户端有缓冲的文档并发出了一个条件性的请求(一般是提供If-Modified-Since头表示客户只想比指定日期更新的文档)。服务器告诉客户,原来缓冲的文档还可以继续使用。

400 - Bad Request 请求出现语法错误。

404 - Not Found 无法找到指定位置的资源。这也是一个常用的应答。
· 404.0 -(无) – 没有找到文件或目录。
· 404.1 - 无法在所请求的端口上访问 Web 站点。
· 404.2 - Web 服务扩展锁定策略阻止本请求。
· 404.3 - MIME 映射策略阻止本请求。

500 - Internal Server Error 服务器遇到了意料不到的情况,不能完成客户的请求。
· 500.12 - 应用程序正忙于在 Web 服务器上重新启动。
· 500.13 - Web 服务器太忙。
· 500.15 - 不允许直接请求 Global.asa。
· 500.16 – UNC 授权凭据不正确。这个错误代码为 IIS 6.0 所专用。
· 500.18 – URL 授权存储不能打开。这个错误代码为 IIS 6.0 所专用。
· 500.100 - 内部 ASP 错误。

502 - Bad Gateway 服务器作为网关或者代理时,为了完成请求访问下一个服务器,但该服务器返回了非法的应答。 亦说Web 服务器用作网关或代理服务器时收到了无效响应。
· 502.1 - CGI 应用程序超时。
· 502.2 - CGI 应用程序出错。

流量单位换算:

1G=1024M   1M=1024KB 1KB=1024B 
1 Byte(字节) = 8 bits(位) 
1 Kb = 1024 bits(位) 
1 KB = 1024 Bytes(字节) 
1 Mb = 1024 Kb 
1 MB = 1024 KB 
1MB/s=8Mbps 
B 和 b 分别代表 Bytes 和 bits

参考:
来访次数/访问次数(VV)
VV = VisitView(访问次数):记录所有访客1天内访问了多少次你的网站,相同的访客有可能多次访问您的网站。从访客来到您网站到最终关闭网站的所有页面离开,计为1次访问。若访客连续30分钟没有新开和刷新页面,或者访客关闭了浏览器,则被计算为本次访问结束。
独立访客(UV)
1天内相同访客多次访问网站,只计算为1个独立访客。
浏览次数(PV)
即通常说的PV(PageView)值,用户每打开1个网站页面,记录1个PV。用户多次打开同一页面PV累计多次。用以衡量网站用户访问的网页数量。

1.根据访问IP统计UV

awk '{print $1}' access.log|sort | uniq -c |wc -l

2.统计访问URL统计PV

awk '{print $7}' access.log|wc -l

3.查询访问最频繁的URL

awk '{print $7}' access.log|sort | uniq -c |sort -n -k 1 -r|more

4.查询访问最频繁的IP

awk '{print $1}' access.log|sort | uniq -c |sort -n -k 1 -r|more

5.根据时间段统计查看日志

cat  access.log| sed -n '/14\/Mar\/2015:21/,/14\/Mar\/2015:22/p'|more

按照日期提取log

sed -n '/Nov 21 08:02/,/Nov 21 08:03/p' /var/log/messages
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值