南琴浪博客

Nginx 连接日志 access.log 的配置

11/04/2017

本文讲述 Nginx 连接日志 access.log。

引子

真是不看不知道,一看吓一跳。作为一个平时基本不看 access.log ,甚至因此而常年 access_log off 的我,昨晚心血来潮,把 Nginx 重启时顺便打开了连接日志看看,结果一开机,就让我看见这幅惨状:

一脸害怕

我真是。。。丢你妹啊喵!这个 uptimerobot 你也真是忙啊,满屏都是你,还有这个 wp-login 都是我一年多前玩的了,现在还在抓?

所以为了干掉这俩,我写了这俩配置:

if ($http_user_agent ~* "UptimeRobot") {
return 444;
}

deny 101.50.127.10;
deny 105.186.250.144;

启用连接日志

经过这一出,也让我又开始重视起了连接日志 access.log 这样东西,我还是决定老老实实记录日志好了:

access_log /home/site/access-log/access.log main;

其中的 main 是我给在 Nginx 全局配置中的 log_format 起的名字,这个名字可以随便取,如果要启用这个格式就需要在站点配置中写入对应的 access_log 配置。

连接日志的格式

连接日志由变量参数组成,下表列出了常用的变量参数:

参数定义
$remote_addr客户端地址
$remote_user客户端用户名称
$time_local访问时间和时区
$http_host请求地址
$http_referer跳转来源
$http_user_agent客户端浏览器信息
$statusHTTP 请求状态
$request请求的 url 和 HTTP 协议
$request_time整个请求的总时间
$body_bytes_sent返回给客户端的数据大小

所以,我这样设置了我的日志格式:

log_format main '[$time_local] [ $remote_addr $http_user_agent] [$status $request_time $request]';

我只写了一行,用中括号分为了时间、客户端信息、请求信息三部分,简洁明了。不设置过多信息同时也是为了减少负担。

日志切分

Nginx 的日志会一直写入一个固定文件中,不会自动地进行切分。时间推移,日志会越来越大,降低效率,也难以排查。所以自动切分就很有必要了。

我写了一个简易的 Bash 脚本来完成切分的任务,在 crontab 设置了定时 6 小时进行一次切分。

logdir=/home/site/access-log
date=`date +%Y-%m-%d-%H`
pid=`cat /home/nginx/sbin/nginx.pid`

cd ${logdir}
[[ -f access.log ]] && mv access.log ${date}.log && kill -s USR1 ${pid}

通过将已有的 access.log 移动到 年-月-日-小时.log ,并随后通过 USR1 信号,命令 Nginx 产生新的 access.log 文件,以此来完成自动切分。

当然,你也可以 logrotates 这个强大的脚本工具,系统一般都会自带。查看其源码后,发现它也是利用了 USR1 信号。