发表于: 2018-05-20 22:21:04

1 1553


今日完成:

1.查看Nginx日志,编写脚本统计访问次数,统计响应延时。

1.1首先Nginx默认是不记录响应时间的,需要在nginx log 里面加上$request_time,如下

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '

                                 '$status $body_bytes_sent $request_body "$http_referer" '

                                 '"$http_user_agent" "$http_x_forwarded_for" "$request_time"';

    access_log  logs/access.log  main;

1.2编写shell脚本文件用来统计nginx日志的访问次数及状态码,创建文件名是nginx_mylog.sh,放置在目录/usr/local/nginx/下

参考博文:https://blog.csdn.net/heshan307/article/details/52357411

思路:先将access.log日志中的http状态码取出来,在我的nginx.conf配置下,access.log中一般awk ‘{print  $9}’即为http状态码,但为了确保不会出现问题,首先采用grep精确匹配到格式为:HTTP/1.0或HTTP:/1.1 状态码,并用awk去除$2即为http状态码,最后通过wc命令统计。

#!/bin/bash

reset_terminal=$(tput sgr0) 

nginx_log_path='/usr/local/nginx/logs/access1.log'

#the log of nginx after filter

nginx_log_awkpath='/usr/local/nginx/logs/mynginx.log'

#filter log only with http code

cat ${nginx_log_path} | grep -ioE "HTTP\/1\.[1|0]\"[[:blank:]][0-9]{3}"| awk '{print $2}' > ${nginx_log_awkpath}

echoFun(){

        echo -e '\E[32m' "$1" $reset_terminal $2

}

check_http_status(){

        http_code_100=$(grep -o '1[0-9][0-9]' ${nginx_log_awkpath} | wc -l)

        http_code_200=$(grep -o '2[0-9][0-9]' ${nginx_log_awkpath} | wc -l)

        http_code_300=$(grep -o '3[0-9][0-9]' ${nginx_log_awkpath} | wc -l)

        http_code_400=$(grep -o '4[0-9][0-9]' ${nginx_log_awkpath} | wc -l)

        http_code_500=$(grep -o '5[0-9][0-9]' ${nginx_log_awkpath} | wc -l)

        http_code_total=$(grep -o '[1-5][0-9][0-9]' ${nginx_log_awkpath} | wc -l)

        echoFun "http status[100+]" "${http_code_100}"

        echoFun "http status[200+]" "${http_code_200}"

        echoFun "http status[300+]" "${http_code_300}"

        echoFun "http status[400+]" "${http_code_400}"

        echoFun "http status[500+]" "${http_code_500}"

        echoFun "http status total" "${http_code_total}"

}

check_http_code(){

        http_code_403=$(grep -o '403' ${nginx_log_awkpath} | wc -l)

        http_code_404=$(grep -o '404' ${nginx_log_awkpath} | wc -l)

        echoFun "http status[403]" "${http_code_403}"

        echoFun "http status[404]" "${http_code_404}"

}

check_http_status

check_http_code

1.3 执行编写的文件:bash /usr/local/nginx/nginx_mylog.sh,查看状态码及响应次数,如下可以看到各状态码的响应次数

1.4 获取最耗时的请求时间、url、耗时,前10名, 可以修改后面的数字获取更多,不加则获取全部

cat /usr/local/nginx/logs/access.log | awk '{print $4,$7,$NF}' | awk -F '"' '{print $1,$2,$3}' | sort -k3 -rn | head -10

可以看到,获取总数据列表时耗时最多,因为需要加载全部数据:

获取http/1.1 协议耗时0.710

获取总数据耗时 0.536

模糊查询耗时 0.232

精确查询耗时 0.210

参考博文:https://www.cnblogs.com/mantianguohai/p/7238877.html

1.5 执行以下几个命令可以获取不同的数据

#获取最频繁IP数(Top20)

awk '{print $1}' /usr/local/nginx/logs/access.log | sort -n |uniq -c | sort -rn | head -n 20


#根据URL获取pv数(Page View)即页面浏览量或点击量,用户每1次对网站中的每个网页访问均被记录1个PV

awk '{print $7}' /usr/local/nginx/logs/access.log|wc -l


#根据访问IP统计UV(Unique Visitor)访问您网站的一台电脑客户端为一个访客。

awk '{print $1}'  /usr/local/nginx/logs/access.log|sort | uniq -c |wc -l

cat /usr/local/nginx/logs/access.log | awk '{print $1}' | sort -k1 -r | uniq | wc -l


#在nginx log中最后一个字段加入$request_time.列出传输时间超过 3 秒的页面,显示前20条

cat /usr/local/nginx/logs/access.log|awk '($NF > 3){print $7}'|sort -n|uniq -c|sort -nr|head -20


#获取某一时刻的请求数量,可以把秒去掉得到分钟的数据,把分钟去掉得到小时的数据,以此类推

cat /usr/local/nginx/logs/access.log | grep 2018:20:11:49 | wc -l

#获取每分钟的请求数量,输出成csv文件(/root目录下),然后用excel打开,可以生成柱状图

cat /usr/local/nginx/logs/access.log  | awk '{print substr($4,14,5)}' | uniq -c | awk '{print $2","$1}' > access.csv

1.6 将命令全部写入shell脚本里面使用bash运行,可一并输出状态码及响应次数,独立IP、UV、PV及获取最耗时的请求时间、url、耗时的前20名,得到数据如下:

2.编写deploy.sh用来部署项目

部署过程为先将ROOT文件夹清空,再将部署项目放进去,之后重启tomcat完成部署

deploy.sh脚本内容如下:

#!/bin/sh

war=$1

bin=$(cd `dirname $0`; pwd)

if [ ! -n "${war}" ]; then

    echo "***Usage: $0 [project.war]"

    exit 0

fi

if [ ! -f "${war}" ]; then

    echo "***Error: ${war} does not exist."

    exit 0

fi

if [ ! "${war##*.}" = "war" ]; then

    echo "***Error: ${war} is not a war file."

    exit 0

fi

echo "Deploy ${war##*/}..."

rm -rf ${bin}/../webapps/ROOT/ && unzip -qo ${war} -d ${bin}/../webapps/ROOT/

rm -rf ${bin}/../work/Catalina/localhost/

echo "Restart tomcat..."

exec ${bin}/restart.sh


restart.sh脚本内容如下:

#!/bin/sh

bin=$(cd `dirname $0`; pwd)

pid=$(ps aux | grep tomcat | grep -v grep | grep -v restart | grep ${bin} | awk '{print $2}') 

if [ -n "${pid}" ]; then

    echo "Shutdown..."

    sh ${bin}/shutdown.sh

    sleep 3

    pid=$(ps aux | grep tomcat | grep -v grep | grep -v restart | grep ${bin} | awk '{print $2}')

    if [ -n "${pid}" ]; then

        kill -9 ${pid}

        sleep 1

    fi

fi

echo "Startup..."

sh ${bin}/startup.sh

if [ "$1" = "-v" ]; then

    tail -f ${bin}/../logs/catalina.out

fi

直接运行会提示无权限请求,需要使用命令来授权:

chmod 755 deploy.sh/chmod 755 restart.sh

使用命令为 bash /usr/local/tomcat9/bin/deploy.sh /data/web-home/tasktwo.war进行部署项目,显示部署成功。脚本可以使用,下次直接将war包放入/data/web-home/目录下,统一部署


3.使用Top命令查看WEB服务占用内存和CPU。

3.1直接使用top命令查看全部进程的情况

top 的全屏对话模式可分为3部分:系统信息栏、命令输入栏、进程列表栏。

3.2在确认进程信息之后我们就可以使用top命令来进程跟踪了。以下top命令的参数:

-b:以批处理模式操作;
-c:显示完整的治命令;
-d:屏幕刷新间隔时间;
-I:忽略失效过程;
-s:保密模式;
-S:累积模式;
-i<时间>:设置间隔时间;
-u<用户名>:指定用户名;
-p<进程号>:指定进程;
-n<次数>:循环显示的次数。

3.3 通过ps命令获取web服务器tomcat的PID

ps -ef | grep tomcat

top -d 1 -p 15612,18650,18339,通过此命令查看tomcat的CPU和内存占用情况,刷新时间间隔为1s

由此就可以查看各个进程的CPU和内存占用情况。由于访问量太小,一直刷的话才能看到CPU有变化。


明日计划:

查看Tomcat日志,统计访问DB时间,Controller处理时间。


遇到的问题:

tomcat日志配置server.xml的日志输出响应时间,但日志输出还是按照默认输出,没有响应时间


今日收获:

使用脚本查看Nginx日志以统计访问次数和响应延时

使用脚本deploy.sh来部署tomcat项目

使用Top命令查看WEB服务占用内存和CPU



返回列表 返回列表
评论

    分享到