You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring WebSocket换Undertow后经Nginx代理无法连接求助

解决Undertow+Nginx代理下WebSocket连接失败(1006错误)的问题

针对你的情况,核心问题出在Nginx配置的缺失项,以及Undertow对HTTP协议头的严格解析要求,以下是具体调整方案:

1. 修正Nginx配置

你的现有配置缺少WebSocket握手必需的proxy_http_version 1.1指令,且Connection头的处理可以更严谨,调整后的完整配置如下:

# 在http全局块中添加映射规则
map $http_upgrade $connection_upgrade {
    default upgrade;
    '' close;
}

server {
    # 其他server相关配置...

    location /ws/ {
        proxy_pass http://chat:8080;
        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 REMOTE-HOST $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_redirect off;

        # WebSocket 关键配置
        proxy_http_version 1.1; # WebSocket依赖HTTP/1.1协议,Undertow要求显式声明
        proxy_connect_timeout 4s;
        proxy_read_timeout 15m;
        proxy_send_timeout 12s;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade; # 动态适配Connection头,避免硬写兼容性问题
    }
}

关键调整说明:

  • proxy_http_version 1.1:WebSocket握手基于HTTP/1.1协议,Tomcat可能兼容未明确指定的情况,但Undertow要求必须显式声明,否则会直接导致握手失败触发1006错误。
  • 动态Connection头映射:通过map指令根据客户端的Upgrade头自动设置Connection值,适配不同请求场景,避免硬写"upgrade"带来的兼容性问题。

2. Undertow补充配置

除已添加的server.forward-headers-strategy=native,可在application.properties中追加以下配置,确保Undertow正确处理代理转发的请求:

# 允许Undertow解析X-Forwarded-*系列头(配合native策略增强兼容性)
server.undertow.forward-headers-enabled=true
# 可选:若WebSocket路径包含特殊字符,开启此配置避免路径解析失败
server.undertow.allow-encoded-slash=true

3. 验证步骤

  1. 重启Nginx和Undertow应用
  2. 查看Nginx日志(/var/log/nginx/access.log、error.log),确认WebSocket握手请求返回101 Switching Protocols状态码
  3. 客户端重新连接WebSocket端点,检查是否仍出现1006错误

内容的提问来源于stack exchange,提问作者joejoe2

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 06:30:18