2009年12月23日
apache + web sockets (pywebsocket) tips #0
apache + mod_pywebsocketで web socket環境を作ってみて、現状気づいた点を列挙します。
(既定値は300秒:extra/httpd-default.conf の Timeout)
人気ブログランキングへ
mod_pywebsocket関連のメモ
mod_pywebsocketのコードをざっと見てみて、メモっておいたほうが良いなと思った所をピックアップ
pywebsocketのrequestオブジェクトに含まれるプロパティ
ws_location
( wsのURI )
ws_origin
(referrerをイメージするとわかりやすい wsをコールしているサイトのURIが
http://foo/bar/であれば、 http://foo)
ws_protocol
(? : 現状だと、NULL)
ws_resource
(resource名、ws://foo/barであれば /bar がリソース名)
pywebsocketのfunction
web_socket_do_extra_handshake(request)
ヘッダなどがvalidateされた後にcallされる関数
これを pass すると、クライアントに connection ok のメッセージが
投げられる。(raise すれば、closeできる)
web_socket_transfer_data(request)
do_extra_handshake実行後にcallされる関数
web socketのmain関数に相当?
return すると socket closeされる。
<string> = msgutil.receive_message(request : request)
クライアントからのメッセージを受信
msgutil.send_message(request : request, message : string)
クライアントにメッセージを送る
Origin checkについて
request.ws_originで、オリジンのURLを取得可能。
例えば、ソースのページが http://localhost/websocket であれば
.ws_origin = 'http://localhost'となる。
web_socket_do_extra_handshake(request)内で、このws_originをチェックするのが
セキュリティ的なマナー。ルールに合わない場合は 例外を起こせば良い。
例えば、
def web_socket_do_extra_handshake(request):
if request.ws_origin != 'http://localhost':
raise "ws_origin error "+request.ws_origin
pass # if origin is acceptable.
とすると、localhost以外からは、wsはアクセスできなくなる。
apache設定の注意点
apache+mod_pywebsocketの注意点
conf/extra/httpd-default.confで、
KeepAlive Off
を設定する(デフォルトはOn)。
※ httpd.confで、Include httpd-default.conf のコメントアウトも外すこと
これをやらないと、"Goodbye"を送ってもコネクションクローズ処理にdelayが発生する。
#apache が、HTTP/1.1 のpersistent-connectionにより、ソケットを
#しばらく開放しないため。
Delay timeは、extra/httpd-default.confの
KeepAliveTimeout 5
で規程
jsコーディング時の注意点
heartbeat
websocketでconnect後、何も送信しないとapache側の Timeout で強制的にwsがクローズされてしまう。(既定値は300秒:extra/httpd-default.conf の Timeout)
これを回避するために、javascript側でheatbeatを例えば1分おきに送信すると、ブラウザ開きっぱなしでも、コネクションがクローズされない。
