在 Nginx 虚拟主机中通过 server 块内配置 access_log 和 error_log 指令可实现日志独立,需指定绝对路径、设置权限、定义格式并 reload 重载;常见问题包括位置错误、权限不足和路径不规范。

在 Nginx 的虚拟主机(server 块)中配置独立的访问日志和错误日志,核心是用 access_log 和 error_log 指令覆盖全局设置,无需修改 http 块。每个站点的日志路径、格式、级别可完全隔离,便于运维排查。
为每个虚拟主机指定专属错误日志路径
错误日志默认继承自全局配置,但在 server 块内添加 error_log 即可单独指定:
- 语法:
error_log /var/log/nginx/example.com_error.log error; - 路径必须真实存在,且 Nginx 工作进程用户(如
nginx或www-data)对该目录有写权限 - 推荐日志级别设为
error或warn;调试时可临时设为info(需编译支持) - 同一
server块中可写多个error_log,错误消息会同时写入所有目标文件
为每个虚拟主机配置独立访问日志及格式
访问日志同样支持按站点定制,还可搭配自定义格式提升可读性:
- 先在
http块中定义日志格式(如已存在可复用):log_format custom '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"'; - 再在
server块中启用:access_log /var/log/nginx/example.com_access.log custom; - 不指定格式名则使用默认
main;写access_log off;可显式关闭该站点日志(不建议生产环境关闭) - 支持高级参数,如缓存与压缩:
access_log /var/log/nginx/example.com_access.log custom buffer=32k gzip flush=1m;
确保日志能正常生成的关键操作
配置完成后不能直接重启服务,必须走安全流程:
- 执行
nginx -t校验语法,避免配置错误导致服务中断 - 手动创建日志目录并赋权,例如:
sudo mkdir -p /var/log/nginx && sudo chown nginx:nginx /var/log/nginx - 用
sudo nginx -s reload平滑重载,不中断已有连接 - 触发一次请求(如
curl -I http://example.com/nonexistent),检查对应日志文件是否生成、内容是否更新
常见问题提醒
几个容易忽略但影响生效的点:
-
access_log和error_log必须写在server块内部,写在location中只对匹配路径生效 - 路径若含相对路径(如
logs/access.log),实际位置以 Nginx 启动时的工作目录为准,建议统一用绝对路径 - 如果日志文件长期为空,优先检查目录权限、磁盘空间、以及是否被 SELinux 或 AppArmor 拦截
- 日志轮转需配合
logrotate等工具,Nginx 本身不自动切分文件


















