在 nginx 中实现主域名与子域名独立日志记录,核心是为每个 server 块显式配置绝对路径的 access_log 和 error_log 指令,统一在 http 块定义 log_format,确保 server_name 唯一、目录预先创建并赋权,且每个 server 块均不可省略日志声明,避免回退至全局日志混杂。

在 Nginx 中实现主域名(如 example.com)与子域名(如 api.example.com、blog.example.com)的独立日志记录,核心是为每个虚拟主机(server 块)单独配置 access_log 和 error_log 指令,并确保路径隔离、格式统一、权限就绪。Nginx 不会自动按域名拆分日志,必须显式声明。
每个 server 块配专属日志路径
主域名和每个子域名需各自拥有独立的 server{} 块,且块内必须明确写出日志路径:
- 主域名示例:
access_log /var/log/nginx/example.com.access.log main; - API 子域名示例:
access_log /var/log/nginx/api.example.com.access.log main; - 博客子域名示例:
access_log /var/log/nginx/blog.example.com.access.log main;
务必使用绝对路径,避免因工作目录变化导致写入失败;路径中包含完整域名,便于识别和后续管理。
统一定义 log_format,支持跨站点复用
所有日志格式应在 http{} 块顶层定义(不能放在 server 或 location 内),例如:
log_format main '$host $remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"';
这样各 server 块只需引用 main 格式名即可,既保持结构一致,又方便后期统一调整字段(比如加 $http_x_forwarded_for 解析真实 IP)。
注意 server_name 唯一性与默认匹配风险
主域名与子域名的 server_name 必须互不重叠、无歧义:
- 正确写法:
server_name example.com www.example.com;(主站) - 正确写法:
server_name api.example.com;(子域) - 避免写成
server_name *.example.com;,否则可能覆盖或误匹配
若某个 server 块未配置 access_log,其请求将回退到 http 块的全局日志,造成混杂——所以每个 server 都要显式写日志指令,不可省略。
目录创建、权限与验证三步到位
日志不会自动建目录,也不报错提示缺失,静默失效很常见:
- 手动创建并赋权:
sudo mkdir -p /var/log/nginx/{example.com,api.example.com,blog.example.com} && sudo chown nginx:nginx /var/log/nginx/* - 语法检查:
sudo nginx -t(确认 “syntax is ok”) - 平滑重载:
sudo nginx -s reload,再用curl -I http://api.example.com触发请求,立即tail -f /var/log/nginx/api.example.com.access.log查看是否实时写入











