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

如何在Azure托管的Golang Web应用中使用WSS协议?

解决方案:利用Azure App Service的TLS终止特性

Azure App Service的请求链路为:客户端 → Azure前端代理(负责HTTPS/WSS加密解密) → 你的Go后端(仅需处理HTTP/WS请求)。因此无需在Go代码中配置TLS,只需做以下调整:

  1. 修改Go代码,使用HTTP监听
    替换http.ListenAndServeTLS为http.ListenAndServe,监听Azure通过环境变量提供的端口:

    import "os"
    import "log"
    
    // ...
    mux := http.NewServeMux()
    // WebSocket处理逻辑保持不变
    mux.HandleFunc("/ws", func(w http.ResponseWriter, r *http.Request) {
        conn, _ := upgrader.Upgrade(w, r, nil)
        for {
            messageType, p, err := conn.ReadMessage()
            if err != nil {
                return
            }
            if err := conn.WriteMessage(messageType, p); err != nil {
                return
            }
        }
    })
    
    // 读取Azure提供的PORT环境变量,本地调试用8080作为 fallback
    port := os.Getenv("PORT")
    if port == "" {
        port = "8080"
    }
    // 启动HTTP服务器即可
    log.Fatal(http.ListenAndServe(":"+port, mux))
    
  2. 客户端使用WSS协议连接
    客户端连接地址改为wss://<你的应用名>.azurewebsites.net/ws,Azure会自动将WSS请求解密后,以WS形式转发到你的Go后端。

失败原因解析

  • 用http.ListenAndServe但客户端连WS失败:HTTPS页面禁止混合明文内容(WS),但使用WSS时,Azure代理已完成加密,后端接收WS请求属于合法链路。
  • 尝试读取证书路径:Azure默认证书由前端代理持有,后端代码无法直接访问,也无访问必要。

额外配置提示

  • 确保WebSocket升级器允许代理请求,原型阶段可放宽限制:
    var upgrader = websocket.Upgrader{
        CheckOrigin: func(r *http.Request) bool {
            return true // 生产环境需根据实际域名限制
        },
    }
    
  • 原型阶段无需上传自签名证书,Azure默认提供的azurewebsites.net域名已附带可信SSL证书。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 20:07:03