ELB(CLB) で WebSocket 通信

ELB(CLB) で WebSocket 通信

ALB では標準で WebSocket プロトコル機能に対応しているため、HTTP/HTTPS リスナーで受けて HTTP/1.1 から Upgrade で WebSocket 通信を開始することができます。 しかしながら、CLB, NLB では、ELB の機能としては対応しておりませんが、TCP リスナーを経由してバックエンドで WebSocket の機能に対応することで実現可能です。TCP レイヤーではスティッキーセッションのようなセッション維持機能を利用することができないので、nginx でプロキシし、その際、接続元の IP アドレスの情報は Proxy Protocol を利用する形で、WebSocket 通信を行います。 ALB では、Upgrade からそれに続く WebSocket 通信の間でスティッキーセッション機能を利用することもできますが、WebSocket が1つの TCP コネクションを利用するため、スティッキーセッション機能を利用することなく一つのバックエンドに割り振られます。 ただし、CLB ではアイドルタイムアウトもあり、60秒間アイドル状態が続くとコネクションが切断されてしまいます。そのため、サーバ側から定期的に Ping を定期的に行い、Pong の応答を得てコネクションを維持する方法があります。

設定

Node.js のインストール

$ sudo yum install -y gcc-c++ make openssl-devel
$ curl -sL https://rpm.nodesource.com/setup_8.x | sudo bash -
$ sudo yum install -y nodejs

インストールされていることの確認

$ node -v
v8.11.3

npm のインストール

$ curl -L http://npmjs.org/install.sh | sudo sh
$ vim ~/.npmrc
$ vim ~/.bashrc
$ source ~/.bashrc

.npmrc

.bashrc に以下を追記

インストールされていることを確認

Socket.IO 等のインストール

nginx のインストール

プログラムの作成

ELBのProxy Protocolの設定

動作確認

ELB の FQDN に対してブラウザからアクセス http://.us-west-2.elb.amazonaws.com/ Socket.IOのアプリケーション起動

参考

  • https://qiita.com/you21979@github/items/4c9c382b9536effc590d

  • http://d.hatena.ne.jp/lettas0726/20110406/1302041546

  • http://d.hatena.ne.jp/lettas0726/20110406

  • https://socket.io/get-started/chat

  • https://qiita.com/yamamaijp/items/84da15b81ec5c16ffdd0

  • https://debiancdn.wordpress.com/2012/03/03/elb-loadbalancer-websocket/

Last updated