HTML5に加わるwebsoketを使用すると今まで以上にリアルタイム性の高いアプリケーションを作成することができる為個人的に非常に注目しています。
メインで使用しているブラウザのChromeには既にWebsocketが実装されており、使用することが可能だということで、簡易的なチャットでも作ってみようかと思い、色々調べていました。
Jetty7でWebSocket開発:マピオンラボ(Java)
サーバ側の実装についてまとめられています。今回私が選択したのは、pywebsocketというものです。これは、apacheのモジュールとして提供されwsプロトコルの場合はwebsocketハンドラに処理を流すというものです。スタンドアロンで使用することもできるらしいのですが、今回はapacheのモジュールとして使用します。pywebsocketという名前からwebsocketハンドラはプログラム言語Pythonで実装する必要があります。
インストールした環境は、ServersMan@VPSでOSはCentOs 5.4です。それでは、早速手順の方を書いていきたいと思います。
手順は以下から
目次
概要
ServersMan@VPS上にapacheのwebsocket
前提条件
- 環境はServersMan@VPSのEntryプランのものを使用する。
- yumにてhttpdをインストール済みとする。
- 下記の手順はユーザ「root」にて行うこと。
- ダウンロードなどの作業ディレクトリは「/root/tmp」とする。
作業手順
python-develのインストール
mod_pythonをコンパイルする際にPythonのソースが必要な為インストールする。
ダウンロード、インストール
# wget ftp://mirror.switch.ch/pool/3/mirror/centos/5.5/os/x86_64/CentOS/python-devel-2.4.3-27.el5.i386.rpm
# rpm -ivh python-devel-2.4.3-27.el5.i386.rpm
上記のダウンロードURLの接続が悪い場合などは、下記のサイトから他のミラーサイトのURLを使用する。
RPM Search CentOS 5 python-devel-2.4.3-27.el5.i386.rpm
mod_pythonのインストール
Issue 42 – pywebsocket – Python2.4 Support (CentOS/RHEL) – Project Hosting on Google Code
mod_python自体はyumでもインストールすることは可能だが、バージョンが3.2.xであり、pywebsocketはmod_pythonの3.3より低いバージョンはサポートしていない為ソースからコンパイルする。
ダウンロード、インストール
# wget https://ftp.kddilabs.jp/infosystems/apache/httpd/modpython/mod_python-3.3.1.tgz
# tar zxf mod_python-3.3.1.tgz
# cd mod_python-3.3.1
# ./configure –with-apxs=/usr/sbin/apxs –with-python=/usr/bin/python
# make
# make install
python.confの作成
ファイルパス:/etc/httpd/conf.d/python.conf
ファイル内容
LoadModule python_module modules/mod_python.so
AddHandler mod_python .py
pywebsocketのインストール
svnのtrunkを使用しても良いが、安定している可能性が高いバージョンが区切られたものを今回は使用する。今回使用したwebsocketの本家サイトをチェックし、バージョン0.5よりも新しいものがリリースされている場合は、できる限りそちらを使った方が良い。ただし、正常にインストールできるかは保証しない。
ダウンロード、インストール
# wget https://pywebsocket.googlecode.com/files/mod_pywebsocket-0.5.tar.gz
# tar zxf mod_pywebsocket-0.5.tar.gz
# cd pywebsocket-0.5/src
# python setup.py build
# python setup.py install
# python setup.py install
を実行した際にインストールされたディレクトリが出力されるのでメモを取る。今回は下記のディレクトリ。
/usr/lib/python2.4/site-packages/
python_mod_pywebsocket.confの作成
ファイルパス:/etc/httpd/conf.d/python_mod_pywebsocket.conf
ファイル内容
<IfModule python_module>
PythonPath “sys.path+[‘/usr/lib/python2.4/site-packages/’]”
PythonOption mod_pywebsocket.handler_root /var/www/html/wsh
PythonHeaderParserHandler mod_pywebsocket.headerparserhandler
</IfModule>
設定値の説明は下記の通り。
PythonPath “sys.path+[‘/usr/lib/python2.4/site-packages/’]”
pywebsocketがインストールされているディレクトリパス。
PythonOption mod_pywebsocket.handler_root /var/www/html/wsh
websocketハンドラを格納されているディレクトリ
pywebsocketの反映
インストールしたpywebsocketを反映させる為にapacheを再起動する。
# /etc/init.d/httpd restart
サンプルの配置・動作確認
上記でダウンロードしたpywebsocketにはサンプルが含まれているので、それが正常に動作するか動作確認を行う。
サンプルの配置
# cd pywebsocket-0.5/src/example
# cp echo_wsh.py /var/www/html/wsh/
動作確認
# python echo_client.py -s localhost -r /echo
Send: Hello
Recv: Hello
Send: 日本
Recv: 日本
Closing handshake
# python echo_client.py -s localhost -r /echo -m ‘hoge’,’foo’
Send: hoge
Recv: hoge
Send: foo
Recv: foo
Closing handshake
補足
websocketハンドラファイルの命名規則
PythonOption mod_pywebsocket.handler_root /var/www/html/wsh
上記で設定したmod_pywebsocket.handler_rootから下記のような命名規則でハンドラが実行されます。
[{ディレクトリパス}]{リソース名}_wsh.py
サンプル
アクセスURI:ws://localhost:80/echo
実行されるハンドラパス:/var/www/html/wsh/echo_wsh.py
アクセスURI:ws://localhost:80/chat/echo
実行されるハンドラパス:/var/www/html/wsh/chat/echo_wsh.py