Nginx实现浏览器实时查询访问日志和查看访问数据

在很多时候俺们需要在页面上实时查看nginx的日志输出,查看访问量及详细访问数据,并且能在页面上显示,下面是在浏览器上实时动态的查看nginx的访问日志和访问量的方法。

首先启用nginx_status,了解nginx的状态以及监控nginx非常有帮助。

浏览器访问nginx_status

在nginx.conf文件server下的443端口下添加:

1
2
3
4
5
6
7
8
9
10
location /nginx_status {
#开启nginx_status
stub_status on;
access_log off;
#IP白名单,也就是指定IP才能访问,否则403,要想所有人可以查看,删除下面的内容就行了
allow 213.48.168.47;
allow 2801:15f0:7001:4b29:54a0:0g4ff:fe76:0hbc;
allow 127.0.0.1;
deny all;
}

重启nginx后打开主站域名后面添加/nginx_status就可以显示访问数据了,当然只有你指定的IP才能查看,例如:https://hostalk.net/nginx_status 效果看图:

访问数据详解:
active connections – 活跃的连接数量
server accepts handled requests — 总共处理了98个连接 , 成功创建98次握手, 总共处理了132个请求
reading — 读取客户端的连接数.
writing — 响应数据到客户端的数量
waiting — 开启 keep-alive 的情况下,这个值等于 active – (reading+writing), 意思就是 nginx 已经处理完正在等候下一次请求指令的驻留连接.

浏览器访问log日志

首先,查看access.log文件路径,命令:

find -name access.log

输出,文件路径在/var/log/nginx/access.log

1
2
./var/log/nginx/access.log
./root/access.log

然后在nginx.conf文件的http段,添加如下:

1
2
3
4
5
6
7
8
#日志输出格式
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 /var/log/nginx/access.log main buffer=32k flush=1m;
#错误日志和日志级别,debug | info | notice | warn | error | crit | alert | emerg级别从低到高,默认是error
error_log /var/log/nginx/error.log crit;

设置完后可以在服务器里cat查看,但是每次登陆查看太麻烦了,下面设置可以在浏览里查看。

在nginx.conf文件server下的443端口下添加:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
location /nginx_log {
#日志在浏览器以txt格式显示,删除下面这行则直接下载log文件
default_type text/plain;
#开启和美化autoindex,这个在前面博文有教程,当然不添加下面一行,也能访问,就是丑点
add_after_body /autoindex.html;
#开启autoindex
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
#log文件路径
alias /var/log/nginx/;
#IP白名单,也就是指定IP才能访问,否则403,防止别人看到数据
allow 213.48.168.47;
allow 2801:15f0:7001:4b29:54a0:0g4ff:fe76:0hbc;
allow 127.0.0.1;
deny all;
}

美化autoindex:https://hostalk.net/posts/nginx_autoindex.html
这个不美化也没关系,就是丑点。

重启nginx后打开主站域名后面添加/nginx_log就可以显示访问日志了,当然只有你指定的IP才能查看,例如:https://hostalk.net/nginx_log 效果看图:

清理日志命令

> /var/log/nginx/access.log
> /var/log/nginx/error.log

日志切割和自动删除

下面方法二选一

脚本自动切割和删除

由于长时间的运行,日志文件会日益增大,所以写了个脚本每天切割日志文件并自动删除十天前的日志文件。

新建脚本文件 vi /usr/sbin/cutlog.sh 输入下面内容:

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash
#nginx日志文件所在的目录
LOGS_PATH=/var/log/nginx/
#获取昨天的 yyyy-MM-dd
YESTERDAY=$(date -d "yesterday" +%Y-%m-%d)
#移动旧日志
mv ${LOGS_PATH}access.log ${LOGS_PATH}access_${YESTERDAY}.log
mv ${LOGS_PATH}error.log ${LOGS_PATH}error_${YESTERDAY}.log
#向nginx主进程发送USR1信号。USR1信号是重新打开日志文件
kill -USR1 $(cat /var/run/nginx.pid)
#找到10天前的日志文件进行删除
find ${LOGS_PATH} -mtime +10 -name "*.log" -exec rm -rf {} \; > /dev/null 2>&1

使用命令 crontab -e 添加下面内容,建立定时任务,每天零点执行上面脚本。

0 0 * * * /bin/bash /usr/sbin/cutlog.sh

使用logrotate管理日志文件

安装logrotate,一般Linux发行版上都默认安装有logrotate包,如果没有可使用apt安装

apt install logrotate cron

新建nginx文件

vi /etc/logrotate.d/nginx

输入以下内容

1
2
3
4
5
6
7
8
9
10
11
12
13
/var/log/nginx/*log {
create 0644 nginx nginx #以指定的权限创建全新的日志文件,同时logrotate也会重命名原始日志文件
daily #日志文件将按日轮循。其它可用值为'daily','weekly'或者'yearly'
rotate 10 #一次将存储10个归档日志。对于第11个归档,时间最久的归档将被删除
missingok #在日志轮循期间,任何错误将被忽略,例如“文件无法找到”之类的错误
notifempty #如果日志文件为空,轮循不会进行
compress #在轮循任务完成后,已轮循的归档将使用gzip进行压缩
dateext #使用当期日期作为命名格式
sharedscripts #在所有其它指令完成后,postrotate和endscript里面指定的命令将被执行
postrotate
/bin/kill -USR1 `cat /var/run/nginx.pid 2>/dev/null` 2>/dev/null || true
endscript
}

完成后检查,执行logrotate

logrotate -d /etc/logrotate.d/nginx
logrotate -f /etc/logrotate.d/nginx

修改crontab定时时间服务

vi /etc/crontab

修改下面一行,定时时间为6:25,你可改为你想要的时间

25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )

然后重启crontab服务

/etc/init.d/cron restart