状态信息

确认模块安装

—with-http_stub_status_module模块就是状态信息模块
具体模块介绍参考上一节的最后内容备注
怎么查看自己安装的nginx是否支持这个功能信息模块呢?
nginx -V就可以了
image.png

状态信息的配置

[root@nginx-web01 conf]# cat nginx.conf
worker_processes 1;
error_log logs/error.log;
pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
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 logs/access.log main;
sendfile on;
tcp_nopush on;
keepalive_timeout 65;
gzip on;
include www.conf;
include ops.conf;
include status.conf;
}
[root@nginx-web01 conf]# cat status.conf
server{
listen 80;
server_name status.91test.com; #状态信息模块配置方式和搭建虚拟网站类似需要占用一个域名来访问
location / {
stub_status on; #开启状态信息功能
access_log off; #不记录访问日志
}
}
[root@nginx-web01 conf]#
重新加载配置并配置hosts

查看状态信息

image.png
[root@nginx-web01 conf]# curl status.91test.com
Active connections: 1
server accepts handled requests
13 13 13
Reading: 0 Writing: 1 Waiting: 0
[root@nginx-web01 conf]#
第一个server表示Nginx启动到现在共处理了多少个连接
第二个accepts表示Nginx启动到现在共成功创建了多少次握手
请求丢失数=(握手数-连接数),可以看出,本次状态显示没有丢失请求。
第三个handled requests,表示总共处理了多少次请求。
Reading为Nginx读取到客户端的Header信息数
Writing为Nginx返回给客户端的Header信息数
Waiting为Nginx已经处理完正在等候下一次请求指令的驻留连接。在开启keep-alive的情况下,这个值等于active - (reading+writing)
特别提示:出于安全起见,这个状态信息要防止外部用户查看。

错误日志

增加错误日志
范例:error_log file level;
常见的日志级别【debug|info|notice|warn|error|crit|alert|emerg】
debug > info > notice > warn > error > crit > alert > emerg
调试 > 信息 > 通知 > 警告 > 错误 > 临界 > 警报 > 紧急
生产场景一般是warn|error|crit这三个级别之一,注意不要配置info等较低级别,会带来巨大磁盘I/O消耗。
error_log的默认值为:
# default:
error_log logs/error.log error;
error_log $日志的相对路径 $告警级别 ;
但是平时设置的时候,没有后面的告警级别那一项,默认error日志的告警级别是从error开始

日志切割

shell脚本切割

传统的日志切割可以用脚本,分析脚本的时间或大小,进行切割,而后查找这些文件,一定时间内的执行删除

按天切割日志

cat /server/scripts/cutnginx_log.sh
#!/bin/bash
#日志切割脚本可挂定时任务,每天00点整执行
Dateformat= date +%Y%m%d #指定时间格式
Basedir=”/usr/local/nginx” #切割的日志具体路径
Nginxlogdir=”$Basedir/logs” #切割的日志相对路径
Logname=”access” #日志名称
[ -d $Nginxlogdir ] && cd $Nginxlogdir || exit 1 #判断目录是否存在
[ -f ${Logname}.log ] || exit 1 #判断日志是否存在
/bin/mv ${Logname}.log ${Dateformat}
${Logname}.log #修改日志名称
$Basedir/sbin/nginx -s reload #重新加载nginx的配置
加入定时任务
[root@localhost nginx]# cat >>/var/spool/cron/root << KOF
#cut nginx access log by Mr.xyz
00 00 * /bin/bash /server/scripts/cut_nginx_log.sh >/dev/null 2>&1 #加入定时任务,每天0时执行

定时删除某时段的日志

cat rm_nginx_logfile.sh
#!/bin/bash
#日志所在路径
LOGS_PATH=/usr/local/nginx/logs
#设置保留时间 单位(天)
SAVE_TIME=30
#执行最终的命令
#查找 修改日志在30天前的同时以log结尾的文件然后删除
#如果没有-name选项过30之后脚本会被删除掉
find ${LOGS_PATH}/ -mtime +${SAVE_TIME} -name *.log |xargs rm -rf {}
加入定时任务
[root@localhost nginx]# cat >>/var/spool/cron/root << KOF
#cut nginx access log by Mr.xyz
00 00 * /bin/bash /server/scripts/rm_nginx_logfile.sh >/dev/null 2>&1 #加入定时任务,每天0时执行

cronolog日志切割

https://blog.51cto.com/freeloda/1346076
https://blog.csdn.net/helimin12345/article/details/90732238 *
https://blog.51cto.com/liqingbiao/1714777
许多日志文件是不分割的,这样既不易于管理,也不易于分析统计。
cronolog作为日志过滤程序,可用来切割linux日志文件,通过对输入的日志按文件名模板和当前日期重新编排,来按格式生成所需日志。cronolog 旨在和一个Web服务器一起使用,如Apache、Nginx,分割访问日志为yy-mm-dd-hh格式的日志。
记录一下使用cronolog来切割nginx日志的过程。
1.安装cronolog
centos系统直接使用yum来安装cronolog和httpd。
yum install -y cronolog httpd
2.查看cronolog
使用which cronolog来查看是否已经安装好cronolog
3.配置nginx的conf文件
配置error按天输出,access按小时保存,在nginx.conf文件中将error_log和access_log进行如下配置:
error_log “pipe:/usr/sbin/cronolog $日志文件具体路径/%Y/%m/%Y-%m-%d-error.log” error;
access_log “pipe:/usr/sbin/cronolog $日志文件具体路径/%Y/%m/%Y-%m-%d-%H-access.log” main;
4.新建目录用于保存日志
/usr/sbin/cronolog /apsara/apache/logs/access_log.%Y%m%d

删除的话也要配合上面的删除脚本
时间的相关选项
H 24制小时 M 分钟 S 秒
Y 4位数年 y两位数年 d 日期

logrotated日志切割

https://www.cnblogs.com/hukey/p/12779448.html
https://www.cnblogs.com/panwenbin-logs/articles/13798745.html
https://zhuanlan.zhihu.com/p/90507023
自行轮转日志并删除
yum安装的logrotate的配置文件都是在/etc下的
image.png
cron.daily可以看出是定时任务,查看文件内容发现也是志向默认配置文件/etc/logrotate.conf的
image.png
logrotate.conf的基本配置为
image.png
这个主配置文件也就是起到一个默认配置项的作用,在这个配置文件中找到了 include /etc/logrotate.d 这个很容易理解,简单来说:/etc/logrotate.d/ 是 logrotate的扩展文件夹,需要的个性化配置在这里面。
查看 /etc/logrotate.d/
image.png
创建nginx的日志轮转的策略配置
基本配置讲解
/var/log/nginx/
log { # 需要轮询日志路径
create 0664 nginx root # 以指定的权限创建全新的日志文件
daily # 日志文件切割频率 daily: 每日,monthly: 每月,weekly: 每周,yearly: 每年
rotate 10 # 一次将存储10个归档日志,对于第11个归档,时间最久的归档将删除
missingok # 在日志轮询期间,任何错误将被忽略,例如:文件无法找到 之类的错误
notifempty # 如果文件为空,将不会对日志进行归档
compress # 在日志归档之后,对日志进行gzip压缩
delaycompress #总是与 compress 选项一起用,delaycompress 选项指示 logrotate 不要将最近的归档压缩,压缩 将在下一次轮循周期进行。这在你或任何软件仍然需要读取最新归档时很有用。
sharedscripts # 表示下面 postrotate 脚本在压缩日志之后只执行一次
postrotate # 脚本开始

/bin/kill -USR1 cat /run/nginx.pid 2>/dev/null 2>/dev/null || true # 脚本正文,重启nginx进程
endscript # 脚本结束 *
}

sharedscripts / postrotate / endscript
通常是成套出现的,而这里的脚本主要也是让程序重启,以切换到新的日志文件
还有一个比较方便的参数,这里没有用上:
dateext: 使用日期作为命名格式

cat /etc/logrotate.d/nginx
/usr/local/nginx/logs/*log {
create 0664 nginx root
daily
dateext
rotate 10
missingok
notifempty
compress
sharedscripts
postrotate
/bin/kill -USR1 cat /usr/local/nginx/logs/nginx.pid 2>/dev/null 2>/dev/null || true
endscript
}
如上配置就完成了,nginx 每天日志归档压缩的操作,是不是比自己编写 shell脚本方便很多?真的是有发现新大陆的感觉。
配置完成需要调试或者运行一次验证下,首先进行 debug 模式测试:
image.png
手动执行一次测试是否轮转日志
logrotate -f /etc/logrotate.d/nginx
image.png
可以发现 logrotate执行过程,首先将 access.log 重命名为 access.log-20200426 然后在使用 gzip 归档
这里为什么 error.log 没有做归档呢?这是因为我们在 /etc/logrotate.d/nginx 中配置了参数: notifempty # 如果文件为空,将不会对日志进行归档。

logrotate参数介绍

daily :指定转储周期为每天
weekly :指定转储周期为每周
monthly :指定转储周期为每月
rotate count :指定日志文件删除之前转储的次数,0 指没有备份,5 指保留 5 个备份
tabooext [+] list:让 logrotate 不转储指定扩展名的文件,缺省的扩展名是:.rpm-orig, .rpmsave, v, 和~
missingok:在日志轮循期间,任何错误将被忽略,例如 “文件无法找到” 之类的错误。
size size:当日志文件到达指定的大小时才转储,bytes (缺省) 及 KB (sizek) 或 MB (sizem)
compress: 通过 gzip 压缩转储以后的日志
nocompress: 不压缩
copytruncate:用于还在打开中的日志文件,把当前日志备份并截断
nocopytruncate: 备份日志文件但是不截断
create mode owner group : 转储文件,使用指定的文件模式创建新的日志文件
nocreate: 不建立新的日志文件
delaycompress: 和 compress 一起使用时,转储的日志文件到下一次转储时才压缩
nodelaycompress: 覆盖 delaycompress 选项,转储同时压缩。
errors address : 专储时的错误信息发送到指定的 Email 地址
ifempty :即使是空文件也转储,这个是 logrotate 的缺省选项。
notifempty :如果是空文件的话,不转储
mail address : 把转储的日志文件发送到指定的 E-mail 地址
nomail : 转储时不发送日志文件
olddir directory:储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统
noolddir: 转储后的日志文件和当前日志文件放在同一个目录下
prerotate/endscript: 在转储以前需要执行的命令可以放入这个对,这两个关键字必须单独成行