生产环境Nginx日志需兼顾可追溯、可审计、防篡改、低干扰和合规可用,核心是分离access与error日志、自定义格式、启用logrotate轮转、敏感字段脱敏、对接syslog集中系统并限制本地留存。

生产环境的 Nginx 日志不能只满足“有记录”,而要兼顾可追溯、可审计、防篡改、低干扰和合规可用。核心思路是:分离日志类型、控制输出粒度、限制访问权限、统一落盘路径、对接集中系统,同时避免在高并发下因日志拖慢服务。
按用途拆分 access 和 error 日志
默认共用一个日志文件会混杂信息,排查效率低,也难做权限隔离。应明确分工:
-
access_log 专注业务请求:记录客户端 IP、时间、URI、状态码、响应体大小、上游响应时间(
$upstream_response_time)、请求头中的关键标识(如$http_x_request_id);不记录敏感字段(如密码、token);建议使用自定义日志格式,例如:
-
error_log 独立存放、等级收紧:生产环境建议设为
warn或error,避免info级刷屏;路径单独指定(如/var/log/nginx/error.log),禁止写入/tmp或根分区;确保磁盘配额或轮转策略到位,防止撑爆系统。
启用日志轮转与磁盘保护
不轮转的日志会无限增长,既占空间又影响检索。推荐用 logrotate 而非 Nginx 自带的 reopen,更稳定可控:
- 配置每日切割 + 保留 30 天 + 自动压缩(
compress); - 添加
copytruncate:避免重命名后 Nginx 因 fd 未刷新继续写旧文件; - 设置
maxsize 100M作为兜底,防止单日突增打满磁盘; - 所有日志目录(
/var/log/nginx/)属主设为root:adm,权限0750,禁止普通用户读取。
脱敏敏感字段与限制日志内容
日志中若含手机号、身份证、token、完整 query 参数,将直接违反等保、GDPR 等要求。必须前置过滤:
- 用
map指令对特定参数值做掩码处理,例如将phone=138****1234替换为phone=REDACTED; - 禁用记录
$request_body(除非调试且明确关闭生产); - 对登录、支付类 URI(如
/api/v1/login)单独配置精简日志格式,跳过$args; - 不记录
Authorization、X-Api-Key等敏感请求头——Nginx 默认就不记,但需确认未被自定义 log_format 意外引入。
对接集中日志系统并限制本地留存
本地日志只是临时缓冲,真正价值在于汇聚分析。应做到:
- 用
syslog协议将 access/error 日志实时发往远程日志中心(如 Loki、ELK、Graylog),Nginx 配置示例:
- 本地仅保留最近 3 天原始日志,其余全部归档或删除;
- 远程日志系统开启传输加密(TLS)、身份认证、写入权限控制;
- 为 audit 类操作(如后台管理、配置变更)启用独立 access 日志流,并打上
log_tag audit标识,便于 SOC 审计提取。


















