Nginx配置访问日志,日志格式详解
时间:2026-10-7 07:41 作者:emer 分类: 无
前言
网站出问题了,想查一下谁访问过哪个页面,怎么查?Nginx 的访问日志就记录了所有请求。本文讲一下 Nginx 怎么配置访问日志,日志格式都有什么字段。
默认日志位置
Nginx 默认访问日志在:
/var/log/nginx/access.log
错误日志在:
/var/log/nginx/error.log
查看实时日志
tail -f /var/log/nginx/access.log
日志格式定义
Nginx 自带一个默认格式叫 combined:
log_format combined '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
常用日志变量
| 变量 | 说明 |
|---|---|
$remote_addr |
客户端 IP |
$time_local |
本地时间 |
$request |
请求行(方法+URL+协议) |
$status |
状态码 |
$body_bytes_sent |
发送字节数 |
$http_referer |
来源页面 |
$http_user_agent |
浏览器 UA |
自定义日志格式
想多记点信息,比如响应时间、X-Forwarded-For:
log_format myformat '$remote_addr - [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'rt=$request_time uct="$upstream_connect_time"';
access_log /var/log/nginx/access.log myformat;
单独给某个站点配日志
多站点的时候,每个站点单独记日志:
server {
listen 80;
server_name www.aaa.com;
root /var/www/aaa;
index index.html;
access_log /var/log/nginx/aaa_access.log;
error_log /var/log/nginx/aaa_error.log;
}
关闭日志
不想记日志(不推荐):
access_log off;
常见坑
坑1:用了 CDN,日志里都是 CDN IP
访问日志里记的都是 CDN 的 IP,不是真实用户的。
原因: 请求经过 CDN 转发了。
解决: 记 X-Forwarded-For:
log_format combined '$http_x_forwarded_for - $remote_user [$time_local] ...';
坑2:日志太大占磁盘
访问日志一直写,把磁盘占满了。
解决: 配 logrotate 自动切割日志。
坑3:查不到某个 IP 的访问记录
想查某个 IP 今天访问了多少次,日志里没有。
原因: 日志已经被切割轮转了。
解决: 看昨天的日志文件:
grep "IP地址" /var/log/nginx/access.log.1
坑4:日志权限不对
Nginx 写不了日志。
解决: 确保日志目录属主是 www:
chown -R www:www /var/log/nginx/
常用日志分析命令
统计访问量前10的IP:
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -10
统计 404 最多的页面:
awk '($9 == 404)' /var/log/nginx/access.log | awk '{print $7}' | sort | uniq -c | sort -nr
总结
一行配置开启日志:
access_log /var/log/nginx/access.log;
记住: 日志是排查问题的第一手资料,出事先看日志。
遇到问题加QQ23979811 协助处理
标签: Nginx 运维 排查 访问日志 log_format