一、为什么 Nginx 日志很重要¶
原笔记把 Nginx 日志分成了两类:
| 日志类型 | 主要用途 |
|---|---|
| 错误日志 | 出现 4xx、5xx 或配置故障时排查问题 |
| 访问日志 | 记录访问时间、页面、客户端信息,用于统计和分析 |
这两类日志分别回答的是两个问题:
- 网站为什么报错
- 网站到底被谁访问了、访问了什么
二、错误日志怎么配置¶
原笔记先介绍了 error_log 指令的格式:
error_log 文件名 错误日志级别;
它可以出现在:
mainhttpmailstreamserverlocation
原笔记还列出了常见日志级别,从更详细到更粗略大致包括:
debug, info, notice, warn, error, crit, alert, emerg
其中 debug 更适合短时间调试使用,访问量较大的网站不建议长期开启。
2.1 给单个虚拟主机单独指定错误日志¶
原笔记的案例思路是:
1、先注释主配置中的统一错误日志
#error_log /var/log/nginx/error.log notice;
2、再在具体站点配置中单独指定:
server {
listen 80;
server_name cxk.oldboylinux.cn;
error_log /var/log/nginx/cxk.oldboylinux.cn-error.log notice;
root /app/code/cxk;
location / {
index index.html;
}
}
3、检查语法并重载:
nginx -t
systemctl reload nginx
这样做的好处是:不同站点的错误信息不会混在一起,排查问题更直接。
三、访问日志的核心由哪两部分组成¶
原笔记强调,访问日志通常要同时理解两个指令:
log_format:定义日志长什么样access_log:指定日志写到哪里,并使用哪个格式
3.1 log_format 里常见变量有哪些¶
原笔记列出了一些最常用的内置变量:
| 变量 | 含义 |
|---|---|
$remote_addr |
客户端 IP |
$remote_user |
用户名 |
$time_local |
访问时间 |
$request |
请求起始行 |
$status |
HTTP 状态码 |
$body_bytes_sent |
响应体大小 |
$http_referer |
从哪里跳转而来 |
$http_user_agent |
客户端代理 |
$http_x_forwarded_for |
负载场景下记录真实客户端 IP |
原笔记中的默认格式示例是:
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
这也是很多入门场景里最常见的访问日志格式。
3.2 access_log 怎么使用¶
原笔记给出的基础格式是:
access_log 日志位置 格式;
它可以放在:
httpserverlocationif in locationlimit_except
四、如何为每个虚拟主机单独配置访问日志¶
原笔记的案例与错误日志类似,也是先把主配置中的统一访问日志注释掉:
#access_log /var/log/nginx/access.log main;
然后在站点配置中指定独立访问日志:
server {
listen 80;
server_name cxk.oldboylinux.cn;
error_log /var/log/nginx/cxk.oldboylinux.cn-error.log notice;
access_log /var/log/nginx/cxk.oldboylinux.cn-access.log main;
root /app/code/cxk;
location / {
index index.html;
}
}
之后同样执行:
nginx -t
systemctl reload nginx
然后访问网站并查看日志:
curl -H Host:cxk.oldboylinux.cn http://192.168.1.20/index.html
tail -f /var/log/nginx/cxk.oldboylinux.cn-access.log
这样就能确认这个站点的访问是否已经单独写入指定文件。
五、访问日志还有哪些进阶选项¶
原笔记还补充了几个 access_log 的可选项:
gzip:压缩访问日志buffer=32k:先写入内存缓冲区,再批量落盘flush=10s:设置刷新时间
示例如下:
access_log /var/log/nginx/cxk.oldboylinux.cn-access.log main gzip buffer=32k flush=10s;
这些选项更偏向性能和写入控制,实际生产中会根据访问量和日志策略来选择。
六、小结¶
Nginx 日志配置的核心可以概括成三件事:
- 用
error_log记录和定位故障 - 用
log_format定义访问日志格式 - 用
access_log决定日志写到哪里
当站点变多时,把日志按虚拟主机拆开,往往比所有内容都写进同一个文件更利于排错和分析。