Nginx 的日志配置
lance
2020-04-23 AM
1142℃
0条
Nginx 的错误日志
Nginx 错误日志平时不用太关注,但是一旦出了问题,就需要借助错误日志来判断问题所在。
配置参数格式:error_log /path/to/log level;
Nginx 错误日志级别
常见的错误日志级别有 debug | info | notice | warn | error | crit | alert | emerg
级别越高记录的信息越少,如果不定义,默认级别为 error.
它可以配置在 main、http、server、location 段里。
如果在配置文件中定义了两个 error_log,在同一个配置段里的话会产生冲突,所以同一个段里只允许配置一个 error_log。
但是,在不同的配置段中出现是没问题的。
Nginx 错误日志示例
error_log /var/log/nginx/error.log crit;
如果要想彻底关闭 error_log,需要这样配置
error_log /dev/null;
Nginx 访问日志格式
Nginx 访问日志可以设置自定义的格式,来满足特定的需求。
访问日志格式示例
示例 1
log_format combined_realip '$remote_addr $http_x_forwarded_for [$time_local]'
'$host "$request_uri" $status'
'"$http_referer" "$http_user_agent"';
示例 2
log_format main '$remote_addr [$time_local] '
'$host "$request_uri" $status "$request"'
'"$http_referer" "$http_user_agent" "$request_time"';
若不配置 log_format 或者不在 access_log 配置中指定 log_format,则默认格式为:
'$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent";
常见变量
变量 |
说明 |
$time_local |
通用日志格式下的本地时间;(服务器时间) |
$remote_addr |
客户端(用户)IP 地址 |
$status |
请求状态码,如 200,404,301,302 等 |
$body_bytes_sent |
发送给客户端的字节数,不包括响应头的大小 |
$bytes_sent |
发送给客户端的总字节数 |
$request_length |
请求的长度(包括请求行,请求头和请求正文) |
$request_time |
请求处理时间,单位为秒,小数的形式 |
$upstream_addr |
集群轮询地址 |
$upstream_response_time |
指从 Nginx 向后端(php-cgi)建立连接开始到接受完数据然后关闭连接为止的时间 |
$remote_user |
用来记录客户端用户名称 |
$request |
请求方式(GET 或者 POST 等)+ URL(包含 $request_method ,$host ,$request_uri ) |
$http_user_agent |
用户浏览器标识 |
$http_host |
请求的 url 地址(目标 url 地址)的 host |
$host |
等同于 $http_host |
$http_referer |
来源页面,即从哪个页面转到本页,如果直接在浏览器输入网址来访问,则 referer 为空 |
$uri |
请求中的当前 URI(不带请求参数,参数位于 $args ),不同于浏览器传递的 $request_uri 的值,它可以通过内部重定向,或者使用 index 指令进行修改。 |
$document_uri |
等同于$uri |
$request_uri |
比 $uri 多了参数,即 $uri+$args |
$http_x_forwarded_for |
如果使用了代理,这个参数会记录代理服务器的 ip 和客户端的 ip |
Nginx 访问日志配置
web 服务器的访问日志是非常重要的,我们可以通过访问日志来分析用户的访问情况,
也可以通过访问日志发现一些异常访问,比如 cc 攻击。
格式: access_log /path/to/logfile format;
access_log 可以配置到 http, server, location 配置段中。
配置示例
server
{
listen 80;
server_name www.aminglinux.com;
root /data/wwwroot/www.aminglinux.com;
index index.html index.php;
access_log /data/logs/www.aminglinux.com_access.log main;
}
说明:若不指定 log_format,则按照默认的格式写日志。
Nginx 访问日志过滤
一个网站,会包含很多元素,尤其是有大量的图片、js、css 等静态元素。
这样的请求其实可以不用记录日志。
配置示例
location ~* ^.+\.(gif|jpg|png|css|js)$
{
access_log off;
}
或
location ~* ^.+\.(gif|jpg|png|css|js)$
{
access_log /dev/null;
}
Nginx 访问日志切割
如果任由访问日志写下去,日志文件会变得越来越大,甚至是写满磁盘。
所以,我们需要想办法把日志做切割,比如每天生成一个新的日志,旧的日志按规定时间删除即可。
实现日志切割可以通过写 shell 脚本或者系统的日志切割机制实现。
shell 脚本切割 Nginx 日志
切割脚本内容:
#!/bin/bash
logdir=/var/log/nginx
# 定义日志路径
prefix=`date -d "-1 day" +%y%m%d`
# 定义切割后的日志前缀
cd $logdir
for f in `ls *.log`
do
mv $f $f-$prefix
# 把日志改名
done
/bin/kill -USR1 $(cat /usr/local/nginx/logs/nginx.pid 2>/dev/null) 2>/dev/null
# 生成新的日志
bzip2 *$prefix
# 压缩日志
find . -type f -mtime +180 |xargs /bin/rm -f
# 删除超过 180 天的老日志
系统日志切割机制
在 /etc/logrotate.d/ 下创建 nginx 文件,内容为:
/data/logs/*log {
daily
rotate 30
missingok
notifempty
compress
sharedscripts
postrotate
/bin/kill -USR1 $(cat /usr/local/nginx/logs/nginx.pid 2>/dev/null) 2>/dev/null || :
endscript
}
说明:
1 nginx 日志在 /data/logs/ 目录下面,日志名字以 log 结尾
2 daily 表示每天切割
3 rotate 30 表示日志保留 30 天
4 missingok 表示忽略错误
5 notifempty 表示如果日志为空,不切割
6 compress 表示压缩
7 sharedscripts和endscript 中间可以引用系统的命令
8 postrotate 表示当切割之后要执行的命令