最稳妥做法是在每个server块中显式配置access_log指令并指定绝对路径,如access_log /var/log/nginx/www.example.com.access.log main;需提前创建目录、设置权限,复用http块定义的log_format,修改后须nginx -t验证再reload。

直接在每个 server 块里写 access_log 指令,指定绝对路径,就能让不同虚拟主机的日志完全分开——这是最稳妥、最常用的做法,不需要正则、不依赖全局配置,也不用额外模块。
每个 server 块单独配 access_log
Nginx 不会自动按域名拆分日志。如果你只在 http 块里写了全局 access_log,所有站点的访问记录都会混进同一个文件里。必须显式地在每个 server 块中声明自己的日志路径:
- 用绝对路径,例如:
access_log /var/log/nginx/www.example.com.access.log main; - 路径中建议包含域名或项目名,比如
api.example.com.access.log,方便识别和管理 - 如果某个站点不想记访问日志,直接写:
access_log off; - 不要写相对路径(如
logs/site.log),Nginx 会按配置文件所在目录解析,容易出错
复用统一定义的 log_format
自定义日志格式必须放在 http 块顶层,不能塞进 server 里,否则 reload 会失败。定义一次,多个站点可共用:
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
- 在
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 工作进程没权限写入,日志就根本不会生成,而且不会报错到 error.log 中。
- 手动创建目录:
sudo mkdir -p /var/log/nginx/www.example.com - 查清 Nginx 运行用户(常用
nginx或www-data),再赋权:sudo chown nginx:nginx /var/log/nginx/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模拟请求,立刻检查对应日志文件是否有新内容 - 注意默认 server:未匹配到任何
server_name的请求会落到第一个server块,要确保它也有明确日志配置或设为access_log off;

















