Nginx反向代理WildFly部署大WAR包触发401无限循环故障
问题现象
- 部署环境:WildFly 26.0.1 + Nginx反向代理,小体积WAR包通过管理控制台部署正常,绕过Nginx直连WildFly时大体积WAR包部署也正常
- 异常表现:Nginx已配置
client_max_body_size 100M,但部署大WAR包时客户端请求挂起,Nginx access.log无限循环记录POST /management-upload HTTP/1.1" 401 77,WildFly侧无任何部署相关日志 - 正常对照:小WAR包部署时同路径请求返回
POST /management-upload HTTP/1.1" 200 68 - 现有Nginx配置如下:
server { server_name www.example.com example.com; listen 80; listen [::]:80; client_max_body_size 100M; location / { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_pass http://127.0.0.1:8080; proxy_read_timeout 90s; } location /console { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_pass http://127.0.0.1:9990/console; proxy_read_timeout 90s; } location /management { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_pass http://127.0.0.1:9990/management; proxy_read_timeout 90s; } }
故障原因
现有Nginx配置漏了/management-upload路径的匹配规则。WildFly管理控制台处理大体积部署包上传时,不会走/management路径,而是单独调用/management-upload接口做分块上传。当前配置下这个请求会被优先级最低的location /规则转发到8080端口的业务服务端口,而非9990的管理端口,业务端口没有对应管理接口,会持续返回401未授权,触发前端上传逻辑无限重试,最终表现为请求挂起、日志循环刷401记录。
小体积WAR包部署正常,是因为控制台对小文件走的是/management接口上传逻辑,刚好匹配到了正确的转发规则,没有触发配置缺陷。
修复方案
在Nginx配置中新增/management-upload路径的转发规则,转发到9990管理端口,同时调整参数适配大文件上传场景:
- 在现有
location /management配置块下方新增如下规则:
location /management-upload { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # 关闭Nginx请求体缓冲,大文件直接透传给WildFly,避免本地缓存占用过高 proxy_request_buffering off; # 调大超时阈值适配大文件长耗时上传,可根据实际包大小调整 proxy_read_timeout 600s; proxy_send_timeout 600s; proxy_pass http://127.0.0.1:9990/management-upload; }
- 执行
nginx -t校验配置语法无误后,执行nginx -s reload重载配置即可生效。
注意:如果后续需要部署超过100M的WAR包,同步调大
client_max_body_size参数到对应阈值即可。
内容的提问来源于stack exchange,提问作者Stephan Muc81927
相关产品推荐
相关产品推荐

