Nginx教程

Nginx-信号控制及命令行介绍、日志切分

本文主要是介绍Nginx-信号控制及命令行介绍、日志切分,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

1. Nginx服务的信号控制

1.1.Nginx服务的信号控制

调用命令为 kill -signal PID

signal:即为信号;PID即为获取到的master线程ID

1. 发送TERM/INT信号给master进程,会将Nginx服务立即关闭。

kill -TERM PID / kill -TERM `cat  /usr/local/nginx/logs/nginx.pid`
kill -INT PID / kill -INT `cat  /usr/local/nginx/logs/nginx.pid`

2. 发送QUIT信号给master进程,master进程会控制所有的work进程不再接收新的请求,等所有请求处理完后,在把进程都关闭掉。

kill -QUIT PID / kill -TERM `cat  /usr/local/nginx/logs/nginx.pid`

3. 发送HUP信号给master进程,master进程会把控制旧的work进程不再接收新的请求,等处理完请求后将旧的work进程关闭掉,然后根据nginx的配置文件重新启动新的work进程

kill -HUP PID / kill -TERM `cat  /usr/local/nginx/logs/nginx.pid`

4. 发送USR1信号给master进程,告诉Nginx重新开启日志文件

kill -USR1 PID / kill -TERM `cat /usr/local/nginx/logs/nginx.pid`

5. 发送USR2信号给master进程,告诉master进程要平滑升级,这个时候,会重新开启对应的master进程和work进程,整个系统中将会有两个master进程,并且新的master进程的PID会被记录在 /usr/local/nginx/logs/nginx.pid 而之前的旧的master进程PID会被记录在 /usr/local/nginx/logs/nginx.pid.oldbin 文件中,接着再次发送QUIT信号给旧的master进程,让其处理完请求后再进行关闭。

kill -USR2 PID / kill -USR2 `cat  /usr/local/nginx/logs/nginx.pid`
kill -QUIT PID / kill -QUIT `cat  /usr/local/nginx/logs/nginx.pid.oldbin`

6. 发送WINCH信号给master进程,让master进程控制不让所有的work进程在接收新的请求了,请求处理完后关闭work进程。注意master进程不会被关闭掉。

kill -WINCH PID /kill -WINCH`cat  /usr/local/nginx/logs/nginx.pid`

2. Nginx日志切分

2.1. 通过自定义脚本切割

cat /opt/nginx/cut_nginx_log.sh

#!/bin/bash
#此脚本用于自动分割Nginx的日志,包括access.log和error.log
#每天00:00执行此脚本 将前一天的access.log重命名为access-xxxx-xx-xx.log格式,并重新打开日志文件

#Nginx日志文件所在目录
LOG_PATH=/opt/nginx/logs

#获取昨天的日期
YESTERDAY=$(date -d "yesterday" +%Y-%m-%d)

#获取pid文件路径
PID=/var/run/nginx/nginx.pid

#分割日志
mv ${LOG_PATH}access.log ${LOG_PATH}access-${YESTERDAY}.log
mv ${LOG_PATH}error.log ${LOG_PATH}error-${YESTERDAY}.log

#向Nginx主进程发送USR1信号,重新打开日志文件
kill -USR1 `cat ${PID}`

添加执行权限

chmod +x /opt/nginx/cut_nginx_log.sh

设置定时任务

]# crontab -e
 # 输入以下内容并保存
00 00 * * * /bin/bash /opt/nginx/sbin/cut_nginx_log.sh

 2.2. 利用logrotate管理日志

参考文档:

https://linux.cn/article-4126-1.html

https://cloud.tencent.com/developer/article/1508110

默认centos系统安装自带logrotate

]# rpm -ql  logrotate
/etc/cron.daily/logrotate
/etc/logrotate.conf
/etc/logrotate.d
/etc/rwtab.d/logrotate
/usr/sbin/logrotate
/usr/share/doc/logrotate-3.8.6
/usr/share/doc/logrotate-3.8.6/CHANGES
/usr/share/doc/logrotate-3.8.6/COPYING
/usr/share/man/man5/logrotate.conf.5.gz
/usr/share/man/man8/logrotate.8.gz
/var/lib/logrotate
/var/lib/logrotate/logrotate.status

配置文件

# vim /etc/logrotate.d/nginx 
/var/log/nginx/*.log     #此处为nginx存储日志的地方;
 {
    daily                    #指定转储周期为每天,其它可用值为‘monthly’,‘weekly’或者‘yearly’
    rotate 30                #转储次数,超过将会删除最老的那一个
    missingok                #如果日志文件丢失,不要显示错误
    compress                 #通过gzip 压缩转储以后的日志
    delaycompress            #当前转储的日志文件到下一次转储时才压缩
    notifempty               #当日志文件为空时,不进行轮转
  create 644 nginx nginx    #以指定的权限创建全新的日志文件,同时logrotate也会重命名原始日志文件
  olddir directory  /opt/logs/nginx/logs  #这个目录必须提前创建好并授予权限
    postrotate               #执行的指令
      if [ -f /var/run/nginx/nginx.pid ]; then
          kill -USR1 `cat /var/run/nginx/nginx.pid`
      fi
endscript                   #PID路径根据实际路径填写;
}

 保存好配置文件后,测试效果

]# logrotate -vf /etc/logrotate.d/nginx 
access.log  access.log.1  error.log  error.log.1

 定时任务执行

]#crontab –e
0 0 * * * /usr/sbin/logrotate -vf /etc/logrotate.d/nginx #每天凌晨00:00自动执行日志切割任务;

logrotate详解:

logrotate 可以直接执行,后面跟配置文件就可以了,如:/usr/sbin/logrotate -f /etc/logrotate.d/nginx

参数:

-v 显示指令执行过程

-d Debug模式(模拟执行),详细显示指令执行过程,便于排错或了解程序执行的情况。

-f 强制执行

-s <状态文件>  使用指定的状态文件

logrotate 的默认配置文件是 /etc/logrotate.conf。主要参数:

daily指定转储周期为每天 

weekly指定转储周期为每周 

monthly指定转储周期为每月 

dateext在文件末尾添加当前日期 

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转储后的日志文件和当前日志文件放在同一个目录下 

rotate count指定日志文件删除之前转储的次数,0 指没有备份,5 指保留5 个备份 

tabootext [+] list让logrotate 不转储指定扩展名的文件,缺省的扩展名是:.rpm-orig, .rpmsave, v, 和 ~ 

size size当日志文件到达指定的大小时才转储,Size 可以指定 bytes (缺省)以及KB (sizek)或者MB (sizem). 

prerotate/endscript在转储以前需要执行的命令可以放入这个对,这两个关键字必须单独成行

postrotate/endscript在转储以后需要执行的命令可以放入这个对,这两个关键字必须单独成行

 

 

日志格式参数说明

$remote_addr, $http_x_forwarded_for(反向) 记录客户端IP地址
$remote_user 记录客户端用户名称
$request 记录请求的URL和HTTP协议
$status 记录请求状态
$body_bytes_sent 发送给客户端的字节数,不包括响应头的大小; 该变量与Apache模块mod_log_config里的“%B”参数兼容。
$bytes_sent 发送给客户端的总字节数。
$connection 连接的序列号。
$connection_requests 当前通过一个连接获得的请求数量。
$msec 日志写入时间。单位为秒,精度是毫秒。
$pipe 如果请求是通过HTTP流水线(pipelined)发送,pipe值为“p”,否则为“.”。
$http_referer 记录从哪个页面链接访问过来的
$http_user_agent 记录客户端浏览器相关信息
$request_length 请求的长度(包括请求行,请求头和请求正文)。
$request_time 请求处理时间,单位为秒,精度毫秒; 从读入客户端的第一个字节开始,直到把最后一个字符发送给客户端后进行日志写入为止。
$time_iso8601 ISO8601标准格式下的本地时间。
$time_local 通用日志格式下的本地时间。

 

 

 

 

 

 

 

3. Nginx的命令行控制

此方式是通过Nginx安装目录下的sbin下的可执行文件nginx来进行Nginx状态的控制,我们可以通过 nginx -h 来查看都有哪些参数可以用:

-?和-h:显示帮助信息

-v:打印版本号信息并退出

-V:打印版本号信息和配置信息并退出

-t:测试nginx的配置文件语法是否正确并退出

-T:测试nginx的配置文件语法是否正确并列出用到的配置文件信息然后退出

-q:在配置测试期间禁止显示非错误消息

-s:signal信号,后面可以跟 :

stop[快速关闭,类似于TERM/INT信号的作用]

quit[优雅的关闭,类似于QUIT信号的作用]

reopen[重新打开日志文件类似于USR1信号的作用]

reload[类似于HUP信号的作用]

-p:prefix,指定Nginx的prefix路径,(默认为: /usr/local/nginx/)

-c:filename,指定Nginx的配置文件路径,(默认为: conf/nginx.conf)

-g:用来补充Nginx配置文件,向Nginx服务指定启动时应用全局的配置

 






 

这篇关于Nginx-信号控制及命令行介绍、日志切分的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!