shell脚本分析 nginx日志访问次数最多及最耗时的页面(慢查询)_linux shell

当服务器压力比较大,跑起来很费力时候。我们经常做站点页面优化,会去查找那些页面访问次数比较多,而且比较费时。 找到那些访问次数高,并且比较耗时的地址,就行相关优化,会取得立竿见影的效果的。 下面是我在做优化时候,经常用到的一段shell 脚本。 这个也可以算是,统计web页面的slowpage 慢访问页面,象mysql slowquery 。

以下是我的:nginx 配制

 

复制代码 代码如下:

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

    access_log  /var/log/nginx/access.log  main buffer=32k;
 

从上面配置,可以看到:ip在 第一列,页面耗时是在最后一列,中间用空格分隔。 因此在awk 中,分别可以用:$1
$NF 读取到当前值。 其中NF是常量,代表整个列数。

下面是分析代码的shell文件,可以存为slow.sh 

复制代码 代码如下:

#!/bin/sh

export PATH=/usr/bin:/bin:/usr/local/bin:/usr/X11R6/bin;
export LANG=zh_CN.GB2312;

function usage()
{
   echo "$0 filelog  options";
   exit 1;
}

function slowlog()
{
#set -x;
field=$2;
files=$1;
end=2;
msg="";

[[ $2 == '1' ]] && field=1&&end=2&&msg="总访问次数统计";
[[ $2 == '2' ]] && field=3&&end=4&&msg="平均访问时间统计";

echo -e "\r\n\r\n";
echo -n "$msg";
seq -s '#' 30 | sed -e 's/[0-9]*//g';

awk '{split($7,bbb,"?");arr[bbb[1]]=arr[bbb[1]]+$NF; arr2[bbb[1]]=arr2[bbb[1]]+1; } END{for ( i in arr ) { print i":"arr2[i]":"arr[i]":"arr[i]/arr2[i]}}' $1 | sort  -t: +$field -$end -rn |grep "pages" |head -30 | sed 's/:/\t/g'
}

[[ $# < 2 ]] && usage;

slowlog $1 $2;

只需要执行:slow.sh 日志文件  1或者2                  
1:三十条访问最平凡的页面
2:三十条访问最耗时的页面

执行结果如下:

chmod +x ./slow.sh

chmod +x slow.sh
./slow.sh /var/log/nginx/
./slow.sh /var/log/nginx/access.log 2

平均访问时间统计#############################
/pages/########1.php        4       120.456 30.114
/pages/########2.php 1       16.161  16.161
/pages/########3.php 212     1122.49 5.29475
/pages/########4.php     6       28.645  4.77417

..................

希望以上脚本对大家会有一定帮助。

时间: 2024-09-28 18:51:27

shell脚本分析 nginx日志访问次数最多及最耗时的页面(慢查询)_linux shell的相关文章

linux下Shell脚本分析Nginx日志抗小量ddos攻击

网站被ddos攻击,遂写了个脚本来抵抗一下,实现方式: 1. 攻击特征,不同ip不断POST网站首页,造成资源消耗过度 2. 分析nginx访问日志,判断POST特征取得客户端访问ip 3. 将连接数大于50的攻击ip封杀 4. 记录攻击ip到文档 5. 每次取得的攻击ip与已有攻击ip比较 查看源代码: #!/bin/bash   WEBSITES=(  example.com )   minute_now=`date +%M` max_connections=50 banips="/wwwd

linux中Shell脚本分割Nginx日志,并定期清理例子

一:新建脚本文件 vim cut_nginx_log.sh #!/bin/bash #nginx access log segmentation shell script #www.webyang.net #日志目录 log_dir="/usr/local/nginx/logs/" cd $log_dir time=`date +%Y%m%d --date="-1 day"` #nginx启动目录 nginx_dir="/etc/init.d/nginx&

Shell脚本实现硬盘空间和表空间的使用情况统计并邮件通知_linux shell

复制代码 代码如下: #/bin/bash #该脚本用于统计硬盘空间和表空间的使用情况,并邮件发出 #初始化环境变量 source /home/oracle/.bash_profile #获得本机ip ip=`/sbin/ifconfig eth0 | grep Bcast | cut -d : -f 2 | cut -d " " -f 1` #切换到本脚本目录 cd /home/oracle/shell/ #删除之前该脚本产生的日志文件 rm -rf $ip.txt #统计硬盘空间

Shell脚本分割Nginx日志,并定期清理[不重启nginx]

脚本如下 #!/bin/bash #nginx access log segmentation shell script #日志目录 log_dir="/usr/local/nginx/logs/" cd $log_dir time=`date +%Y%m%d --date="-1 day"` #日志保存天数 save_days=15 #日志文件名所处'/'分割的位置,key('/'数+1) num=6;   #此处待优化(取得文件不带后缀的文件名) website

用shell脚本切割nginx日志并压缩

一个nginx切割日志的脚本,自动删除7天前日志 #!/bin/bash LOGS_PATH=/home/wwwlogs YESTERDAY=$(date -d "yesterday" +%Y-%m-%d) #按天切割日志 mv ${LOGS_PATH}/access.log ${LOGS_PATH}/access_${YESTERDAY}.log #向 Nginx 主进程发送 USR1 信号,重新打开日志文件,否则会继续往mv后的文件写内容,导致切割失败. kill -USR1 `p

使用shell脚本分析网站日志统计PV、404、500等数据_linux shell

下面的脚本能统计出网站的总访问量,以及404,500出现的次数.统计出来后,我们可以结合监控宝来进行记录,进而可以看出网站访问量是否异常,是否存在攻击,一目了然.还可以根据查看500出现的次数,进而判断网站程序是否出现异常. 复制代码 代码如下: #!/bin/bash#purpose:count nginx or apache or other webserver status code using jiankongbao#how to:run the script every 5 minut

shell脚本监控linux系统内存使用情况的方法(不使用nagios监控linux)_linux shell

一.安装linux下面的一个邮件客户端msmtp软件(类似于一个foxmail的工具) 1.下载安装: 复制代码 代码如下: # tar jxvf msmtp-1.4.16.tar.bz2# cd msmtp-1.4.16# ./configure --prefix=/usr/local/msmtp# make# make install  2.创建msmtp配置文件和日志文件(host为邮件域名,邮件用户名test,密码123456) 复制代码 代码如下: # vim ~/.msmtprcac

shell脚本正则匹配文件中的Email并写入到文件中代码分享_linux shell

代码如下: 复制代码 代码如下: #! /bin/bashfunction read_file(){    for line in `cat $1`    do        if [ `echo $line |grep "^[a-zA-Z0-9_-]*@[A-Za-z_-]*\.[a-zA-Z_-]*$"` ];then            echo $line >> result.txt        else            echo "---&qu

Shell脚本对文件中的行、单词、字符进行迭代输出示例_linux shell

在进行文本文件进行处理时,对文件件中的行.单词.字符进行迭代和遍历是非常常用的操作.而将一个简单的循环用于迭代,再加上来自stdin或文件的重定向,这就是对文件中的行.单词.和字符进行迭代的基本方法. 废话不多说,马上来看看怎么样实现吧. 1.迭代文中的每一行 使用while循环从标准输入中读取,因为要在标准输入中读取,就要对文件进行重定向,使它重定向到stdin中,代码如下: 复制代码 代码如下: while read line;  do  echo $line;  done < file.t