在 nginx 中为不同 server 块配置独立 access_log,需在各 server 块内显式声明 access_log 指令(如 access_log /var/log/nginx/example.com.access.log main),局部配置优先覆盖 http 全局设置;路径用绝对地址,配合 log_format 定义格式,注意目录权限、logrotate 轮转及 reload 验证。

在 Nginx 中,为不同虚拟主机(server 块)配置独立的 access_log 文件,只需在每个 server 块内单独定义 access_log 指令即可。Nginx 默认继承全局日志配置,但局部定义会覆盖上级设置,这是实现日志分离的核心机制。
确保每个 server 块有独立的 access_log 指令
在 http 块中不要强制统一指定 access_log(除非你希望未显式声明的 server 使用默认日志),而是在每个 server 块里明确写出日志路径和可选格式:
- 路径建议使用绝对路径(如
/var/log/nginx/example.com.access.log),避免因工作目录不确定导致写入失败 - 可配合
log_format自定义字段,例如记录真实 IP(处理了 CDN 或反向代理后) - 若不希望某个站点记录访问日志,可设为
access_log off;
合理组织 log_format 与日志路径命名
如果多个站点需要相似但略有差异的日志格式(比如都加 $http_x_forwarded_for),可先在 http 块中定义通用格式,再在各 server 中引用:
- 定义:
log_format main '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$http_x_forwarded_for"'; - 调用:
access_log /var/log/nginx/site-a.access.log main; - 文件名推荐包含域名或项目标识,便于运维识别和日志轮转管理
注意权限与日志轮转问题
Nginx 工作进程(通常是 www-data 或 nginx 用户)必须对目标日志目录有写权限:
- 创建日志目录并赋权:
sudo mkdir -p /var/log/nginx/example.com && sudo chown nginx:nginx /var/log/nginx/example.com - 使用
logrotate管理日志切割时,需为每个日志文件单独配置规则,或用通配符(如/var/log/nginx/*.access.log)统一处理 - 轮转后记得发送
USR1信号让 Nginx 重新打开新日志文件:nginx -s reopen
验证配置并重载生效
修改配置后务必检查语法并平滑重载:
- 测试配置:
sudo nginx -t - 重载服务:
sudo nginx -s reload - 访问对应站点后,执行
tail -f /var/log/nginx/your-site.access.log查看是否实时写入 - 若无内容,检查 SELinux(CentOS/RHEL)、AppArmor(Ubuntu)是否拦截写入,或查看
error_log中是否有 “open() failed” 类报错











