nginx 可通过 server 块配合 access_log 指令按 server_name 实现域名级日志分流;支持静态路径、$host 动态路径及 map 安全映射,需注意目录创建、权限、默认 server 处理和配置重载验证。

在 Nginx 中,可以通过 server 块配合 access_log 指令,为不同主机名(域名)单独记录访问日志,实现日志分流。
按 server_name 区分日志文件
每个 server 块可独立配置 access_log,Nginx 会根据请求匹配的 server_name 决定写入哪个日志文件。
- 确保每个站点有独立的
server块,并明确指定server_name - 在对应块内设置
access_log /var/log/nginx/site-a.log;等路径 - 避免多个
server块共用同一日志路径,否则日志会混写
使用变量动态生成日志路径
若站点数量多或域名不固定,可用内置变量 $host 或 $server_name 动态命名日志文件:
access_log /var/log/nginx/$host-access.log;- 注意:路径中含变量时,Nginx 不会自动创建父目录,需提前手动创建
/var/log/nginx/下对应子目录或确保权限允许写入 - 推荐加个前缀如
logs-$host.log,避免直接用用户输入的$host引发路径遍历风险(Nginx 默认已做基础过滤,但谨慎起见可配合 map 过滤)
配合 map 模块做安全映射
更稳妥的方式是用 map 将域名映射为可控的标识符,再用于日志路径:
- 在
http块顶部定义:
map $host $log_name { - 然后在
server块中写:access_log /var/log/nginx/$log_name-access.log; - 这样既支持分流,又规避了非法域名导致的日志路径异常
default "unknown";
example.com "example";
api.example.com "api";
}
验证与常见问题
配置后需重载生效,并检查日志是否按预期分离:
- 执行
nginx -t确认语法正确,再nginx -s reload - 用
curl -H "Host: example.com" http://127.0.0.1测试匹配行为 - 若日志未生成,检查文件路径权限、SELinux(如启用)、以及是否被其他
access_log off;覆盖 - 注意:未匹配到任何
server块的请求会落入默认 server(通常是第一个),要确保默认块也有明确日志配置或设为access_log off;











