织梦 网站搬家,上海计算机一级网页制作,手机端淘宝店铺怎么装修,三亚门户网站Nginx是一个高性能的HTTP和反向代理服务器#xff0c;也是一个IMAP/POP3/SMTP代理服务器。无论是在大流量的网站还是小型的个人博客中#xff0c;Nginx都得到了广泛应用。在实际生产环境中#xff0c;对Nginx日志的分析有助于我们了解网站的访问情况#xff0c;发现潜在问题… Nginx是一个高性能的HTTP和反向代理服务器也是一个IMAP/POP3/SMTP代理服务器。无论是在大流量的网站还是小型的个人博客中Nginx都得到了广泛应用。在实际生产环境中对Nginx日志的分析有助于我们了解网站的访问情况发现潜在问题并进行优化。本文将通过编写Shell脚本实现对Nginx日志的全面统计分析。 Nginx日志格式
首先我们需要确保Nginx日志格式与以下格式类似
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。
Shell脚本实现
接下来我们编写一个Shell脚本对Nginx日志进行统计分析。这个脚本包括以下功能 统计各种状态码的数量 统计访问最多的Referer 统计访问最高的URI 统计访问最多的IP和User-Agent 统计每分钟的请求数、流量、请求时间、状态码等
脚本代码实现
统计各种状态码的数量
awk
{Arry[$12] 1; total;
}
END {for (s in Arry) {printf %d\t%.4f\t%s\n, Arry[s], Arry[s] / total, s}
}$LOG_FILE | sort -nr -k 1,1 Arry[$9] 1;: $12 是日志文件的第十二个字段通常表示 HTTP 状态码。 Arry 是一个关联数组以 HTTP 状态码为键将每个状态码出现的次数累加到数组 Arry 中。 Arry[$9] 1; 表示状态码 $9 出现的次数加 1。 total;: 记录总的日志行数。 for (s in Arry): 遍历数组 Arry 中的每个状态码 s。 printf %d\t%.4f\t%s\n, Arry[s], Arry[s] / total, s: 打印每个状态码的出现次数、占比和状态码本身。 Arry[s] 是状态码 s 出现的次数。 Arry[s] / total 是该状态码出现的比例占总请求数的百分比。 s 是状态码。 输出格式为出现次数\t 比例\t 状态码。 运行上述的命令输出如下结果 统计访问最多的Referer awk -F\ {Arry[$4] 1; # 将每个引用的字段$4出现的次数累加到数组Arry中total; # 记录总的日志行数}END {for (s in Arry) { # 遍历数组Arry中的每个引用字段printf %d\t%.4f\t%s\n, Arry[s], Arry[s] / total, s # 打印每个引用字段的出现次数、占比和引用字段本身}} $LOG_FILE | sort -nr -k 1,1 # 按出现次数降序排序执行上述命令后输出如下图的结果 统计访问最高的URI awk {Arry[$9] 1; # 将每个引用的字段$18出现的次数累加到数组Arry中total; # 记录总的日志行数}END {for (s in Arry) { # 遍历数组Arry中的每个引用字段printf %d\t%.4f\t%s\n, Arry[s], Arry[s] / total, s # 打印每个引用字段的出现次数、占比和引用字段本身}} $LOG_FILE | sort -nr -k 1 # 按出现次数降序排序 执行上述命令后输出如下图的结果 统计访问最多的IP和User-Agent
统计最多IP访问次数 awk {Arry[$1] 1; # 将每个IP地址出现的次数累加到数组Arry中total; # 记录总的日志行数}END {for (s in Arry) { # 遍历数组Arry中的每个IP地址printf %d\t%.4f\t%s\n, Arry[s], Arry[s] / total, s # 打印每个IP地址的出现次数、占比和IP地址本身}} $LOG_FILE | sort -nr -k 1,1执行上述命令后输出如下图的结果 统计最多访问的User-Agent
awk {Arry[$18] 1; # 将每个引用的字段$18出现的次数累加到数组Arry中total; # 记录总的日志行数}END {for (s in Arry) { # 遍历数组Arry中的每个引用字段printf %d\t%.4f\t%s\n, Arry[s], Arry[s] / total, s # 打印每个引用字段的出现次数、占比和引用字段本身}} $LOG_FILE | sort -nr -k 1 # 按出现次数降序排序执行上述命令后输出如下图的结果 统计每分钟的请求数、流量、请求时间、状态码等
awk -F | BEGIN {printf 时间\t数量\t流量[MB]\t请求时间\t20x\t30x\t40x\t50x\t60x\n}{# 提取时间的分钟部分minute substr($2, 12, 5)# 累计流量、请求数和请求时间tms[minute] $13cnt[minute] 1reqt[minute] $15# 统计状态码status_code $9if (status_code ~ /^2/) { sc20x[minute] }else if (status_code ~ /^3/) { sc30x[minute] }else if (status_code ~ /^4/) { sc40x[minute] }else if (status_code ~ /^5/) { sc50x[minute] }else { sc60x[minute] }}END {for (t in tms) {printf %s\t%d\t%.4f\t%.4f\t%d\t%d\t%d\t%d\t%d\n,t,cnt[t],tms[t] / 1024 / 1024,(cnt[t] 0 ? reqt[t] / cnt[t] : 0),sc20x[t],sc30x[t],sc40x[t],sc50x[t],sc60x[t]}} $LOG_FILE
执行上述命令后输出如下结果 总结
通过上述Shell脚本我们可以快速、全面地分析Nginx日志了解网站的访问情况和性能表现。这不仅有助于我们发现潜在问题还能为后续的优化工作提供有力的数据支持。在实际应用中你可以根据自己的需求进一步扩展和定制这个脚本。
脚本获取方式 上述脚本已经上传上传到gitee,有需要的小伙伴可以自行获取。gitee上的仓库主要是分享一些工作中常用的脚本。小伙伴可以frok或者watch仓库这样有更新可以及时关注到。 仓库地址
https://gitee.com/didiplus/script推荐阅读 不再担心数据丢失用rsync打造你的自动化备份解决方案IP地址乱成一团用Shell一键搞定实用技巧用lsof命令监控tar文件解压进度简单有效运维必备批量实现Linux机器SSH免密登录的自动化脚本运维小妙招如何让系统信息随登录自动展现