トップ   編集 凍結解除 差分 バックアップ 添付 複製 名前変更 リロード   一覧 最終更新   ヘルプ   最終更新のRSS
 


動作確認ディストリビューション

mod_pywebsocketのインストール

ここではHTML5の仕様に盛り込まれる(はずの)機能であるWeb Sockets APIを実現するmod_pywebsocketのインストールを説明します。

完全にこのサイト=>「こてさきAjax:pywebsocketのインストール」にお世話になりました。(というかそのまんまです。ホントに申し訳ない。)

前提としてApache、python、python-devel、subvrersion(クライアント)が既にインストール済みの環境があることとします。

まず、関連パッケージをインストールします。

mod_pythonのインストール

# cd /usr/local/src
# wget http://ftp.riken.jp/net/apache/httpd/modpython/mod_python-3.3.1.tgz
# tar zxvf mod_python-3.3.1.tgz
# cd mod_python-3.3.1
# vi src/connobject.c

142行目あたり(イロイロなサイトを見てみると、この修正はmod_pythonのインストールのセオリーなのかも?)
!(b == APR_BRIGADE_SENTINEL(b) ||
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
!(b == APR_BRIGADE_SENTINEL(bb) ||

# ./configure --with-apxs=/usr/local/apache2/bin/apxs
# make
# make install

mod_pywebsocketのインストール

# cd /usr/local/src
# svn checkout http://pywebsocket.googlecode.com/svn/trunk/ pywebsocket
# cd pywebsocket/src
READMEファイルを確認
# cat README
---READMEの内容ココから---
Install this package by:
$ python setup.py build
$ sudo python setup.py install

Then read document by:
$ pydoc mod_pywebsocket
---READMEの内容ココまで---

READMEファイルに従ってインストールを進める
# python setup.py build
# python setup.py install

インストール中に以下のようなメッセージが表示されたので、今回の環境では「/usr/lib/python2.4/site-packages/mod_pywebsocket/」配下にmod_pywebsocketのライブラリがインストールされたようです。

running install
running build
running build_py
running install_lib
creating /usr/lib/python2.4/site-packages/mod_pywebsocket
copying build/lib/mod_pywebsocket/util.py -> /usr/lib/python2.4/site-packages/mod_pywebsocket
以下(ry

Apacheの設定ファイルの修正

# vi /usr/local/apache2/conf/httpd.conf

# Example:
# LoadModule foo_module modules/mod_foo.so
を参考に以下の行を追加
LoadModule python_module      modules/mod_python.so

# For type maps (negotiated resources):
#AddHandler type-map var
を参考に以下の行を追加
AddHandler mod_python .py

最下行に以下を追加(Apacheをソースからインストールしている場合の例)
Include conf/extra/mod_pywebsocket.conf

Apacheの設定ファイルの追加
/usr/local/src/pywebsocket/src/mod_pywebsocket/__init__.pyに設定方法が記載されてるので参考にするとよいでしょう。

# mkdir /usr/local/pywebsocket
# vi /usr/local/apache2/conf/extra/mod_pywebsocket.conf

<IfModule python_module>
  PythonPath "sys.path+['/usr/lib/python2.4/site-packages']" <===インストール時に表示された、インストール先のパスを記載する
  PythonOption mod_pywebsocket.handler_root /usr/local/pywebsocket
  PythonHeaderParserHandler mod_pywebsocket.headerparserhandler
</IfModule>

文法チェック

# /usr/local/apache2/bin/httpd -t
Syntax OK

Apacheの再起動

# service httpd restart
httpd を停止中:                                            [  OK  ]
httpd を起動中:                                            [  OK  ]

サーバー側のサンプルプログラム(Echoサーバー)の準備

# cp /usr/local/src/pywebsocket/src/example/echo_wsh.py /usr/local/pywebsocket

クライアント側のサンプルプログラムを実行(サーバー側にメッセージを送ると、サーバーがメッセージを返すというプログラム。デフォルトでは「Hello」、「日本」、「Goodbye」というメッセージを送信する)

# cd /usr/local/src/pywebsocket/src/example
# ./echo_client.py
Send: Hello
Recv: Hello
Send: 日本
Recv: 日本
Send: Goodbye
Recv: Goodbye

今度はメッセージ「Thank You」を送信して、返信されるか確認。

# ./echo_client.py -m 'Thank You'
Send: Thank You
Recv: Thank You
Send: Goodbye
Recv: Goodbye

今度はメッセージ「Take It Easy」、「Be All Right」を送信して、返信されるか確認。

# ./echo_client.py -m 'Take It Easy,Be All Right'
Send: Take It Easy
Recv: Take It Easy
Send: Be All Right
Recv: Be All Right
Send: Goodbye
Recv: Goodbye

接続先ホスト、ポート番号を指定して、返信されるか確認。

# ./echo_client.py -s www.lovebug.jp -p 80
Send: Hello
Recv: Hello
Send: 日本
Recv: 日本
Send: Goodbye
Recv: Goodbye

日本語を送信して、返信されるか確認したトコロ、どうやらダメっぽい。Pythonの文字コード問題は根が深そうなので、手が出せず。。。

# ./echo_client.py -m 'テストメッセージ'
Traceback (most recent call last):
  File "./echo_client.py", line 204, in ?
    main()
  File "./echo_client.py", line 200, in main
    EchoClient(options).run()
  File "./echo_client.py", line 111, in run
    frame = '\x00' + line.encode('utf-8') + '\xff'
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe3 in position 0: ordinal not in range(128)

Webベースのサンプルプログラムを試すために、以下のリポジトリをチェックアウト。

# cd /usr/local/src
# svn checkout http://websocket-sample.googlecode.com/svn/trunk/ websocket-sample-read-only
# cd websocket-sample-read-only
# cp html/pub/litechat.html /usr/local/pywebsocket
# cp python/pub/litechat/do_wsh.py /usr/local/pywebsocket
# cp python/pub/litechat/messages /usr/local/pywebsocket
# chmod 666 /usr/local/pywebsocket/messages

ブラウザから「http://PATH_TO:PORT_NO/litechat.html」にアクセスする。

「Web socket client sample」のページが表示されたら、「Resource」に「echo」と入力し、「connect」ボタンをクリックする。
「Echoサーバー」に接続できれば、メッセージを入力し「send」ボタンを押す事でメッセージが返ってくるはずです。
Web Sockets APIの特徴ですが、「connect」状態の場合、netstatコマンドで接続状態を確認すると、
接続を永続化するため、「ESTABLISHED」状態が持続されます。
通常のHTTPではリクエストしてレスポンスが返れば、すぐに「ESTABLISHED」ではなくなりますよね?

「Resource」に「do」と入力することで簡易チャットサーバーに接続できるはずですが、「closed」が表示されてしまい、今回の検証では正しく接続できませんでした。

Apacheのログを確認したトコロ、「mod_pywebsocket: No handler for: '/do'」、「File does not exist: /usr/local/pywebsocket/do」と出力されていたので、もしかしたら、Apacheの設定をマズってるかもしれません。
ただし、「echo_wsh.py」をコピーして「echo2_wsh.py」を作成し、「Resource」に「echo2」を指定すると正常に接続できるので、Apacheの設定ではないかも。。。


Last-modified: 2010-02-21 (日) 16:10:24 (3469d)