tornadoでWebSocketサーバを動かしてみる

Tornado で HTTP サーバを用意 HTML ファイルの JS が WebSocket サーバと通信 ブラウザでこの HTML ファイルを表示。 WebSocket クライアントが WebSocket サーバにメッセージを送信すると、HTML が書き換わる というようなシナリオを実現するシンプルなデモを作ってみました。 WebSocket Server サーバには表題の通り Python Tornado を利用します。 パッケージのインストール Tornado のビルドには Python のヘッダーファイルが必要です。 以下は RedHat 系でのインストール例です。 コード クラス Tornado.websocket.WebSocketHandler を継承して WebSocket サーバを実装します。 WebSocket サーバがメッセージを受け取ると、 on_messege ハンドラーが呼びだされます。 HTML/JS ファイル WebSocket 用の JavaScript は HTML ファイル内にベタッと書きます。 WebSocket クライアント送信されたメッセージは の箇所に反映されます。 WebSocketContinue reading “tornadoでWebSocketサーバを動かしてみる”

[nginx]ホスト名に応じてレスポンスするファイルを振り分ける

nginx には ngx_http_map_module というハッシュテーブルを操作するモジュールがあり、リクエストヘッダーのホストやユーザーエージェントをキーと見立てて値を振り分けることができる。 このモジュールを使うと、複数のサブドメインをさばいていている時に、robots.txt のような各ドメインに必要なファイルをサブドメインに応じて振り分ける。 ngx_http_map_module の使い方 単純な例 まずは map を使った単純な例から これを Python っぽく置き換えると というように key-value ペアをまず定義し、リクエスト処理時に というようにリクエストヘッダーの http_user_agent をキーに値を取得する。 map の発展的な使い方 重複定義 というように、同じ変数($http_user_agent) に対して複数の map 変数($foo, $bar) を定義できる Key-Valueをファイル管理 Key-Value のペアはファイル管理して include しても良い パターンマッチング map の キーのパターンマッチングは prefix match(“*.example.com”) suffix match(“mail.*”) 前方一致の正規表現(~^www\.(?P.*)$ $domain) が使える サブドメインで robots.txt を振り分ける 最後にもともとのきっかけとなったサブドメイン別 robots.txt の振り分けをやってみる。 設定 以下のような nginx.confContinue reading “[nginx]ホスト名に応じてレスポンスするファイルを振り分ける”

cURLの出力結果をカスタマイズする

Chrome の Developer Tools→Network→Timing にはリソース取得の各ステップにかかる時間が俯瞰できるようになっていて、このデータへアクセスする JavaScript API も用意されている。 諸般の事情により、これと同等のデータを cURL を使ってコマンドラインから取得する方法をメモ。 というか、必要なことは次のブログにまとめられている Timing Details With cURL https://josephscott.org/archives/2011/10/timing-details-with-curl/ cURL デフォルトの出力 cURL デフォルトの表示は以下のようになる(レスポンスデータは -o オプションで /dev/null に捨てる) プログレスバーは -s/–silent オプションをつけると無効化できる。 出力のカスタマイズ 本題の出力メッセージのカスタマイズを行うには、フォーマットを記述したファイルを用意して -w/–write-out @format-file-name というオプションをつければ良い。 フォーマットの記述について 送受信の転送量やらHTTPレスポンスステータスやリダイレクト情報などいろいろな情報をとれるのだけど、Chrome にちかい指標は以下 time_namelookup : DNS Lookup タイム time_connect Initial : Connection / Connecting time_appconnect : SSL ハンドシェイク time_starttransfer : Time ToContinue reading “cURLの出力結果をカスタマイズする”

VarnishをHTTP サーバとして使ってみる

特定の URL へのリクエストに対して、Varnish が オリジンに問い合わせることなく、HTTP ステータス 200 で固定メッセージを返す設定を Varnish 3/4 向けにメモ。 これを実現するための基本的なアイデアは、HTTP リクエストのエラー処理で利用する error(Varnish 3)/synth(Varnish 4) を 2XX のような正常系 HTTP レスポンスステータスでも利用すること。 ゴール http://HOST/ping で始まる URL へのリクエストに対して、 200 番で Pong のメッセージを返す http://HOST/wrong-target で始まる URL へのリクエストに対して、 301 番で http://www.example.com/correct-target へリダイレクトする Varnish 3 向け設定 error code reason でサブルーチン vcl_error に飛ばし、vcl_error ではステータスに応じてレスポンスを書き換える。 メッセージボディーは synthetic を使う Varnish 3 向けの設定はWeb上にサンプルがたくさん転がっているので、それほど悩まなくて済むはず。 エラーメージの生成は次のリンクが参考になるContinue reading “VarnishをHTTP サーバとして使ってみる”

curl –resolveでコマンドラインから名前解決する

HTTP サーバに名前ベースのバーチャルホスト設定がされていて、設定されているホスト名でアクセスしたい場合は Host ヘッダーを渡せばOK IP アドレス 10.0.1.2 に http://www.example.com のホストでアクセスするときには以下のようにする。 curl wget telnet リクエストURLのホストをゴニョゴニョする処理が入っている場合、上の手順ではまずい。 そのため hosts ファイルを書き換えて、ローカルで名前解決させて本来のホスト名でアクセスすることが多々ある。 curl は、このような用途のために –resolve オプションが用意されている。 たとえば hosts ファイルに と書いて、 $ curl http://www.example.com とアクセスするかわりに とすればよい。 –resolve <host:port:address> Provide a custom address for a specific host and port pair. Using this, you can make the curl requests(s) use a specified address andContinue reading “curl –resolveでコマンドラインから名前解決する”

HTTPでエンコーディングしていないコンテンツを要求

Chrome の場合、 リクエストヘッダーの Accept-encoding は accept-encoding: gzip,deflate,sdch というようになっていて、サーバには圧縮コンテンツを要求している 深淵な理由により、Web サーバにエンコーディングしていないコンテンツを要求したい場合は、 “Accept-Encoding” の値を “identity” にするか、ブランクにすると良い。 RFC 2616 : Hypertext Transfer Protocol — HTTP/1.1 を確認すると 3.5 Content Codings … identity The default (identity) encoding; the use of no transformation whatsoever. This content-coding is used only in the Accept- Encoding header, and SHOULD NOT be used in theContinue reading “HTTPでエンコーディングしていないコンテンツを要求”

レスポンスヘッダーのExpires: -1って何?

http://www.amazon.co.jp のレスポンスヘッダーを眺めていると Expires: -1 という不思議な Expire Date が設定されていた。 意味を調べてみた。 Expires レスポンスヘッダー Expires はキャッシュの期限切れ日時を指定 Expires ヘッダーはコンテンツキャッシュの期限をコントロールし、 HTTP 1.0 から存在している。 RFC 2616 “Hypertext Transfer Protocol — HTTP/1.1” では次のように書かれている The Expires entity-header field gives the date/time after which the response is considered stale. http://tools.ietf.org/html/rfc2616#section-14.21 expiration time は HTTP-Date 形式(rfc1123-date | rfc850-date | asctime-date)でかく。 例) Expires: Thu, 01 DecContinue reading “レスポンスヘッダーのExpires: -1って何?”

pagespeed(1)ngx_pagespeedをnginxにインストール

通信速度が遅い端末からもストレスなくサイト閲覧できるようにするために、サーバ側の処理をはやくするだけでなく転送量も削減したいなぁということで、 Google の PageSpeed をインストールしてみた。 PageSpeed PageSpeed は CSS/JavaScript/画像の最適化 キャッシュコントロール 遅延ロード など、クライアントブラウザ視点でパフォーマンスが改善される数々のベストプラクティスを Apache/nginx モジュールとして提供されている。 ドキュメント モジュールのマニュアルがかなり充実しているので、関係のありそうなところはざっと目を通したほうが良い。 Apache と nginx の説明が並んで書かれているので、ちょっと紛らわしい。 https://developers.google.com/speed/pagespeed/module/using 次の2つもためになるけど量が膨大。 https://developers.google.com/speed/articles/ https://developers.google.com/speed/docs/best-practices/rules_intro トラフィックをさばききれなくて夜も寝れない人は「急がば回れ」で読んだほうがいいだろうけれども、チューニングがそれほど深刻でなければつまみ食いで良いかと。 1時間の動画でも気にならないという人は、次の開発者による解説を参照 Build ngx_pagespeed From Source Apache の場合、ダイナミックリンクできるので mod_pagespeed パッケージをインストールするだけ。 手順は次の URL を参照 https://developers.google.com/speed/pagespeed/module/download 今回は Ubuntu 12.04 64bit の nginx に ngx_pagespeed をインストール。 Apache と違いダイナミックリンクはできないので、ソースコードからコンパイルする。 手順は次の URL を参照 https://developers.google.com/speed/pagespeed/module/build_ngx_pagespeed_from_source ビルドに必要なパッケージをインストール ソースコードを取得してコンパイルContinue reading “pagespeed(1)ngx_pagespeedをnginxにインストール”

VarnishでランダムなTTLを設定

Varnish でキャッシュされていないページにクライアントからアクセスがあると、HTMLだけでなく、そのページを構成する画像その他のリソースも当然一緒にリクエストされる。 もし、要求されたページの多くがキャッシュされておらず、同じTTLが設定されていたとすると、expire 後のアクセスでは同時に各リソースがオリジンサーバにリクエストされてしまう。 同僚が「ttlをランダムにしたいよねー」と(物理的に)つぶやいていたので忙しい同僚に代わって調べた。 環境 OS Ubuntu 12.04 64 bit Varnish 3.0.4(公式レポジトリ提供) nginx/1.1.19(画像をサーブしているだけなので何でもよい) Varnishで乱数を生成 Varnish 標準の VMOD である vmod_std(VCL用ユーティリティ関数群) に含まれる rand 関数を利用すると乱数を生成できる。 rand(start, end) で start <= 乱数 <= end な実数をランダムに生成する。 擬似乱数の生成には drand48 を利用している。 対応するソースコードは lib/libvmod_std/vmod_stc.c 実体は短いのでコピペ。 乱数を使った TTL の設定 /etc/varnish/default.vcl の vcl_fetch で設定する。 vcl ファイルの先頭で std モジュールをインポート vcl_fetch 関数の中で URL が png にマッチする場合、1秒から60秒までの間で一様なContinue reading “VarnishでランダムなTTLを設定”

varnishstatの主要フィールドのメモ

HTTPアクセラレータの Varnish は varnishstat コマンドから varnishd の統計情報を取得できる。 キャッシュヒット率からマイナーなものまで収集出来る情報はたくさんあるけれども、その中でも重要そうな情報をメモ。 varnishstat の使い方 man page varnishstat コマンドの man(varnishstat – Varnish Cache statistics) 1秒間隔で top のように表示 更新間隔を5秒間隔に変更 -w で秒数を指定する。 更新せずに1回だけ表示 top コマンドのバッチモード(-b)に相当。出力結果を使いまわしたいときに利用。 4列表示され、左から順に Symbolic entry name Value Per-second average over process lifetime, or a period if the value can not be averaged Descriptive text 出力フィールドを指定 -f で指定する。 ワイルドカードの挙動は少し謎。 XMLContinue reading “varnishstatの主要フィールドのメモ”