nginx多租户日志隔离需按server块分别配置access_log和error_log,推荐用$host动态命名日志文件,配合自定义log_format添加租户标识,并通过logrotate实现按租户轮转。

在 Nginx 中为多租户系统配置独立日志,核心是按 server 块(即每个租户对应的域名或路径)分别定义 access_log 和 error_log,避免日志混杂,便于后续分析与审计。
按租户域名隔离 access_log
每个租户使用独立子域名(如 tenant-a.example.com、tenant-b.example.com),在对应 server 块中指定专属日志路径:
- 用变量动态生成日志文件名(推荐):
access_log /var/log/nginx/tenant-$host-access.log main;这样请求到tenant-a.example.com就写入tenant-tenant-a.example.com-access.log - 或显式固定路径(适合租户数量少且稳定):
server_name tenant-a.example.com;<br>access_log /var/log/nginx/tenant-a-access.log main;
- 注意:确保日志目录存在且 Nginx 工作用户(如
www-data或nginx)有写权限
区分 error_log 避免排查干扰
错误日志也需隔离,否则不同租户的 500、连接超时等错误会混在一起:
- 在每个
server块内单独设置:error_log /var/log/nginx/tenant-a-error.log warn; - 级别建议设为
warn或更高(如error),减少冗余;调试阶段可临时调低 - 不建议只在全局
http块设error_log,否则会被所有 server 共享,失去隔离意义
配合 log_format 实现租户上下文增强
默认日志不含租户标识,可在自定义格式中加入 $host 或提取租户名的变量:
- 定义带租户字段的格式:
log_format tenant_combined '$host $remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" $request_time'; - 在各
server块中引用:access_log /var/log/nginx/tenant-a-access.log tenant_combined; - 进阶:用
map指令从$host提取租户 ID(如tenant-a.example.com → tenant-a),再写入日志,方便日志采集工具打标
日志轮转与权限管理要点
独立日志意味着要为每个租户单独轮转,否则单个日志可能无限增长:
- 用
logrotate配置通配符规则,例如:/var/log/nginx/tenant-*-access.log {<br> daily<br> missingok<br> rotate 30<br> compress<br> create 0644 www-data www-data<br>} - 确保轮转后新日志仍由 Nginx 用户创建(
create指令指定权限和属主) - 若租户量大(数百以上),建议结合脚本+定时任务动态生成 logrotate 配置,避免手动维护











