Perlをあまり使ったことがなかったので、メモ的に…
PerlとCPANのインストール
実際にはこれに加えてDBとかWebサーバとかも必要になるけど、まずは最低限ということで。
$ yum -y update
$ yum -y install perl cpan
CPANでインストール中の質問をデフォルトで答えるための設定
インストールしているモジュールが依存しているモジュールも一緒にインストールするか?という質問にyesで答えるための設定。
これをしておかないと、沢山のモジュールを入れるときは結構面倒くさい。
$ cpan
cpan> o conf prerequisites_policy follow
cpan> o conf commit
cpan> q
必要なモジュールをインストール
あんまり一気に入れるとうまくいかない場合があったので、少しずつ…
$ cpan -i CGI Cwd DBI Encode File LWP Mail::Sendmail Math::BigInt JSON
$ cpan -i Time::Local Time::HiRes Mojolicious
$ cpan -i Module::Build DateTime
ここまで構築したところで、WebSocketを使ったチャットプログラムのサンプルを動かしてみる。
参考:Mojolicious::Lite で WebSocket を使ったチャットを作る(現時点:2012年3月10日で動くコード)
$ morbo app.pl
[info] Listening at "http://*:3000".
Server available at http://127.0.0.1:3000.
無事に動いた。
暗号化
WebSocketで暗号化を行う際にはプロトコルがws://
ではなくwss://
となるので、予めソースの該当部分を書き換えておく。分かりやすくするためにポートも変更。
【変更前】
var ws = new WebSocket('ws://localhost:3000/echo');
【変更後】
var ws = new WebSocket('wss://localhost:3001/echo');
morboのオプションでポート指定して起動する。
$ morbo -l "https://*:3001" app.pl
IO::Socket::SSL 1.75 required for TLS support at /usr/local/share/perl5/Mojo/IOLoop.pm line 119
IO::Socket::SSLモジュールが無い、と怒られるのでインストール。
$ cpan -i IO::Socket::SSL
(中略)
cp lib/Net/SSLeay/Handle.pm blib/lib/Net/SSLeay/Handle.pm
/usr/bin/perl "-Iinc" /usr/share/perl5/ExtUtils/xsubpp -typemap /usr/share/perl5/ExtUtils/typemap -typemap typemap SSLeay.xs > SSLeay.xsc && mv SSLeay.xsc SSLeay.c
gcc -c -D_REENTRANT -D_GNU_SOURCE -fno-strict-aliasing -pipe -fstack-protector -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -O2 -g -DVERSION=\"1.55\" -DXS_VERSION=\"1.55\" -fPIC "-I/usr/lib64/perl5/CORE" SSLeay.c
SSLeay.xs:153:25: error: openssl/err.h: No such file or directory
SSLeay.xs:154:27: error: openssl/lhash.h: No such file or directory
依存モジュールであるNet::SSLeayのインストール中に大量のエラーが発生して失敗。
そもそもOpenSSLが入っていないことが問題ということで、いくつか関連するものをインストールする。
参考:CPANでNet::SSLeayのインストールに失敗する時の対処法
$ yum -y install openssl-devel zlib-devel readline-devel
$ cpan -i IO::Socket::SSL
$ morbo -l "https://*:3001" app.pl
[info] Listening at "https://*:3001".
Server available at https://127.0.0.1:3001.
今度はうまくいった。
ブラウザからSSL版のページにアクセスし、無事にWebSocketの通信も動いていることを確認できた。