Nginx Ingress Controller 默认已支持 WebSocket,但需通过以下注解优化连接参数:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    # WebSocket 核心配置
    nginx.ingress.kubernetes.io/proxy-http-version: "1.1"    # 强制使用 HTTP/1.1(WebSocket 必需)
    nginx.ingress.kubernetes.io/proxy-read-timeout: "86400"  # 读超时(单位:秒,建议长连接设为 24 小时)
    nginx.ingress.kubernetes.io/proxy-send-timeout: "86400"  # 写超时(单位:秒,与读超时对齐)

    # 其他原有注解保持不变(如 CORS、安全拦截等)
    nginx.ingress.kubernetes.io/configuration-snippet: |
      ...
    nginx.ingress.kubernetes.io/server-snippet: |
      ...
spec:
  ...

注解说明

注解名称作用
proxy-http-version: "1.1"强制使用 HTTP/1.1 协议,确保支持 Upgrade 标头实现 WebSocket 握手
proxy-read-timeout: "86400"后端服务器读超时(防止空闲 WebSocket 连接断开)
proxy-send-timeout: "86400"后端服务器写超时(与读超时一致,保持对称性)

注意事项

  1. 无需手动添加 UpgradeConnection
    Nginx Ingress 自动处理 WebSocket 的协议升级,无需在 server-snippet 中手动配置 proxy_set_header

  2. 超时时间设置

    • 根据业务场景调整 proxy-read-timeoutproxy-send-timeout(例如实时性要求高的场景可缩短)。
    • 避免超过 Nginx 的默认最大值(通常为 60 秒需显式覆盖)。
  3. CORS 兼容性
    WebSocket 握手阶段可能需要 CORS 头,确保 Access-Control-Allow-Origin 等头已正确配置(示例中已包含)。


配置验证

  1. 连接测试
    使用 wscat 工具测试 WebSocket 连通性:

    wscat -c wss://ai-application.dossen.com
    
  2. 响应头检查
    确认握手响应包含 HTTP/1.1 101 Switching ProtocolsConnection: upgrade

  3. 日志监控
    查看 Nginx Ingress 日志,过滤 WebSocket 相关连接状态和超时事件:

    kubectl logs -n ingress-namespace <nginx-ingress-pod> | grep -i websocket
    

完整配置示例

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/proxy-http-version: "1.1"
    nginx.ingress.kubernetes.io/proxy-read-timeout: "86400"
    nginx.ingress.kubernetes.io/proxy-send-timeout: "86400"
    nginx.ingress.kubernetes.io/configuration-snippet: |
      if ($http_origin ~* ^https?://(your-domains)\.com$) {
          add_header 'Access-Control-Allow-Origin' '$http_origin' always;
          # 其他 CORS 头...
      }
    nginx.ingress.kubernetes.io/server-snippet: |
      location ~ ^/(敏感路径) { return 403; }
spec:
  rules:
    - host: ai-application.dossen.com
      http:
        paths:
          - path: /
            backend:
              serviceName: dossen-ai-application-service
              servicePort: 18080
  tls:
    - hosts:
        - ai-application.dossen.com
      secretName: dossen.com