为不同安全级别虚拟主机配置隔离日志需显式声明:按级别定策略、server块独立配access_log、log_format定义差异化字段、手动建目录并赋权、error_log同样分级配置。

为不同安全级别的虚拟主机配置隔离日志,核心是“按级别定策略、按 server 分路径、按格式带上下文”,不是靠自动识别,而是靠显式声明和结构化设计。
每个 server 块必须独立写 access_log
全局的 access_log 不会自动按域名或端口拆分。哪怕你配了 10 个 server,只要其中某个没写 access_log 指令,它的请求就会混进全局日志里,失去级别区分意义。
- 内部系统(高敏感):access_log /var/log/nginx/internal.access.log internal_json;
- 合作伙伴(中敏感):access_log /var/log/nginx/partner.access.log partner_basic;
- 公开接口(低敏感):access_log /var/log/nginx/public.error-only.log error_only;
- 想关闭某级日志:直接写 access_log off; 即可(如运维健康检查接口)
用 log_format 定义匹配级别的日志结构
日志内容本身要体现安全等级差异,不能只靠文件名区分。字段取舍就是审计粒度的体现。
- 内部级:包含 $realip_remote_addr(非 $remote_addr)、$http_authorization、$request_time、$upstream_response_time、脱敏后的 $args(如用 map 过滤密码参数)
- 合作伙伴级:去掉认证头、不记录原始参数,保留 $host、$uri、$status、$body_bytes_sent、$http_user_agent
- 公开级:用 map 控制仅记录异常,例如 log_format error_only '...'; map $status $log_error { ~^[45] 1; default 0; },再配合 access_log ... if=$log_error;
路径与权限要提前到位
Nginx 不会创建日志目录,也不会报错提示缺失——它只会静默丢弃日志。
- 手动建目录:sudo mkdir -p /var/log/nginx/internal /var/log/nginx/partner /var/log/nginx/public
- 赋权:sudo chown nginx:nginx /var/log/nginx/internal 等目录(用户需与 nginx worker 进程一致)
- 路径必须用绝对路径,如 /var/log/nginx/xxx.log;相对路径 logs/xxx.log 会导致失败
错误日志也建议分级隔离
error_log 同样支持 per-server 配置,且能精准反映各安全域的问题源头。
- 内部服务:error_log /var/log/nginx/internal.error.log debug;
- 合作伙伴服务:error_log /var/log/nginx/partner.error.log warn;
- 公开接口:error_log /var/log/nginx/public.error.log crit;
- 注意:debug 级别日志量极大,仅限内部调试使用,上线后调回 info 或 warn


















