在nginx中,每个server块必须显式配置access_log才能实现多站点日志隔离,需用绝对路径并提前创建目录、设置权限;支持per-server error_log,但底层错误仍记入全局日志。

在 Nginx 中,让每个 server 块写入独立的访问日志文件,是实现多站点日志隔离最直接、最稳妥的方式。它不依赖变量拼接或正则判断,配置清晰、行为确定,运维排查时也一目了然。
每个 server 块必须显式写 access_log
很多人误以为只要在 http 块里配了全局 access_log,Nginx 就会自动按域名分文件记录。事实并非如此——access_log 指令不会“智能拆分”,它只认你写死的路径。如果某个 server 块没写 access_log,它的请求就会混进全局日志里,和其他站点搅在一起。
- 写法示例:
access_log /var/log/nginx/example.com.access.log; - 路径必须用绝对路径(如
/var/log/nginx/),不能用相对路径(如logs/example.com.log),否则 Nginx 可能解析失败 - 若想关闭某站点日志,直接写
access_log off;
配合 log_format 实现结构化记录
如果你希望日志内容自带上下文(比如明确标出是哪个域名),可以在 http 块中预先定义格式,再在各 server 块中引用:
- 先在
http块顶部定义:log_format domain_log '$host $remote_addr - [$time_local] "$request" $status $body_bytes_sent'; - 然后在对应
server块中启用:access_log /var/log/nginx/api.example.com.access.log domain_log; - 这样即使多个站点共用一个日志轮转工具,也能靠
$host字段快速区分来源
目录权限和路径存在性必须提前处理
Nginx 不会自动创建日志文件的父级目录,也不会报错提示——它只是静默失败,导致日志根本不会生成。
- 手动创建目录:例如
sudo mkdir -p /var/log/nginx/example.com - 赋予 Nginx 工作用户权限(通常是
nginx或www-data):sudo chown nginx:nginx /var/log/nginx/example.com - 建议统一放在
/var/log/nginx/下,避免跨挂载点或权限边界问题
error_log 同样支持 per-server 配置
错误日志也可按站点隔离,写法类似,但作用范围略有不同:
-
error_log /var/log/nginx/example.com.error.log warn;—— 仅记录该server内发生的warn级及以上错误(如 upstream timeout、connection refused) - 底层核心错误(如 worker 进程崩溃、配置加载失败)仍会记入全局
error_log,这是设计使然,不可绕过 - 同样需确保路径存在且有写权限











