LNMP 架构——Nginx 访问日志,日志切割,静态文件不记录日志和过期时间

Nginx 访问日志

修改配置文件

[root@dl-001 vhost]# vim /usr/local/nginx/conf/nginx.conf
// 搜索:/log_format
// 在nginx中以;作为一行的结尾,所以下列代码时一个配置
// 格式:“log_format 日志格式名 格式;”

log_format test '$remote_addr $http_x_forwarded_for [$time_local]'
    ' $host "$request_uri" $status'
    ' "$http_referer" "$http_user_agent"';

格式内使用的变量说明如下:

LNMP 架构——Nginx 访问日志,日志切割,静态文件不记录日志和过期时间


定义日志路径

[root@dl-001 vhost]# vim test.com.conf
# 在server块内插入
access_log /tmp/test.com.log test;

# 格式为access_log 日志存放路径 日志格式名(主配置文件内定义的)

检测并重新加载

[root@dl-001 vhost]# /usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@dl-001 vhost]# /usr/local/nginx/sbin/nginx -s reload

检测效果

[root@dl-001 vhost]# curl -x 127.0.0.1:80 test.com

[root@dl-001 vhost]# curl -x 127.0.0.1:80 test2.com/index.php

[root@dl-001 vhost]# curl -x 127.0.0.1:80 test2.com/index1.php


[root@dl-001 vhost]# cat /tmp/test.com.log 
127.0.0.1 - [03/Jan/2018:19:05:22 +0800] test.com "/" 401 "-" "curl/7.29.0"
127.0.0.1 - [03/Jan/2018:19:05:34 +0800] test2.com "/index.php" 301 "-" "curl/7.29.0"
127.0.0.1 - [03/Jan/2018:19:05:39 +0800] test2.com "/index1.php" 301 "-" "curl/7.29.0"

Nginx 日志切割

因为 Nginx 没有自带的日志切割工具,所以需要借助系统日志切割命令或者自定义脚本。

创建自定义脚本

[root@dl-001 vhost]# vim /usr/local/sbin/nginx_log_rotate.sh
[root@dl-001 vhost]# cat /usr/local/sbin/nginx_log_rotate.sh
#!/bin/bash

// date +%Y%m%d 显示的是今天的日期
// 加上 -d "-1 day" 显示的是昨天的日期
d=`date -d "-1 day" +%Y%m%d`

// 定义日志存放的路径,虚拟主机配置文件内定义
logdir="/tmp"

// pid文件
nginx_pid="/usr/local/nginx/logs/nginx.pid"

cd $logdir

// 在日志存放路径下循环更改日志文件名
for log in `ls *.log`
do
    mv $log $log-$d
done

// 在不关闭进程前提下重启,等价于nginx -s reload
/bin/kill -HUP `cat $nginx_pid`

测试脚本


[root@dl-001 vhost]# sh -x    // sh -x 可以显示脚本执行的过程    /usr/local/sbin/nginx_log_rotate.sh 
++ date -d '-1 day' +%Y%m%d
+ d=20180102
+ logdir=/tmp
+ nginx_pid=/usr/local/nginx/logs/nginx.pid
+ cd /tmp
++ ls test.com.log
+ for log in '`ls *.log`'
+ mv test.com.log test.com.log-20180102
++ cat /usr/local/nginx/logs/nginx.pid
+ /bin/kill -HUP 1299


[root@dl-001 vhost]# ls /tmp/*.log*    // 查看是否实现功能
/tmp/test.com.log  /tmp/test.com.log-20180102


配合 crontab 命令周期性执行

[root@dl-001 vhost]# crontab -e
0 0 * * * /bin/bash /usr/local/sbin/nginx_log_rotate.sh

静态文件不记录日志和过期时间

修改虚拟主机配置文件

[root@dl-001 vhost]# vim /usr/local/nginx/conf/vhost/test.com.conf 
# ~ 匹配后续的正则表示
# 使用\转义.,匹配.jpg等文件
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
	{
	    # expires设置过期时间
	    expires	7d;
	    
	    # 关闭日志记录
	    access_log off;
	}

location ~ .*\.(css|js)$
	{
	    expires	12h;
	    access_log off;
	}

测试

  • 1. 验证静态文件不记录日志
[root@dl-001 vhost]# curl -x 127.0.0.1:80 test.com/index.php
<html>
<head><title>401 Authorization Required</title></head>
<body bgcolor="white">
<center><h1>401 Authorization Required</h1></center>
<hr><center>nginx/1.12.2</center>
</body>
</html>

[root@dl-001 vhost]# curl -x 127.0.0.1:80 test.com/1.gif
jhasdifhoai

[root@dl-001  vhost]# curl -x 127.0.0.1:80 test.com/2.js
abdsuofghan

// gif/js文件日志未记录访问日志
[root@dl-001 vhost]# cat /tmp/test.com.log
127.0.0.1 - [03/Jan/2018:19:36:25 +0800] test.com "/index.php" 401 "-" "curl/7.29.0"

  • 2 验证过期时间
[root@dl-001 vhost]# curl -x 127.0.0.1:80 test.com/1.gif -I
HTTP/1.1 200 OK
Server: nginx/1.12.2
Date: Wed, 03 Jan 2018 11:36:52 GMT
Content-Type: image/gif
Content-Length: 12
Last-Modified: Wed, 03 Jan 2018 11:35:29 GMT
Connection: keep-alive
ETag: "5a4cc001-c"
Expires: Wed, 10 Jan 2018 11:36:52 GMT
Cache-Control: max-age=604800
Accept-Ranges: bytes

  • 测试 js 文件的过期时间
[root@dl-001 vhost]# curl -x 127.0.0.1:80 test.com/2.js -I
HTTP/1.1 200 OK
Server: nginx/1.12.2
Date: Wed, 03 Jan 2018 11:36:58 GMT
Content-Type: application/javascript
Content-Length: 12
Last-Modified: Wed, 03 Jan 2018 11:35:44 GMT
Connection: keep-alive
ETag: "5a4cc010-c"
Expires: Wed, 03 Jan 2018 23:36:58 GMT
Cache-Control: max-age=43200
Accept-Ranges: bytes

  • 测试 PHP 文件,没有 max-age 信息
[root@dl-001 vhost]# curl -x 127.0.0.1:80 test.com/index.php
HTTP/1.1 200 OK
Server: nginx/1.12.2
Date: Wed, 03 Jan 2018 11:46:58 GMT
Content-Type: application/octet-stream
Content-Length: 19
Last-Modified: Wed, 03 Jan 2018 11:36:44 GMT
Connection: keep-alive
ETag: "5a4e1572-13"
Accept-Ranges: bytes