ポート 80 で Web サーバーと Websocket サーバーを実行しようとしています。これを行うには、HAProxy を使用して、この構成を使用して接続をルーティングしています。
global
maxconn 4096 # Total Max Connections. This is dependent on ulimit
nbproc 1
ulimit-n 65536
defaults
mode http
frontend all 0.0.0.0:80
timeout client 86400000
acl is_websocket hdr_beg(host) -i live
acl is_websocket hdr(Upgrade) -i WebSocket
default_backend www_backend
use_backend production_socket_backend if is_websocket
backend www_backend
balance roundrobin
option forwardfor # This sets X-Forwarded-For
timeout server 30000
timeout connect 4000
server appserver 127.0.0.1:81 weight 1 maxconn 1024
backend production_socket_backend
balance roundrobin
option forwardfor # This sets X-Forwarded-For
timeout queue 5000
timeout server 86400000
timeout connect 86400000
server appserver 127.0.0.1:8083 weight 1 maxconn 1024
Google Chrome を使用してテストしています。一部のマシンでは問題なく接続できますが、他のマシンでは 502 エラーが発生し、em-websocket が次のエラーをログに記録します。
#<EventMachine::WebSocket::HandshakeError: Connection and Upgrade headers required>
プロキシの実行を停止し、ポート 80 で Web ソケット サーバーを実行すると、問題がプロキシにあることがわかります。アップグレード パケットが有効な HTTP ではないため、Websocket を処理するときに HAProxy を http モードで実行してはならないことをどこかで読みましたが、これは私が見ている問題と関係があるのでしょうか?