2009年12月23日

apache + web sockets (pywebsocket) tips #0

apache + mod_pywebsocketで web socket環境を作ってみて、現状気づいた点を列挙します。

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分おきに送信すると、ブラウザ開きっぱなしでも、コネクションがクローズされない。

人気ブログランキングへ
kotesaki at 14:58│Comments(0)TrackBack(0)clip!

トラックバックURL

この記事にコメントする

名前:
URL:
  情報を記憶: 評価: 顔