0

nginx を使用してテスト Websocket を 9000 から 80 ポートにプロキシしていますが、クライアントが Web プロキシの背後にあるまですべてのテストは問題ありませんが、ハンドシェイク プロセスは失敗します。どこに問題があるのでしょうか? お時間をいただきありがとうございます。

次のエラーが表示されます:
クライアント:

WebSocket connection to 'ws://myserver/ws/' failed: Error during WebSocket handshake: Unexpected response code: 502 autobahn.min.js:62

サーバ:

2014-01-10 19:51:22-0300 [PubSubServer1,19,127.0.0.1] Unhandled Error
    Traceback (most recent call last):
      File "/usr/lib/python2.7/dist-packages/twisted/python/log.py", line 84, in callWithLogger
        return callWithContext({"system": lp}, func, *args, **kw)
      File "/usr/lib/python2.7/dist-packages/twisted/python/log.py", line 69, in callWithContext
        return context.call({ILogContext: newCtx}, func, *args, **kw)
      File "/usr/lib/python2.7/dist-packages/twisted/python/context.py", line 118, in callWithContext
        return self.currentContext().callWithContext(ctx, func, *args, **kw)
      File "/usr/lib/python2.7/dist-packages/twisted/python/context.py", line 81, in callWithContext
        return func(*args,**kw)
    --- <exception caught here> ---
      File "/usr/lib/python2.7/dist-packages/twisted/internet/posixbase.py", line 586, in _doReadOrWrite
        why = selectable.doRead()
      File "/usr/lib/python2.7/dist-packages/twisted/internet/tcp.py", line 199, in doRead
        rval = self.protocol.dataReceived(data)
      File "/usr/local/lib/python2.7/dist-packages/autobahn-0.7.3-py2.7.egg/autobahn/twisted/websocket.py", line 77, in dataReceived
        self._dataReceived(data)
      File "/usr/local/lib/python2.7/dist-packages/autobahn-0.7.3-py2.7.egg/autobahn/websocket/protocol.py", line 1270, in _dataReceived
        self.consumeData()
      File "/usr/local/lib/python2.7/dist-packages/autobahn-0.7.3-py2.7.egg/autobahn/websocket/protocol.py", line 1303, in consumeData
        self.processHandshake()
      File "/usr/local/lib/python2.7/dist-packages/autobahn-0.7.3-py2.7.egg/autobahn/websocket/protocol.py", line 2819, in processHandshake
        self.sendServerStatus()
      File "/usr/local/lib/python2.7/dist-packages/autobahn-0.7.3-py2.7.egg/autobahn/websocket/protocol.py", line 3276, in sendServerStatus
        self.sendHtml(html)
      File "/usr/local/lib/python2.7/dist-packages/autobahn-0.7.3-py2.7.egg/autobahn/websocket/protocol.py", line 3219, in sendHtml
        response += "Content-Length: %d\x0d\x0a" % len(raw)
    exceptions.NameError: global name 'raw' is not defined

私のテストサーバー:

import sys
from twisted.python import log
from twisted.internet import reactor
from autobahn.twisted.websocket import listenWS
from autobahn.wamp import WampServerFactory, \
                          WampServerProtocol

class PubSubServer1(WampServerProtocol):

   def onSessionOpen(self):

      self.registerForPubSub("http://test.com/test")

if __name__ == '__main__':

   log.startLogging(sys.stdout)

   factory = WampServerFactory("ws://localhost:9000", debugWamp = 'debug',externalPort=80)
   factory.protocol = PubSubServer1
   factory.setProtocolOptions(allowHixie76 = True)
   listenWS(factory)

   #reactor.listenTCP(9000, factory)
   reactor.run()

指示:

~$ python /home/my/wsbroker.py 
/usr/local/lib/python2.7/dist-packages/zope.interface-4.0.5-py2.7-linux-x86_64.egg/zope/__init__.py:3: UserWarning: Module twisted was already imported from /usr/lib/python2.7/dist-packages/twisted/__init__.pyc, but /usr/local/lib/python2.7/dist-packages/autobahn-0.7.3-py2.7.egg is being added to sys.path

編集:
失敗したハンドシェイクのデバッグ情報 (Web プロキシを使用するクライアント): http://pastebin.com/aN4ppA2e
完了したハンドシェイクのデバッグ情報 (プロキシなしのクライアント): http://pastebin.com/5rXREY2q

4

2 に答える 2

1

上記のトレースバックは、Autobahn 0.7.0 で導入され、0.7.4 で修正されたバグによるものです。

ただし、バグは実際の問題の原因ではない可能性があります。トレースバックは、Autobahn がプレーンな HTML サーバー ステータス ページをレンダリングしようとしたことを示しています。これは、受信した HTTP リクエストに Upgrade to Websocket ヘッダーが含まれていない場合に行われます。WebSocket を適切に転送するようにプロキシが (まだ) 構成されていない可能性があります。

あなたが遭遇するかもしれないもう一つのこと:WebSocketServerFactoryアウトバーンの は を設定するオプションを提供しますexternalPort. これは、WebSocket 接続を受け入れるプロキシの TCP/IP ポートに設定する必要があります。これが必要なのは、Autobahn が (WebSocket 仕様に準拠して) WebSocket を開く HTTP 要求のホストとポートが、それが実行されているものと一致するかどうかをチェックするためです (異なる場合は、ベイルアウトします)。前述のオプションを使用すると、その動作をオーバーライドできます。

于 2014-01-11T23:20:42.443 に答える