最直接有效的方式是在每个server块内单独配置access_log指令指定专属日志路径;需用绝对路径、含域名便于识别,格式名须提前在http块中用log_format定义,同时确保目录存在、权限正确并配置logrotate,最后通过nginx -t和tail -f验证生效。

最直接有效的方式,是在每个 server 块内单独配置 access_log 指令,指定专属日志路径。Nginx 的局部配置天然覆盖全局设置,无需额外模块或条件判断。
每个 server 块显式声明日志路径
不要依赖 http 块里的全局 access_log,而是在每个域名对应的 server 块中明确写出:
- 使用绝对路径,例如:
access_log /var/log/nginx/www.example.com.access.log main; - 路径中建议包含域名或项目名(如
api.example.com),便于识别和后续运维 - 若某个站点不需记录访问日志,直接写:
access_log off; - 格式名(如
main)需提前在http块中用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; - 这样既保持格式一致,也方便后期统一调整
确保目录存在、权限正确,并配置轮转
多个独立日志文件意味着更多磁盘写入点,必须同步做好基础保障:
- 创建日志目录并赋权:
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 打开新日志文件
验证配置是否生效
完成配置后,务必验证日志是否真正分离:
- 运行
nginx -t确认语法无误,再执行nginx -s reload重载配置 - 用
curl -H "Host: example.com" http://127.0.0.1测试请求是否匹配对应server块 - 实时观察日志:
tail -f /var/log/nginx/www.example.com.access.log - 注意检查:路径权限、SELinux(如启用)、以及是否被其他
access_log off;覆盖


















