我有一个用Go编写的Web应用程序。当我使用标准库附带的Web服务器运行应用程序时,websocket连接正常工作。
但是,当我将Web应用程序作为FastCGI应用程序运行并使用NginX作为代理时,无法建立websocket连接。我收到此错误消息:
websocket: response does not implement http.Hijacker
我正在使用Gorilla Toolkit's websocket library进行websocket连接,并进行以下设置:
Go Handler:
func NotificationsWebSocket(w http.ResponseWriter, r *http.Request) {
ws, err := websocket.Upgrade(w, r, nil, 1024, 1024)
if err != nil {
log.Print(err.Error())
return
}
//...
}
//...
router.HandleFunc("/notifications", NotificationsWebsocket)
//...
tcp, err := net.Listen("tcp", "127.0.0.1:9000")
handleErr(err)
err = fcgi.Serve(tcp, router)
nginx.conf
location ~ ^.+$ {
fastcgi_pass 127.0.0.1:9000;
include /etc/nginx/fastcgi_params;
}
我可以解决这个问题的一种方法是为所有常规Web处理程序提供FastCGI连接,并为websocket处理程序运行单独的Web服务器,然后相应地处理NginX中的/ notifications路径,但我想避免这种情况如果可能的话。
有没有人知道是否有办法配置NginX以允许连接升级到websockets?
答案 0 :(得分:3)
你得到的错误是fcgi响应也不是劫持者(websockets使用劫持者接口来接管tcp套接字)。
它与nginx版本没有任何关系。
另外,FCGI与websockets不兼容,你需要有另一台服务器和反向代理