直接在每个server块中配置access_log指令即可实现虚拟主机独立日志:需使用绝对路径、提前定义log_format格式、确保目录权限与logrotate轮转,并通过nginx -t和-s reload验证生效。

直接在每个 server 块里写 access_log 指令,就能让不同虚拟主机拥有各自独立的日志文件。Nginx 的局部配置会自动覆盖全局设置,这是最简单也最可靠的做法。
在每个 server 块中显式声明 access_log
不要依赖 http 块里的全局日志配置,而是在每个虚拟主机的 server 块内单独定义:
- 使用绝对路径,例如:
access_log /var/log/nginx/www.example.com.access.log main; - 路径中建议包含域名或项目名,便于识别和后续管理
- 若某个站点不需要记录访问日志,可设为:
access_log off; - 格式名(如
main)需提前在http块中用log_format定义好
统一定义 log_format,按需复用
如果多个站点日志结构相似(比如都要记录真实 IP),可在 http 块顶部统一定义格式:
- 例如:
log_format upstream '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$http_x_forwarded_for";' - 然后在各
server块中引用:access_log /var/log/nginx/api.example.com.access.log upstream; - 避免重复写格式字符串,也方便后期统一调整
确保目录权限与日志轮转可用
日志能写进去,前提是 Nginx 工作进程有权限,且长期运行不撑爆磁盘:
- 创建日志目录并赋权:
sudo mkdir -p /var/log/nginx/www.example.com && sudo chown nginx:nginx /var/log/nginx/www.example.com - 用
logrotate管理切割,可为每个文件单独配规则,或用通配符统一处理(如/var/log/nginx/*.access.log) - 轮转后执行
nginx -s reopen让 Nginx 打开新文件
验证配置是否生效
改完别急着重启,按步骤确认无误再上线:
- 先测试语法:
sudo nginx -t,确保返回 “syntax is ok” - 再平滑重载:
sudo nginx -s reload - 访问对应域名后,立即执行:
tail -f /var/log/nginx/your-site.access.log查看是否有实时日志输出 - 若无内容,检查错误日志(
/var/log/nginx/error.log)是否有open() failed类报错,再排查 SELinux 或目录权限











