最稳妥做法是在每个server块中用绝对路径显式配置access_log,确保目录存在且Nginx有写权限;未配置的server将日志混入全局文件,无法区分来源。

直接在对应 server 块里写 access_log 指令,路径用绝对路径,确保目录存在且 Nginx 有写权限——这是最稳妥、最常用的做法。
每个 server 块必须显式配置 access_log
Nginx 不会自动按 server_name 拆分日志。即使 http 块里写了全局 access_log,只要某个 server 块没单独写 access_log,它的请求就会混进那个全局日志里,无法区分来源。
- 不写 access_log 的 server:日志全进全局文件,和其他站点搅在一起
- 写了 access_log 的 server:只往你指定的路径写,完全隔离
- 想关闭某域名日志?直接写
access_log off;
路径必须是绝对路径,且目录要提前创建好
Nginx 启动或重载时,不会自动创建日志父目录,也不会报错提示;它只是静默跳过写日志这一步,结果就是“看似配置了,实际没日志”。
- 正确写法:
access_log /var/log/nginx/example.com.access.log; - 错误写法:
access_log logs/example.com.log;(相对路径,易解析失败) - 手动创建目录:
sudo mkdir -p /var/log/nginx/example.com - 赋权(以 nginx 用户为例):
sudo chown nginx:nginx /var/log/nginx/example.com
配合 log_format 添加域名上下文更清晰
如果多个站点日志路径不同但格式一样,排查时靠文件名就能区分;但如果想进一步防混淆(比如日志轮转后文件名统一),可在日志内容里嵌入 host 信息。
- 先在 http 块顶部定义:
log_format domain_log '$host $remote_addr - [$time_local] "$request" $status $body_bytes_sent'; - 再在对应 server 块中启用:
access_log /var/log/nginx/example.com.access.log domain_log; - 这样每条日志开头都带域名,即使文件被重命名或合并查看也不容易搞错来源
别忘了验证和重载
改完配置不能直接重启,得先检查语法,再平滑重载:
- 验证配置:
sudo nginx -t(返回 success 才继续) - 重载生效:
sudo nginx -s reload - 确认日志生成:
ls -l /var/log/nginx/example.com.access.log并触发一次访问测试


















