服务器上最不缺的就是日志,最容易被忽略的也是日志。网站日志怎么看,很多人打开文件看到密密麻麻一行行就关掉了,其实 access.log 的每条记录都是固定格式,字段含义固定,看懂六七个位置就能办大事:谁访问的、什么时候、要了什么、拿到了什么结果。
一条 access.log 记录由哪些字段组成
nginx 默认用 combined 格式记录,一行里依次是:客户端 IP、访问时间、请求方法和路径、HTTP 协议版本、状态码、返回字节数、来源页面、浏览器标识。每一段之间用空格或引号分隔,位置是固定的。下面这段先是 nginx 配置里的格式定义,后面附一条真实样例。要改的是 log_format 里要加的字段,加完之后记得同步检查 access_log 指令有没有引用到这个格式名,否则新字段不会出现在日志里。
# nginx.conf 中的日志格式定义
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent"';
access_log /var/log/nginx/access.log main;
# 一条样例记录(各字段位置固定)
203.0.113.5 - - [13/Sep/2026:10:22:31 +0800] "GET /article/12.html HTTP/1.1" 200 5321 "https://www.example.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64)
状态码告诉你哪里出了问题
状态码是日志里信息量最大的一个字段。2xx 是正常;301 和 302 是跳转,配置了 HTTPS 或换域名后会大量出现;403 表示服务器拒绝,可能是权限问题也可能是你封了对方;404 表示请求的资源不存在;499 是 nginx 特有的,指客户端在服务端返回前主动断开,用户等不及关掉了页面;5xx 是服务端错误,500 多为程序报错,502 表示后端进程没起来或崩了,504 表示后端处理超时。看到 5xx 先确认后端服务是否存活,看到大量 4xx 先查是不是死链或者被人扫描。
# 按状态码统计当天各类响应各有多少条
awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -rn
# 单独看服务端错误,5xx 是必须马上处理的一类
grep -E ' (50[0-9]|499) ' /var/log/nginx/access.log | tail -50
按 IP、URL、UA 聚合,异常一眼可见
单看一行没感觉,把同样的字段聚起来统计,规律立刻浮现。三个最常用的聚合角度:按客户端 IP 看谁的请求量最大,单个 IP 一天上千次基本可以断定是采集或攻击;按 URL 看哪个页面被请求最多,能反映出热点内容和被反复抓取的接口;按浏览器标识看有没有异常的 UA,空 UA、明显的脚本 UA、伪造的爬虫名都值得警惕。下面这三条命令分别做完这三件事,跑完把结果和你的正常值比一比。
# 访问量前十的 IP
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head
# 最常被请求的 URL
awk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head
# 出现最多的客户端标识
awk -F'"' '{print $6}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head
日志轮转与保留策略
日志文件会一直增长,不轮转迟早把磁盘写满,而磁盘满会连累 MySQL 和 PHP 一起起不来,这是最冤的一类故障。用系统自带的 logrotate 每天切分一次,保留最近十四份并压缩,能省下大量空间。下面这份配置放到 /etc/logrotate.d/nginx 下即可,要改的是 rotate 的保留份数和 daily 的频率,流量大的站可以改成 hourly 加更小的单文件。配置里那行 kill -USR1 是让 nginx 重新打开日志文件,不加的话切分后 nginx 还在往旧文件写。
/var/log/nginx/*.log {
daily
rotate 14
compress
delaycompress
missingok
notifempty
sharedscripts
postrotate
[ -f /run/nginx.pid ] && kill -USR1 $(cat /run/nginx.pid)
endscript
}
日志不是写给搜索引擎看的,是写给你自己看的。把它当成一台行车记录仪,平时不用盯着,出事之后能原样回放。每周花十分钟扫一遍 5xx 和 Top IP,很多问题能在爆发前发现。
相关阅读:
《日志一天几十万行不知道看什么?盯住这几类记录就够》
《Linux服务器常用命令速查:运维高频操作一页搞定》
《nginx配置详解:反向代理、缓存与伪静态的常用写法》
申请创业报道,分享创业好点子。点击此处,共同探讨创业新机遇!
