PocketIO on docCloud
Hachioji.pmで作ってる Yairc(仮) の関係で、PocketIO(Socket.IOのPerl版)をdotCloudで動かす方法を調べました。
dotCloudでPocketIOを動かすには
dotCloudでは本家Socket.IOが動きますし、WebSocketのサポートがアナウンスされていたので動くだろうとは思っていましたが、いくつかハマりポイントがありました。
dotCloudで動かせるPocketIOのサンプルアプリケーションを以下のリポジトリに置いてあります。
GitHub - hideo55/pocketio_on_dotcloud: PocketIO example on dotCloud.
必要なことはほとんどdotcloud.ymlに書くようにしてあります。必要に応じて、ビルドスクリプトを追加したり、supervisord.confをカスタマイズするなどしてください。
www: type: perl ports: www: http requirements: - Twiggy - PocketIO postinstall: mv $HOME/current/profile $HOME/profile processes: chat: twiggy -p $PORT_WWW -a chat/app.psgi
ポイント毎に説明していきます。
type: perl
Perlを使用するので当然この設定をします。この設定をする事によって、Makefile.PLまたはdotcloud.ymlの'requirements'で指定した依存モジュールをデプロイ時にインストールすることができます。
ports
フロントからのポート転送を設定します。ちなみに、ドキュメントによるとフロントのロードバランサはWebSocketに対応したNode.js製のもののようです。
requirements
依存モジュールを指定します。
postinstall
Hookスクリプトです。Post-Installでsupervisordで起動されるサービスが読み込むprofileをホームディレクトリに移動しています。type=custom等だと.dotcloud_profileがデフォルトで読み込まれていますが、type=perlだと読み込まれないための措置です。sshでログインして.profileを変更したり、supervisord.confを書いて.dotcloud_profileを読み込むなど他の手段でも代替可能です。
processes
バックグラウンドでプロセスを起動します。この指定をすると以下の様なsupervisord.confが生成されます。
[program:chat] command=bash -lc "[ -f ~/profile ] && source ~/profile; exec twiggy -p $PORT_WWW -a chat/app.psgi" directory=/home/dotcloud/current redirect_stderr=true stdout_logfile=/var/log/supervisor/chat.log stderr_logfile=/var/log/supervisor/chat.log
上記のように、$PORT_WWWをポートとして指定することによりフロントから転送された通信をTwiggyで受けることができます。
PocketIO Tips
動作を確認する過程で調べたことをメモしておきます。
Transportを指定する方法
本家のSocket.IOでは利用する通信方法を以下の様に指定します。
io.set('transports', [ 'websocket', 'xhr-polling', 'jsonp-polling' ]);
PocketIOでも以下のようにすることで通信方法を指定できます。
builder { mount '/socket.io' => PocketIO->new( handler => sub { my $self = shift; $self->on( ... }, socketio => { transports => [qw/websocket xhr-polling jsonp-polling/], }, }); };