ねえ私はsocket.ioからHaproxyプロキシWebSocket接続を取得しようとしています
私はグーグルで見つけることができるほとんどすべてを読み、haproxy.cfgの無数のバリエーションを試しましたが、何を試しても、socket.ioは常に長いポーリングにフォールバックします。
使用しているソケットサーバーに接続を直接ルーティングすると、ws接続が完全に機能することを言及する価値があります。
したがって、socket.ioクライアントとtornadotornadio2websocketサーバーを使用しています。ここから取得した現在のhaproxy.cfghaproxyexample conf
defaults
mode http
frontend all
bind 0.0.0.0:80
mode tcp
maxconn 200000
timeout client 86400000
default_backend www_backend
# Any URL beginning with socket.io will be flagged as 'is_websocket'
acl is_websocket path_beg /socket.io
acl is_websocket hdr(Upgrade) -i WebSocket
acl is_websocket hdr_beg(Host) -i ws
# The connection to use if 'is_websocket' is flagged
use_backend socket_backend_http if is_websocket
tcp-request inspect-delay 500ms
tcp-request content accept if HTTP
backend www_backend
option httplog
option httpclose
balance roundrobin
option forwardfor
timeout server 30000
timeout connect 4000
server nginx localhost:81 weight 1 maxconn 1024 check
backend socket_backend_http
mode http
option httplog
option http-server-close
option forceclose
no option httpclose
balance roundrobin
option forwardfor
timeout queue 5000
timeout server 86400000
timeout connect 86400000
timeout check 1s
server socket1 localhost:3012 weight 1 maxconn 1024 check
websocketリクエストはsocket_backend_httpに正しくルーティングされていますが、ブラウザコンソールには常に次のエラーが表示されます
Unexpected response code: 400
次に、socket.ioは、短時間のメッセージが期待どおりに表示された後、ロングポーリングにフォールバックします。最新バージョンのchrome、safari、firefoxを使用してテストしたところ、すべて同じ結果になりました
私は非常に多くの人々がこれが私を失望させるように働いていると言うのを見てきました!この問題をなんとか解決してくれた人には、永遠に感謝します。
ここでも、haproxyがポット80にバインドされていることを明確にするために、nginxはポート81で実行され、ソケットサーバーはポート3012で実行されています。コード
前もって感謝します
現在のhaproxy.cfgを編集 すると、トルネードサーバーでこのエラーが実際に発生します。
Traceback (most recent call last):
File "/home/mike/.virtual-envs/watchdog-app/local/lib/python2.7/site- packages/tornado/ioloop.py", line 399, in _run_callback
callback()
File "/home/mike/.virtual-envs/watchdog-app/local/lib/python2.7/site-packages/tornado/iostream.py", line 304, in wrapper
callback(*args)
File "/home/mike/.virtual-envs/watchdog-app/local/lib/python2.7/site-packages/tornado/httpserver.py", line 250, in _on_headers
self.request_callback(self._request)
File "/home/mike/.virtual-envs/watchdog-app/local/lib/python2.7/site-packages/tornado/web.py", line 1362, in __call__
handler._execute(transforms, *args, **kwargs)
File "/home/mike/.virtual-envs/watchdog-app/local/lib/python2.7/site-packages/tornado/web.py", line 992, in _execute
self._handle_request_exception(e)
File "/home/mike/.virtual-envs/watchdog-app/local/lib/python2.7/site-packages/tornado/web.py", line 1032, in _handle_request_exception
self.send_error(500, exc_info=sys.exc_info())
File "/home/mike/.virtual-envs/watchdog-app/local/lib/python2.7/site-packages/tornado/web.py", line 688, in send_error
self.finish()
File "/home/mike/.virtual-envs/watchdog-app/local/lib/python2.7/site-packages/tornado/web.py", line 669, in finish
self.request.finish()
File "/home/mike/.virtual-envs/watchdog-app/local/lib/python2.7/site-packages/tornado/httpserver.py", line 422, in finish
self.connection.finish()
File "/home/mike/.virtual-envs/watchdog-app/local/lib/python2.7/site-packages/tornado/httpserver.py", line 183, in finish
assert self._request, "Request closed"
アップデート
さて、いくつかのさらなる開発。stunnelを使用して、少し異なる設定でこれを機能させることができました。そのため、nginxはhttpリクエストをhttpsに再ルーティングし、そこでピックアップされ、ssl接続はstunnelによって終了されます。その後、ポート8443でリクエストが転送され、haproxyがピックアップされます。ソケットハンドシェイクが行われ、すべてが期待どおりに機能します。これは素晴らしいことですが、httpではなくsslで機能する理由を教えてくれる人が大好きです。