1

誰かが私を助けてくれることを願っています。

NodeJS v0.8.16 Socket.ID v0.9.13 と HAProxy 1.5-dev17 を使用しています。

私のセットアップは、VPC を使用する Amazon AWS であり、パブリックに面したインスタンスで HAProxy を使用し、通常はパブリックにアクセスできない別のインスタンスで NodeJS を使用しています。テスト用にIPアドレスを持っています。

NodeJS サーバーにログインし、Socket.IO を介して認証済みの websocket を開くテスト セットアップがあります。セッションの詳細は Redis に保存され、それらの間で共有されます。Websocket が正常に接続されると、NodeJS を介して要求が行われ、イベントがクライアントに返されます。

このフローは、テストが HAProxy を直接バイパスして NodeJS インスタンスを参照する場合に正しく機能します。HAProxyを介してルーティングすると、Socket.IOからエラーが発生します

「予約済みフィールドは空でなければなりません」および「オペコードのハンドラーはありません」は、ランダムなオペコードを参照します

私が見ることができるものから、リクエストの目的を解決するためにビットマスクを使用してSocket.IOによって解析される最初のバイトがあります。HAProxy を介してルーティングした後、この値は予期されたものではなくなり、これらのエラーがスローされます。

私の HAProxy 構成は、別の StackOverflow の質問HAProxy + WebSocket 切断からのものです

global
    maxconn     4096 # Total Max Connections. This is dependent on ulimit
    nbproc      2

defaults
    mode        http
    retries 3
    option redispatch
    option http-server-close


frontend all 0.0.0.0:3000
    timeout client 5000
    default_backend www_backend
    acl is_websocket hdr(Upgrade) -i WebSocket
    acl is_websocket hdr_beg(Host) -i ws

    use_backend socket_backend if is_websocket

backend www_backend
    balance roundrobin
    option forwardfor # This sets X-Forwarded-For
    timeout server 5000
    timeout connect 4000
    server server 10.0.0.214:3000 weight 1 maxconn 1024 check

backend socket_backend
    balance roundrobin
    option forwardfor # This sets X-Forwarded-For
    timeout queue 5000
    timeout server 5000
    timeout connect 5000
    timeout tunnel 3600s
    timeout http-keep-alive 1s
    timeout http-request 15s
    server server1 10.0.0.214:3000 weight 1 maxconn 1024 check

他のさまざまな HAProxy 構成も試しましたが、結局同じ結果になりました。

誰かがこの問題に遭遇しましたか。何が間違っていたのかわかりません。

4

0 に答える 0