异步高速公路背后的反向代理拒绝连接



我使用Autobahn和Asyncio来构建一个与我的flask应用程序分离的轻量级套接字服务器。我已经完成了所有的工作,但为了相应地路由流量,我将两台服务器放在了HAProxy之后。我成功地将请求发送到服务器,但随后连接关闭,服务器报告:

WebSocket connection closed: connection was closed uncleanly (port 9001 in HTTP Host header 'localhost:9001' does not match server listening port 4000)

因此,标头与服务器所期望的不匹配。有什么办法改变这一点吗?

我使用的是带有python 3.4的高速公路python 0.10.9版本。这是我的服务器代码:

from autobahn.asyncio.websocket import WebSocketServerProtocol, 
    WebSocketServerFactory
import asyncio
import json

class SimpleServer(WebSocketServerProtocol):
    def onConnect(self, request):
        print("Client connecting: {0}".format(request.peer))
    def onOpen(self):
        print("WebSocket connection open.")
    @asyncio.coroutine
    def onMessage(self, payload, isBinary):
        if not isBinary:
            self.sendMessage(payload, isBinary)
        else:
            self.sendMessage(payload, isBinary)
    def onClose(self, wasClean, code, reason):
        print("WebSocket connection closed: {0}".format(reason))

if __name__ == '__main__':
    factory = WebSocketServerFactory(u"ws://127.0.0.1:4000", debug=False)
    factory.protocol = SimpleServer
    loop = asyncio.get_event_loop()
    coro = loop.create_server(factory, '127.0.0.1', 4000)
    server = loop.run_until_complete(coro)
    try:
        loop.run_forever()
    except KeyboardInterrupt:
        pass
    finally:
        server.close()
        loop.close()

HAProxy版本为1.4.18,配置为:

global
    log 127.0.0.1›  local0
    log 127.0.0.1›  local1 notice
    maxconn 4096
    user root
    group sudo                                                                                                                                                                       
    debug
    #quiet
defaults
    log  global
    mode   http
    option  httplog
    option  dontlognull
    retries  3
    option  redispatch
    maxconn  2000
    contimeout  5000
    clitimeout  50000
    srvtimeout  50000
frontend public
  bind *:9001
  acl is_websocket hdr(Upgrade) -i WebSocket
  use_backend ws if is_websocket
  default_backend www 
backend www 
  timeout server 30s 
  server www1 127.0.0.1:3000
backend ws
  timeout server 600s
  server ws1 127.0.0.1:4000

我运行的是Ubuntu 12.04。感谢的帮助

对于任何坚持这一点的人来说,这是通过更改来修复的

factory = WebSocketServerFactory(u"ws://127.0.0.1:4000", debug=False)

至:

factory = WebSocketServerFactory()

显然,在工厂中指定url会导致高速公路对标头进行检查。

最新更新