为每个 server 块单独配置 access_log 指令可实现按域名独立写日志;推荐用 map 指令做域名到日志路径的安全映射,并配 logrotate 及权限管理。

要让 Nginx 的 access_log 按不同域名(即不同 server 块)独立写入日志文件,核心是为每个 server 块单独配置 access_log 指令,而不是在全局或 http 块中统一设置。
每个 server 块单独定义 access_log
这是最直接、最可靠的方式。Nginx 会为每个虚拟主机生成独立的日志文件,互不干扰。
- 在对应域名的
server块内,显式声明access_log /path/to/example.com.log; - 路径建议使用绝对路径,避免因工作目录变化导致写入失败
- 可同时指定日志格式(需先用
log_format定义),例如:access_log /var/log/nginx/example.com.log main;
利用 $host 变量动态生成日志路径(谨慎使用)
如果域名数量多、希望自动适配,可用变量实现动态路径,但需注意权限与安全性:
- 支持的变量有限,
$host、$server_name可用,但不能用于日志文件名中的非法字符(如.、/) - 推荐先做简单过滤或映射,例如:
access_log /var/log/nginx/$host-access.log;—— 实际中需确保$host内容可信且已校验 - 生产环境不建议直接用未处理的
$host,防止恶意请求创建任意路径(如evil.com/../etc/passwd),Nginx 默认会拒绝含../的路径,但仍建议配合 map 指令做白名单控制
用 map 指令做域名到日志路径的安全映射
适合需要精细控制、又不想写大量重复 server 块的场景:
- 在
http块顶部定义map,将域名映射为日志路径:
map $host $log_path {
default "default.log";
example.com "example.com.log";
api.example.com "api.example.com.log";
blog.test "blog-test.log";
}
- 然后在各
server块中统一写:access_log /var/log/nginx/$log_path; - 这种方式既避免了重复配置,又规避了变量注入风险,推荐中大型多域名部署使用
日志轮转与权限注意事项
独立日志意味着需分别管理,别忘了配套运维措施:
- logrotate 配置要覆盖所有日志文件路径,或使用通配符(如
/var/log/nginx/*.log) - 确保 Nginx 工作用户(通常是
www-data或nginx)对目标日志目录有写权限 - 首次启动前手动创建日志目录并赋权,避免因目录不存在导致 Nginx 启动失败











