Nginx 中为 Virtual Host 配置日志分离需在每个 server 块中独立设置 access_log 和 error_log 路径及格式,支持绝对路径、变量(如 $server_name)、自定义 log_format,并配合 open_log_file_cache 与 logrotate 实现高效轮转。

在 Nginx 中为 Virtual Host(虚拟主机)配置日志分离,核心是让每个站点拥有独立的访问日志和错误日志文件,避免混杂、便于排查与归档。这不是全局日志设置,而是针对每个 server 块单独定义日志路径和格式。
每个 server 块内独立指定 access_log 和 error_log
最直接有效的方式,是在每个虚拟主机的 server{...} 配置中,显式声明自己的日志路径和格式,覆盖全局默认值。
- 使用
access_log /path/to/site1-access.log main;指定该站点的访问日志位置和格式(main是你在http块里定义的 log_format 名) - 用
error_log /path/to/site1-error.log warn;单独设置错误日志路径和级别(如warn、error) - 路径建议使用绝对路径,例如
/var/log/nginx/example.com-access.log,避免权限或相对路径问题 - 不同站点的日志路径必须互不重叠,否则会相互覆盖
配合自定义 log_format 实现字段差异化
如果多个站点需要区分来源或添加标识,可在 http 块中定义带变量的格式,再在各 server 中调用:
- 例如定义:
log_format site1 '$host $remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "site1";' - 然后在对应
server中写:access_log /var/log/nginx/site1.log site1; - 这样每条日志末尾都带上
"site1"标签,方便 grep 或日志分析工具识别归属
日志路径支持变量,可实现按域名自动分离
Nginx 的 access_log 路径支持变量,比如 $server_name 或 $host,能动态生成日志文件名:
- 示例:
access_log /var/log/nginx/$server_name-access.log main; - 当请求命中
server_name example.com时,日志自动写入example.com-access.log - 注意:需配合
open_log_file_cache提升性能,否则高频请求下频繁打开/关闭文件影响效率 - 推荐搭配:
open_log_file_cache max=1000 inactive=1h min_uses=1 valid=1h;
配合 logrotate 实现按站切割与归档
日志分离后,自然要按站点做独立轮转。在 /etc/logrotate.d/ 下为每个站点建配置文件即可:
- 例如创建
/etc/logrotate.d/nginx-example-com - 内容包含路径
/var/log/nginx/example.com-access.log和example.com-error.log - 设置
daily、rotate 30、compress、missingok等策略 - 最后加
postrotate段执行nginx -s reload或kill -USR1 $(cat /var/run/nginx.pid)通知 Nginx 重新打开日志文件


















