> 公司有一台服务器,上面放置了n个网站。大部分都做了CDN,但是随着网站和业务的增加,服务器负载越来越高。我们希望能“按域名统计出服务器访问流量情况”,从而优化业务代码。找了很多分析工具,goaccess是我觉得最好用的,生成的结果也正好是我需要的,于是我写了个shell,按域名批量生成nginx日志报表! 先贴一张分析报表效果图: ![](https://box.kancloud.cn/4f13b20f7143a1cbb07d15a42de3392b_1622x991.png) #goaccess官网:https://goaccess.io/ ## 一、 安装 不同发新版的Linux安装方式有所不同,具体怎么安装,请参考官方文档:https://goaccess.io/download ,本人使用的是CentOS。直接使用yum安装即可: `yum install goaccess` ## 二、 修改 /etc/goaccess.conf 文件 添加下面的配置(其实就是找到对应的配置,去除前面的‘#’而已,注意不同的安装方式,goaccess.conf 的存储位置可能不一样): ~~~ time-format %T date-format %d/%b/%Y log_format %h - %^ [%d:%t %^] "%r" %s %b "%R" "%u" ~~~ ## 三、修改nginx配置,在每个server末尾加上写日志的代码(根据需要添加) 所有的server include一个写日志的配置文件,这样以后开启关闭就不用修改很多文件了,当然如果你的server很少,就没有必要了 `include "conf.d/alias/access_log.conf";` access_log.conf 文件配置如下(用$host命名日志文件,自动更具域名分开存储日志,注意老版本的nginx可能不支持在日志路径上面加变量): `access_log /www/web/web2/wwwlogs/$host.log;` ## 四、 修改“goaccess.sh”,配置你nginx的日志目录和生成html的存储目录,还有。 ~~~ #分析结果访问域名(用于将生成的报表发送到钉钉群,管理人员点击即可查看) uri='http://39.107.88.67/goaccess'; #分析结果存储目录(放一个空间大点的位置) report_path="/www/web/goaccess" #nginx的日志存储目录 log_path="/www/web/web2/wwwlogs" ~~~ 注意,如果您要开启钉钉群通知功能,请在你的钉钉群里生成群机器人连接,贴入 ## 五、 定时运行批处理程序“goaccess.sh”,脚本文件在本文最后,注意加上可执行权限`chmod +x goaccess.sh` ~~~ #每天6点执行一次 0 6 * * * /etc/nginx/conf.d/goaccess.sh >> /www/log/goaccess.sh.log ~~~ ## 六、配置你的nginx,让goaccess生成的html报表可以通过你配置的“分析结果访问域名”访问(最好开启目录访问,同时加个权限验证)。我使用的配置代码如下: ~~~ location /goaccess/ { autoindex on; autoindex_exact_size off; autoindex_localtime on; alias /www/web/goaccess/; } ~~~ ## 七、完善本脚本 日志分析完成偶,最好将日志压缩一下,过期的日志可以删除掉,节省服务器磁盘空间。另外goaccess生成的HTML文件可以通过email直接发送到邮箱。 最后贴上“goaccess.sh”脚本 ~~~ #!/bin/sh #goaccess官网:https://goaccess.io/ #分析结果访问域名(用于将生成的报表发送到钉钉群,管理人员点击即可查看) uri='http://39.107.88.67/goaccess'; #分析结果存储目录 report_path="/www/web/goaccess" #nginx的日志存储目录 log_path="/www/web/web2/wwwlogs" execute() { for logfile in $(ls -d ${log_path}/*.log) do YmdHMS=$(date +'%Y-%m-%d_%H%M%S') echo " " echo " " #echo "= $(date +'%Y-%m-%d %H:%M:%S') =" echo ${YmdHMS} #日志文件全路径 #echo $logfile #日志文件名(不带路径) logfile_name=${logfile##*/} echo ${logfile_name} #日志文件名不带后缀的 host_name=${logfile_name%.*} #echo $host_name #mv 分割日志 bak_logfile=${log_path}/backup_nginx_logs/${host_name}/${YmdHMS}.log #创建切割日志存储目录 mkdir -p ${log_path}/backup_nginx_logs/${host_name} #转存 mv ${logfile} ${bak_logfile} #创建分析结果存储目录 mkdir -p ${report_path}/${host_name} report_path_html=${report_path}/${host_name}/${YmdHMS}.html echo "EXECUTE goaccess ${bak_logfile} -o ${report_path_html}" goaccess ${bak_logfile} -o ${report_path_html} #注意修改send_dingtalk内部钉钉群机器人地址,如果你需要通知钉钉群的功能,当然你也可以改吧次功能,通过其他方式通知管理人员。 send_dingtalk ${logfile_name}' 分析结果: '${uri}/${host_name}/${YmdHMS}.html done } send_dingtalk(){ json_msg="{'msgtype': 'text','text': {'content': '${1}'}}" dingtalk_uri='https://oapi.dingtalk.com/robot/send?access_token=60f41499561e6842a7450180b19fd51a01c34e9b9cb7c1f3729084003e0e8127' curl ${dingtalk_uri} \ -H 'Content-Type: application/json' \ -d "${json_msg}" } if [ ! -d "${log_path}/backup_nginx_logs/" ] then mkdir -p ${log_path}/backup_nginx_logs/ fi echo "============== begin ===============" execute echo "============== end ==============" ~~~