无法使用NginX / FastCGI进行Websocket连接

时间:2014-03-04 02:26:33

标签: nginx websocket go

我有一个用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?

1 个答案:

答案 0 :(得分:3)

你得到的错误是fcgi响应也不是劫持者(websockets使用劫持者接口来接管tcp套接字)。

它与nginx版本没有任何关系。

另外,FCGI与websockets不兼容,你需要有另一台服务器和反向代理