核心是每个server块单独声明access_log指令并使用绝对路径,如access_log /var/log/nginx/example.com.access.log;需确保server_name唯一、禁用http块全局日志、避免location干扰,并配合domain_log格式与$host标记来源,最后验证权限和配置生效。
不同域名的虚拟主机日志完全隔离,核心是让每个 server 块拥有独立、互不干扰的日志路径和记录逻辑,不依赖共享配置或覆盖行为。
这是最直接有效的做法。Nginx 不会自动合并或复用日志文件,只要你在每个 server 块里明确写出 access_log 指令,它就会只往指定路径写入该域名的访问日志。
server_name 唯一且准确(如 example.com、api.example.com)access_log /var/log/nginx/example.com.access.log;
http 或 location 块中设置全局或局部日志,否则可能被覆盖或混入Nginx 日志指令有层级优先级:location > server > http。如果没注意,容易出现日志“漏写”或“错写”。
http 块里写 access_log,除非你真需要一个兜底日志(通常不建议)location 块,确认没有 access_log off; 或另设路径——这类配置会让部分请求脱离域名主日志location 中显式定义,并接受它不进主域名日志的事实即使日志路径已分离,加上域名上下文仍有助于快速定位问题,尤其在排查跨域名调用或 CDN 回源时。
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;
$host 字段来自 HTTP 请求头,能真实反映客户端访问的域名,比 server_name 更可靠路径写对了,不代表日志一定能写进去。常见失败点集中在权限和语法上。
www-data 或 nginx)有写入权限nginx -t 检查配置语法,再 nginx -s reload 生效tail -f /var/log/nginx/example.com.access.log 确认有实时日志输出