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

Spring Boot+Nginx环境下Angular无法连接WSS问题求助

问题描述

本地环境中Angular(rxstomp)连接Spring Boot的WebSocket(ws)端点正常,但部署到带Nginx(HTTPS)的生产服务器后无法连接。前端(FE)与后端(BE)部署在同一服务器的Docker容器中,使用不同URL。

现有配置:

Nginx配置

location /ws {
 ...
 proxy_pass http://backend/ws
 ...
}

后端Spring Boot代码

@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
    registry.addEndpoint("/ws")
            .setAllowedOrigins(frontendUrl);
}

前端Angular代码

export function rxStompServiceFactory() {
    const rxStomp = new RxStompService();
    rxStomp.configure(myRxStompConfig);
    rxStomp.activate();
    return rxStomp;
}
export const myRxStompConfig: RxStompConfig = {
    brokerURL: 'ws://localhost:8088/ws',
...
}
排查与解决方案

1. 修正前端WebSocket协议与地址

生产环境用HTTPS,WebSocket必须对应使用wss://协议,不能硬编码本地的localhost:8088,要换成生产域名或相对路径:

export const myRxStompConfig: RxStompConfig = {
    // 写法1:指定生产HTTPS域名
    brokerURL: 'wss://your-production-domain.com/ws',
    // 写法2:自动适配当前协议与域名,更灵活
    // brokerURL: window.location.protocol.replace('http', 'ws') + '//' + window.location.host + '/ws',
...
}

2. 完善Nginx的WebSocket代理配置

Nginx默认不处理WebSocket握手和长连接,需添加专属配置:

location /ws {
    proxy_pass http://backend/ws;
    # WebSocket核心配置
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    # 长连接超时设置,按需调整
    proxy_connect_timeout 7d;
    proxy_send_timeout 7d;
    proxy_read_timeout 7d;
    # 传递客户端真实地址(可选)
    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;
}

3. 修正后端CORS配置

生产环境的frontendUrl必须是前端的HTTPS域名(如https://your-fe-domain.com),不能填localhost。Spring Boot 2.4+推荐用setAllowedOriginPatterns支持通配符(可选):

@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
    registry.addEndpoint("/ws")
            // 固定域名写法
            .setAllowedOrigins("https://your-fe-domain.com")
            // 通配符写法(支持同域名下的子域名)
            // .setAllowedOriginPatterns("https://*.your-domain.com")
            // 可选:启用SockJS兼容低版本浏览器
            .withSockJS();
}

4. 检查Docker网络连通性

确认Nginx容器能访问到Docker服务名backend,可在Nginx容器内执行curl http://backend/ws测试。若不通,检查FE、BE、Nginx是否在同一Docker网络中。

5. 日志排查定位

  • 查看Nginx的access.log和error.log,找WebSocket握手失败记录;
  • 查看Spring Boot后端日志,排查CORS错误或连接请求被拒绝的信息;
  • 打开浏览器开发者工具的Network标签,查看WebSocket请求的状态码(如403、404、502),根据错误码定位问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 06:35:16