これまでのところ、node.js アプリは 1 つしかありませんでした。socket.io を実行しています。ユーザー数が増えると、ほぼ一日中 CPU 使用率が 100% に達するため、ユーザーを複数の node.js プロセスに分割することにしました。node.js アプリケーション ロジックを分割して、異なるサブドメインのユーザーをシャーディングできるようにしました。また、セッション コードを URL 経由でトークン パッシングに抽出したので、Cookie は重要ではありません。
8 コア マシンの少なくとも 4 コアを使用したいので、複数の node.js プロセスを実行し、それぞれがサブドメインでアプリを提供します。ポート 80 経由ですべての node.js にアクセスできるようにするために、HAProxy を使用することにしました。セットアップは次のようになります。
domain.com -> haproxy -> node on 127.0.0.1:5000
sub1.domain.com -> haproxy -> node on 127.0.0.1:5001
sub2.domain.com -> haproxy -> node on 127.0.0.1:5002
sub3.domain.com -> haproxy -> node on 127.0.0.1:5003
すべてが機能するようになりましたが、アプリケーションの必要な部分 (socket.io を使用しない部分) が非常に遅くなります。これは Express.js を使用して記述されており、ページを直接 (HAProxy 経由ではなく) 開くと高速に動作します。また、socket.io への接続は XHR トランスポートで高速に動作しますが、Websocket トランスポートでは接続の確立に時間がかかります。接続が確立されると、正常に高速に動作します。
これまで HAProxy を使用したことがないため、おそらく何かを誤って構成したのでしょう。これが私のHAProxy構成です:
global
maxconn 50000
daemon
defaults
mode http
retries 1
contimeout 8000
clitimeout 120000
srvtimeout 120000
frontend http-in
bind *:80
acl is_l1 hdr_end(host) -i sub1.domain.com
acl is_l2 hdr_end(host) -i sub2.domain.com
acl is_l3 hdr_end(host) -i sub3.domain.com
acl is_l0 hdr_end(host) -i domain.com
use_backend b1 if is_l1
use_backend b2 if is_l2
use_backend b3 if is_l3
use_backend b0 if is_l0
default_backend b0
backend b0
balance source
option forwardfor except 127.0.0.1 # stunnel already adds the header
server s1 127.0.0.1:5000
backend b1
balance source
option forwardfor except 127.0.0.1 # stunnel already adds the header
server s2 127.0.0.1:5001
backend b2
balance source
option forwardfor except 127.0.0.1 # stunnel already adds the header
server s2 127.0.0.1:5002
backend b3
balance source
option forwardfor except 127.0.0.1 # stunnel already adds the header
server s2 127.0.0.1:5003