为实现多域名日志隔离,应在每个server块中单独配置绝对路径的access_log指令,并配合http块中定义含$host的log_format;location级可覆盖但需谨慎;配置后须语法检查、重载并验证权限与写入。

直接在每个 server 块里单独写 access_log 指令,就能让不同域名或虚拟主机的日志互不混杂、各自独立存储。
每个 server 块配专属 access_log
这是最清晰、最稳妥的做法。Nginx 会严格按所在 server 块的配置记录日志,不会跨块干扰。
- 确保每个
server_name唯一(如example.com、api.example.com、admin.example.org) - 在对应
server块内明确指定路径:access_log /var/log/nginx/example.com.access.log; - 务必使用绝对路径(比如
/var/log/nginx/...),避免因工作目录变化导致日志写入失败 - 不需要额外模块或复杂判断,Nginx 原生支持
配合 log_format 增强可读性
如果后续要用统一工具轮转或分析所有日志,建议在 http 块中定义带 $host 的格式,让每条日志自带域名上下文。
- 在
http块顶部添加:log_format domain_log '$host $remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent'; - 各
server块中启用:access_log /var/log/nginx/example.com.access.log domain_log; - 这样即使路径不同,日志内容本身已标明来源域名,排查时一眼可知归属
注意 location 级别的覆盖行为
access_log 可出现在 http、server、location 三个层级,低层级会覆盖高层级设置。
- 若某个
location写了access_log off;,该路径下请求将完全不记日志 - 若写了
access_log /var/log/nginx/api.log;,这部分请求只写入该文件,不进主域名日志 - 日常配置建议只在
server级设置,除非有特殊需求(如仅记录接口调用)
验证与权限检查
配置完成后别跳过这步,否则日志可能静默失效。
- 执行
nginx -t检查语法是否正确 - 运行
nginx -s reload生效新配置 - 确认日志目录存在且 Nginx 工作进程(通常是
www-data或nginx用户)有写入权限:sudo chown -R www-data:www-data /var/log/nginx/ - 访问对应域名后,检查目标日志文件是否有新增条目











