实现多站点日志隔离需在每个server块中显式配置access_log和error_log绝对路径,禁用相对路径;提前创建目录并授权;定义log_format后引用;最后nginx -t验证并reload生效。

在 server 块中配置独立的访问日志和错误日志路径,是实现多站点日志隔离最直接有效的方式。关键不是“继承全局设置”,而是显式覆盖——每个 server 都要自己写 access_log 和 error_log 指令。
为每个 server 显式声明 access_log
全局 http 块里的 access_log 不会自动按域名拆分,没写的 server 就会混进全局日志里。必须在每个 server 块内单独指定:
- 用绝对路径,例如 access_log /var/log/nginx/blog.example.com.access.log;
- 相对路径(如 logs/blog.access.log)不可靠,Nginx 可能解析失败或写入错误位置
- 想关闭某站点日志,直接写 access_log off;
- 若需结构化字段(比如带域名标识),先在 http 块定义 log_format,再在 server 中引用,例如:
access_log /var/log/nginx/api.example.com.access.log domain_log;
同样方式配置 per-server 错误日志
error_log 也支持 server 级别配置,作用是只记录该虚拟主机范围内发生的错误(如 upstream timeout、502、连接拒绝等):
- 写法类似:error_log /var/log/nginx/blog.example.com.error.log warn;
- 日志级别可选 info、warn、error、crit 等,warn 是常用平衡点
- 注意:底层核心错误(如配置加载失败、worker 异常退出)仍会记入全局 error_log,server 级 error_log 不覆盖这部分
路径与权限必须提前准备
Nginx 不会自动创建日志目录,也不会报错提示缺失;静默失败 = 日志根本不会生成。
- 手动创建父级目录,例如:sudo mkdir -p /var/log/nginx/blog.example.com
- 赋予 Nginx 工作用户权限(常见为 nginx 或 www-data):sudo chown nginx:nginx /var/log/nginx/blog.example.com
- 建议统一放在 /var/log/nginx/ 下,避免跨文件系统或权限边界问题
验证配置并重载
改完后务必检查语法并重载,否则修改不生效:
- 执行 sudo nginx -t 确认配置无误
- 执行 sudo nginx -s reload 平滑重载配置
- 触发一次请求后,用 ls -l /var/log/nginx/ 和 tail -f 查看对应文件是否开始写入











