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

Kubernetes Nginx-ingress环境下Mosquitto Websocket连接升级失败求助

解决Kubernetes Nginx Ingress下Mosquitto WebSocket连接失败的问题

看起来你遇到的核心问题是Ingress配置错误导致WebSocket请求无法正确转发到Mosquitto的9001端口,同时Nginx的自动HTTPS跳转也干扰了握手流程。我帮你梳理下问题点和解决方案:

问题诊断

从你提供的配置和日志来看,有两个关键错误:

  1. Ingress后端端口配置错误:你的Ingress规则里把请求转发到了servicePort: 80,但Mosquitto Service暴露的WebSocket端口是9001,这直接导致请求发错了地方。
  2. Nginx自动HTTPS跳转干扰:Ingress日志里的308状态码是Nginx默认把HTTP请求跳转到HTTPS,但你并没有配置HTTPS端口,跳转后的请求无法完成WebSocket握手,进而出现400错误。

解决方案

1. 修正Ingress配置

替换你的Ingress.yaml为以下内容,重点修复端口和添加WebSocket支持的注解:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: mosquitto
  annotations:
    nginx.org/websocket-services: "mosquitto"
    # 禁用自动HTTP转HTTPS,避免308跳转干扰WebSocket握手
    nginx.ingress.kubernetes.io/upgrade-insecure-requests: "false"
    # 添加WebSocket代理所需的请求头
    nginx.ingress.kubernetes.io/configuration-snippet: |
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "upgrade";
      proxy_set_header Host $host;
spec:
  rules:
    - http:
        paths:
          - path: /mosquitto-ws
            backend:
              serviceName: mosquitto
              # 改为正确的WebSocket端口9001
              servicePort: 9001

2. 应用配置并验证

执行以下命令更新Ingress:

kubectl apply -f ingress.yaml

然后确认Ingress后端配置是否正确:

kubectl describe ingress mosquitto

检查Backend部分是否显示为default/mosquitto:9001,确保请求能转发到正确的端口。

3. 测试连接

用WebSocket客户端工具(比如wscat)测试连接:

wscat -c ws://<你的Ingress IP>/mosquitto-ws

如果能成功建立连接,说明转发配置正常,再测试你的Java客户端即可。

额外注意事项

  • 如果你后续需要启用HTTPS,记得在Ingress中配置TLS证书,同时客户端连接URL要改为wss://协议。
  • 检查Mosquitto的auth插件配置:如果连接成功后出现认证错误,再排查auth_opt_http_ip是否能正确访问到你的认证服务(当前配置是127.0.0.1,如果认证服务在另一个Pod,需要改为服务域名或ClusterIP)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:14:53