在 Nginx 中让虚拟主机独立记录访问日志,核心是在对应 server 块内显式配置绝对路径的 access_log 指令(如 access_log /var/log/nginx/www.example.com.access.log main;),配合 http 块中预定义的 log_format,并确保目录存在、权限正确,最后通过 nginx -t 和 -s reload 验证生效。

在 Nginx 中,让某个虚拟主机(即某个 server 块)独立记录访问日志,核心就是:**在该 server 块内显式配置 access_log 指令,并使用绝对路径指向专属日志文件**。Nginx 会自动按匹配到的 server 块执行其内部的日志设置,天然隔离,无需额外判断逻辑。
每个 server 块配专属 access_log
这是最直接、最可靠的做法。只要确保该 server 块不继承全局或父级的 access_log 配置,就能完全独立。
- 在对应
server块中写明完整路径,例如:access_log /var/log/nginx/www.example.com.access.log main; - 路径必须是绝对路径(以
/开头),避免因工作目录变化导致写入失败 - 文件名建议包含域名或项目标识(如
www.example.com),便于识别和后续管理 - 如果该站点完全不需要访问日志,可写成:
access_log off;
提前定义好 log_format 并复用
日志格式无需在每个 server 块里重复写,统一在 http 块顶部定义即可,然后在各 server 中引用名称。
- 例如在
http块开头添加:log_format main '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$http_x_forwarded_for"'; - 若需区分来源域名,可定义带
$host的格式:log_format domain_log '$host $remote_addr - [$time_local] "$request" $status $body_bytes_sent'; - 然后在
server块中启用:access_log /var/log/nginx/api.example.com.access.log domain_log;
注意权限与目录准备
日志能写进去,前提是 Nginx 工作进程有写入权限,且父目录已存在。
- 手动创建日志目录并赋权(以
nginx用户为例):sudo mkdir -p /var/log/nginx/www.example.com && sudo chown nginx:nginx /var/log/nginx/www.example.com - 如果日志路径是
/var/log/nginx/www.example.com/access.log,则需确保www.example.com子目录存在且可写 - 建议配合
logrotate管理日志轮转,防止磁盘占满
验证是否真正生效
改完配置别跳过验证,否则可能静默失效。
- 先检查语法:
sudo nginx -t,确认返回syntax is ok - 再平滑重载:
sudo nginx -s reload - 立即访问该域名(如
curl -H "Host: www.example.com" http://127.0.0.1),然后执行:tail -f /var/log/nginx/www.example.com.access.log - 若无输出,检查
error_log是否报错(如权限拒绝、目录不存在等),再排查 SELinux 或 AppArmor 限制


















