四十八、Nginx访问日志、Nginx日志切割、静态文件不记录日志和过期时间
一、Nginx访问日志
日志格式
# pwd
/usr/local/nginx/conf
[root@MRX conf]# vim nginx.conf
log_format ELA '$remote_addr $http_x_forwarded_for [$time_local]'
' $host "$request_uri" $status'
' "$http_referer" "$http_user_agent"';
解析:
combined_realip:日志格式的名字,可自定义。
“;”:分号,Nginx的配置文件以分号隔开,一段配置结束,用分号隔开,换行只要没加分号就是等于是一行。
$remote addr:客户端IP(公网IP)
可以在百度搜索“IP”,就可以知道自己的公网IP。
$http_x_forwarded_for:代理服务器的IP。
$time_local:服务器本地时间。
$host:访问主机名(域名)。
$request_uri:访问的URL地址。
$status:状态码。
$http_referer:referer。
$http_user_agent:user_agent。
除了在主配置文件nginx.conf里定义日志格式外,还需要在虚拟主机配置文件中增加。
# pwd
/usr/local/nginx/conf/vhost
[root@MRX vhost]# vim test.com.conf
server
{
listen 80;
server_name test.com test2.com test3.com;
index index.html index.htm index.php;
root /data/wwwroot/test.com;
if ($host != 'test.com' ) {
rewrite ^/(.*)$ http://test.com/$1 permanent;
}
access_log /tmp/test.com.log ELA; //如果不写日志格式就会使用默认的。
此处指定访问日志的位置。
}
# /usr/local/nginx/sbin/nginx -t
# /usr/local/nginx/sbin/nginx -s reload
再curl测试,再查看这个日志,显示301的可以查看到。
二、Nginx日志切割
Nginx没有自带的日志切割工具,需要借助于系统的日志切割工具,或者自己写切割日志的脚本。
自定义shell脚本:
# vim /usr/local/sbin/nginx_logrotate.sh
//以后写的脚本放在/usr/local/sbin下
#! /bin/bash
d=`date -d "-1 day" +%Y%m%d`
logdir="/tmp" 日志的路径地址
nginx_pid="/usr/local/nginx/logs/nginx.pid" 执行pid是为了执行kill那行
cd $logdir 进入log目录
for log in `ls *.log`
do 固定语法,表示开始循环
mv $log $log-$d //重命名in后ls出来的所有文件再加上日期。
done
/bin/kill -HUP `cat $nginx_pid` 目的和nginx -s reload是一样的
# date -d "-1 day" +%Y%m%d
20180425 生成昨天的日期
[root@MRX conf]# date
2018年 04月 26日 星期四 05:06:20 CST
# ls /usr/local/nginx/logs/nginx.pid pid地址要正确,不然kill那条命令就无法执行了。
举例:# for f in `ls `; do ls -l $f;done
for:循环。for log,以log作为它的变量。
f:文件。
in:在哪个区间里循环,in `ls `在ls里循环。
# sh -x /usr/local/sbin/nginx_logrotate.sh
-x:查看它的执行过程。
++ date -d '-1 day' +%Y%m%d
+ d=20180425
+ logdir=/tmp
+ nginx_pid=/usr/local/nginx/logs/nginx.pid
+ cd /tmp
++ ls php_errors.log test.com.log
+ for log in '`ls *.log`'
+ mv php_errors.log php_errors.log-20180425
+ for log in '`ls *.log`'
+ mv test.com.log test.com.log-20180425
++ cat /usr/local/nginx/logs/nginx.pid
+ /bin/kill -HUP 1023 //如果不kill -HUP,就没法生成新的文件。
# ls /tmp
mysql.sock php_errors.log-20180425 systemd-private-71d2d82f636347309eff2c7a3230eb7f-vgauthd.service-7NpGWg test.com.log
pear php-fcgi.sock systemd-private-71d2d82f636347309eff2c7a3230eb7f-vmtoolsd.service-aM4C0h test.com.log-20180425
之后,每天会生成一个这样的带日期的日志文件。
# find /tmp/ -name *.log-* -type f -mtime +30 |xargs rm
//对30天以前的做一个清理,如果没有符合条件的就不会清理。
# crontab -e 加一个任务计划
0 0 * * * /bin/bash /usr/local/sbin/nginx_logrotate.sh
三、静态文件不记录日志和过期时间
# pwd
/usr/local/nginx/conf/vhost
[root@MRX vhost]# vim test.com.conf
server
{
listen 80;
server_name test.com test2.com test3.com;
index index.html index.htm index.php;
root /data/wwwroot/test.com;
if ($host != 'test.com' ) {
rewrite ^/(.*)$ http://test.com/$1 permanent;
}
location ~ .*\.(gif|jpeg|png|bmp|swf)$
{
expires 7d;
access_log off;
}
location ~ .*\.(js|css)$
{
expires 12h;
access_log off;
}
access_log /tmp/test.com.log ELA;
}
# /usr/local/nginx/sbin/nginx -t
# /usr/local/nginx/sbin/nginx -s reload
再访问这些静态文件时,就不会记录日志。