如何排查Nginx代理Spring Boot应用时返回401且后端无日志的问题
Nginx返回401且请求未到达Spring Boot的排查步骤
出现该现象的核心原因是请求被Nginx直接拦截返回,没有转发到上游的Spring Boot服务,可按以下顺序排查:
1. 核对Nginx配置的认证相关规则
优先检查对应站点的server、location块配置,重点关注以下配置项:
- 有没有开启
auth_basic基础认证:如果配置了该参数且对方请求未携带正确的用户名密码凭证,Nginx会直接返回401,不会转发请求 - 有没有配置
auth_request认证前置校验:该模块会在转发请求前先发送子请求到认证服务校验,子请求返回401时Nginx会直接拦截原请求 - 有没有配置自定义的请求头校验规则:比如要求请求必须携带指定的Authorization头、自定义业务头,不符合要求直接返回401
- 有没有匹配到错误的location块:比如文件上传接口命中了其他带认证限制的location规则,没有匹配到转发到Spring Boot的无认证/已放行location
2. 开启Nginx debug日志定位具体触发逻辑
默认的access日志信息不足,可临时开启debug级别日志打印完整请求处理流程:
- 修改Nginx配置文件中对应server块的error_log配置:
error_log /var/log/nginx/error.log debug;
- 执行
nginx -s reload重载配置 - 让对方重放一次失败请求,查看error.log中的debug日志,可清晰看到请求匹配了哪个location、执行了哪条校验规则触发了401返回
3. 对比异常请求与正常请求的特征差异
让对方用浏览器F12网络面板导出失败请求的完整请求头、参数,和Postman正常请求的参数做对比,重点排查:
- 是否缺少认证头(Authorization、Cookie等):JS跨域请求默认不会携带Cookie,需要前端配置
withCredentials=true才会发送 - Content-Type格式是否符合要求:multipart请求的boundary参数是否正常
- 是否携带了Nginx规则拦截的特殊请求头、特殊文件名参数
4. 本地模拟请求复现问题
在Nginx所在服务器本地用curl模拟对方的请求头重放请求,可快速定位问题:
# 替换为对方的请求头、上传文件参数,本地调用Nginx curl -v -X POST http://127.0.0.1/my/api/file/upload \ -H "Content-Type: multipart/form-data; boundary=xxx" \ -H "其他请求头: 对应值" \ -F "file=@本地测试文件路径"
如果本地模拟也返回401,可逐步删减请求头、调整参数,定位是哪个特征触发了Nginx的拦截规则。
内容的提问来源于stack exchange,提问作者B.Ohara
相关产品推荐
相关产品推荐

