要让 nginx 代理具备统一审计能力,需协同配置日志机制、请求体读取与敏感控制:启用 $request_body(依赖 proxy_pass 等触发)、自定义 audit_log 格式记录 body、限制 body 大小并截断、用 lua 对密码等敏感字段脱敏。

要让 Nginx 代理具备统一审计能力,核心不是简单转发请求,而是把关键请求上下文(尤其是 POST 参数)可靠、安全、可控地记录下来。这需要在日志机制、请求体读取、敏感控制三方面协同配置,不能只靠 proxy_pass 就认为“已审计”。
启用并确保 $request_body 可用
Nginx 默认不读取请求体,$request_body 变量为空是常态。它只在触发 body 读取逻辑时才生效:
- 必须使用
proxy_pass、fastcgi_pass等代理指令——静态服务或纯 return 响应的 location 中该变量始终为空 - 确保后端服务实际接收并处理了请求(例如 proxy_pass 到一个真实运行的 API),否则 Nginx 可能跳过读取流程
- 避免在 location 中配置
proxy_buffering off或proxy_request_buffering off,否则可能绕过 body 缓存逻辑,导致$request_body不可用
定义带请求体的日志格式并启用
仅靠默认 access_log 无法满足审计要求,需自定义格式并显式写入 body:
- 在
http块中定义日志格式,例如:log_format audit_log '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$request_body"'; - 在对应
location块中启用该格式:access_log /var/log/nginx/audit.log audit_log; - 注意:该日志路径需有 nginx worker 进程的写权限,且磁盘空间充足
控制请求体大小与截断策略
全量记录 POST body 极易引发磁盘耗尽、I/O 阻塞甚至服务抖动:
- 用
client_max_body_size 1m;限制最大允许 body 大小(如上传接口可适当放宽) - 调大
client_body_buffer_size 128k;,确保常见 JSON 或表单数据落在内存缓冲区,避免因写临时文件导致$request_body为空 - 生产环境建议对 body 截断,例如只记录前 2048 字节:
可通过 OpenResty 的log_by_lua_block实现,或使用set-misc-nginx-module的set_quote_sql配合字符串截取
对敏感字段做脱敏处理
密码、token、身份证号等绝不可明文落盘,Nginx 原生不支持 JSON 字段级脱敏,需借助 Lua:
- 启用
ngx_http_lua_module,在log_by_lua_block中解析并替换: - 示例逻辑:识别
Content-Type: application/json,用cjson.decode解析 body,遍历 key 匹配"password"、"access_token"等,值统一替换为"***" - 表单数据(
application/x-www-form-urlencoded)可用正则提取并替换,但需注意编码和边界











