NGINX访问日志和日志切割

当我们访问nginx服务时,nginx会记录日志,nginx日志分两种,一种是访问日志,一种是错误日志,访问日志记录在"access.log"文件中,错误日志记录在"error.log"文件中

编译安装了nginx,默认情况下,access.log日志会放在nginx安装路径的logs目录中

[root@myserver_2 nginx]# pwd
/nginx
[root@myserver_2 nginx]# ls
auto              conf          html      man         sbin
CHANGES           configure     LICENSE   objs        scgi_temp
CHANGES.ru        contrib       logs      proxy_temp  src
client_body_temp  fastcgi_temp  Makefile  README      uwsgi_temp
[root@myserver_2 nginx]# 

通过yum源安装的nginx,那么access.log的默认路径为/var/log/nginx/access.log

[root@myserver nginx]# pwd
/var/log/nginx
[root@myserver nginx]# ls
access.log  error.log

打开谷歌浏览器,访问nginx默认的index.html页面,在浏览器的地址栏中输入"http://192.168.1.39/index.html"进行访问,然后,打开logs/access.log,你会发现类似如下的日志:

192.168.1.11 - - [10/Jan/2021:00:23:08 +0800] "GET /index.html HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36"
  log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                 '$status $body_bytes_sent "$http_referer" '
                  '"$http_user_agent" "$http_x_forwarded_for"';

通过"log_format"指令创建了一个"日志格式",这个"日志格式"的名字是"main","main"日志格式都会记录哪些内容呢?"main"日志格式会将"remote_addr"变量和"http_user_agent"变量中的内容记录到日志中,并且使用" - "作为分隔符将两个变量的内容分隔开,同时,使用双引号""将http_user_agent变量的内容引起,nginx中有很多内置变量,"remote_addr"变量和"http_user_agent"变量就是这些内置变量中的一员,使用"$变量名"即可调用变量,这些变量通常与http协议的请求和响应有关系,所以我们可以利用这些变量做很多事情,比如,利用它们记录访问日志。聪明如你,一定想到了,日志中记录什么内容,是由我们决定的,我们在日志格式中设置了A变量、B变量、C变量,那么日志文件中就会记录A变量的值,B变量的值,以及C变量的值

$remote_addr变量:记录了客户端的IP地址(普通情况下)。
$remote_user变量:当nginx开启了用户认证功能后,此变量记录了客户端使用了哪个用户进行了认证。
$time_local变量:记录了当前日志条目的时间。
$request变量:记录了当前http请求的方法、url和http协议版本。
$status变量:记录了当前http请求的响应状态,即响应的状态码,比如200、404等响应码,都记录在此变量中。
$body_bytes_sent变量:记录了nginx响应客户端请求时,发送到客户端的字节数,不包含响应头的大小。
$http_referer变量:记录了当前请求是从哪个页面过来的,比如你点了A页面中的超链接才产生了这个请求,那么此变量中就记录了A页面的url。
$http_user_agent变量:记录了客户端的软件信息,比如,浏览器的名称和版本号

nginx会将访问日志写入到access.log日志文件中,天长日久,access.log文件就会越来越大,如果访问量巨大,并不用多长时间,access.log文件的体积就会变得非常大,对于我们的管理工作来说,这是不利的,首先,当我们打开一个非常大的日志文件时,就会比较慢,而且,从一个非常大的日志中找到某个时间段的日志也会比较慢,所以,我们最好将日志按天分割开(或者按照你觉得合适的时间段分隔开).

我们需要为nginx配置"日志分割"的功能,或者称之为"日志滚动"的功能,说到nginx的日志切割,要分如下两种情况来说:

一、通过编译的方式安装nginx后,默认没有日志分割的功能

二、通过yum源的方式安装nginx后,默认会对nginx日志进行切割

第一种方法是编写脚本实现日志切割

第二种方法是使用系统自带的日志滚动软件"logrotate"完成日志切割,但是无论选择哪种方法,其实都是殊途同归,在本质上都是一样的,那么,我们先来看看怎样通过最"原始"的方法为nginx进行日志滚动。

[root@linuxprobe logrotate.d]# ls
bootlog  dnf            nginx   sssd                  wpa_supplicant
btmp     iscsiuiolog    numad   subscription-manager  wtmp
chrony   libvirtd       psacct  syslog
cups     libvirtd.qemu  samba   up2date
[root@linuxprobe logrotate.d]# 

nginx -s"命令可以向nginx的主进程(master进程)发送信号,这些信号就是quit信号、stop信号、reload信号以及reopen信号,其实,我们借助reopen信号,就能为nginx实现日志滚动的效果

进程信号

TERM或者INT:表示立即停止nginx
QUIT:表示优雅的停止nginx
HUP:重载配置文件
USR1:重新打开日志文件
USR2:热升级nginx程序
WINCH:优雅的关闭相应的worker进程

需要用到刚才提到的reopen信号了,我们需要向nginx主进程发送一个reopen信号,以便nginx能够打开一个新的日志文件,具体命令如下:

 nginx -s reopen

除了能够使用"nginx -s"命令发送信号,我们也可以借助"kill"命令向nginx进程发送信号,你肯定经常使用kill命令,当你想要强制停掉进程的时候,会使用"kill -9 pid"向进程发送"SIGKILL"信号,除了"-9"代表的"SIGKILL"信号,我们也可以借助kill命令向进程发送一些别的信号,kill命令并不是此处讨论的重点,而是我们需要借助kill命令,向nginx主进程发送一个名为"USR1"的信号,在程序中,"USR1"信号的作用是可以自定义的,也就是说,当程序捕捉到"USR1"信号的时候进行什么操作,取决于编程时的设定,不同的程序采取的操作可能不同,而在nginx中,"USR1"信号可以帮助我们重新打开日志,换句话说就是,"nginx -s reopen"命令的作用和"kill -USR1 NginxPid"的作用是一样的,"NginxPid"指的是nginx的master进程的进程号,所以,在编写nginx日志滚动脚本时,你可以使用这两个命令中的任何一个,以便nginx可以重新打开日志文件

yum安装的系统自带的日志滚动软件"logrotate"完成日志切割配置文件中

[root@myserver logrotate.d]# cat nginx 
/var/log/nginx/*log {
    create 0664 nginx root
    daily
    rotate 10
    missingok
    notifempty
    compress
    sharedscripts
    postrotate
        /bin/kill -USR1 `cat /run/nginx.pid 2>/dev/null` 2>/dev/null || true
    endscript
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值