2010-01-27

Varnishのタイムアウト

慣れないながらも、Ploneのアクセラレータ用にVarnishを利用しています。

匿名アクセスの場合はそれなりに早いかな、と感じるようになりましたが、逆に、いろいろと「あれれ~?」な現象も出てきました。

コンテンツのCacheを行うことで、ユーザ側から見たパフォーマンスを改善するのが目的なので、当然古いデータが見えてしまったり、更新が即座には反映されなかったりします。

具体的には、このようなパターン。

  • 匿名アクセス、匿名でのコメントがOKなコンテンツに対し、匿名アクセスでコメントを行うと、ページを再読み込みしても投降したコメントが表示されない。
  • Varnishのメモリにキャッシュさせないといけないので、コンテンツの1回目の読み込みだけは時間がかかることがある。
    (誰かがすでに同じページにアクセスしていれば、その恩恵にあずかることはでるけれど)

また、わたしの環境の場合だけかもしれませんが、Ploneの更新情報(RSS)が、Varnishを通した場合、更新されなくなってしまいました。

具体的には、ブラウザからRSSの画面にアクセスして表示する場合は問題ないのですが、Thunderbirdに付属のRSSリーダーやSharpReaderなどの、専用のRSSリーダーは、最初の一回目のRSSの読み込み以降、その後の更新を検知してくれなくなってしまったのです…

Varnishは設定ファイルによって、メモリのキャッシュを返したり、バックエンドにリクエストを通したりという動作を振り分けるのですが、RSSリーダなどは匿名アクセス扱いになってしまいます。しかも、どういうわけか、Last-Modifiedもあまり認識してくれないようでした…。

仕方がないので、Ploneに限ってなのですが、末尾が “/RSS” というURLの場合は、varnish.vcl を調整して、Varnishのメモリを使わないようにしてみました。(赤字の部分です)


        if (req.http.Authenticate || req.http.Authorization) {
pass;
}



        # We only care about the "__ac.*" cookies, used for authentication
if (req.http.Cookie && req.http.Cookie ~ "__ac(|_(name|password|persistent))=") {
pass;
}

# File type that we will always cache
if (req.request == "GET" && req.url ~ "\.(gif|jpg|swf|css|js|png|jpg|jpeg|gif|png)$") {
lookup;
}

if (req.request == "POST") {
pipe;
}

# Added on 20091201 not to cache RSS info.
if (req.request == "GET" && req.url ~ "/RSS$") {
pipe;
}






もう一点困ったこと、というと、Ploneの管理画面にアクセスし、Indexの再構築などの重い処理を行うと、Zopeからのレスポンスが返ってくるまでに時間がかかり、Varnishがタイムアウトでエラーを起こすようになってしまう、ということでした。



また、片方で重い操作をしていて、別のユーザがPloneにアクセスした際にも、全体でパフォーマンスが落ちていると、Varnishがタイムアウトを起こしてしまいます。



この間隔が思ったよりも短く、何も設定しないでおくと、ユーザさんには、下記のような意味不明の恐ろしげなエラーが表示されてしまいます。





  • "Error 503 Service Unavailable Backend did not respond. Guru Meditation: XID: 456452130".




デフォルトではどうも短すぎるので、下記のURLを参考に、タイムアウトの値を調整してみることにしました。





といっても、以下のように1行加えただけ。







backend default {

        # Your Zope / Plone instance.


        .host = "localhost";


        .port = "8080";      
        .first_byte_timeout = 300s; #ここを追加

}





本当は、ZopeをZEO化して、重い処理は別プロセスで行って、参照専用のリクエストには影響がないように作りたいのですが、そこまでは、まだまだ…。

2010-01-12

リポジトリブラウズに、SVNIndexXSLTを利用する

Subversionのリポジトリへのアクセスは、当初はファイルサーバのfile://プロトコルからのアクセスがメインでした。

ですが、次第に利用するメンバが増えてきたことと、ネットワークの制限でファイルサーバにアクセスできない場合に困るということで、http(https)プロトコルを利用してアクセスできるように調整を進めています。

(http経由でのアクセスはApache + mod_dav/mod_dav_svn で設定できます)


さて、リポジトリへのアクセスは、TortoiseSVNやRedmineなどの専用クライアントを使うので、あんまり気にしなくてもいいのですが、たまにブラウザからもリポジトリを参照することがあります。(テキストファイルなどを眺める際は、ブラウザのほうが便利なので)

ただし、基本は素のmod_dav_svnを通しての表示なので、非常に味気ないものになってしまいます
例えに出しては申し訳ないのですが、Redmineのリポジトリなどもそう。

単純にファイル/ディレクトリの一覧が表示されるだけで、初めてリポジトリを使う人には、『なんじゃこりゃ~?』な気がするかもしれません。
使うにしても、ガイドも注意点などもなく、なんだか不親切です。

#別に見るだけなら専用のリポジトリブラウザ、ViewVCとかを使えば良いじゃないの、というご意見もあるかもしれませんが、そうなるとまた別途認証を用意しないといけません…。


ちょこちょこと調べたところ、SVNIndexXSLTというオプションを使えば、リポジトリ情報をXMLで生成し、Lokk&FeelはXSLTでカスタマイズできることがわかりました。単純にブラウザで表示する以外にも、http経由でXMLでデータを取得することができると、何かと便利です。

TortoiseSVNのマニュアルにサンプルがありましたので、いろいろカスタマイズしてみました。
リポジトリのチェックアウト用のアイコンをクリックすると、TortoiseSVNが起動する仕掛けも入っています。(マーカーで囲んだ部分)

キャプチャ2

[ 補足 ]

このXMLのオプションですが、svnコマンドでも、—xml というオプションをつけると、XMLでアクセスできるようですね。

たとえば、こんな感じ。

svn list --xml http://redmine.rubyforge.org/svn/

上記のようにすると、XMLでリポジトリ情報が取得できます。svn log, svn infoなども同じ。

Redmineのソースをよく見ると、リポジトリへのアクセスは、svnコマンドを通して行っています。また、一覧取得には、やっぱり “—xml” オプションを使っています。該当するのは、{REDMINE_ROOT}/lib/redmine/scm/adapters/subversion_adapter.rb の、このあたり。

# Get info about the svn repository
def info
  cmd = "#{SVN_BIN} info --xml #{target('')}"  # <- ここ。 
  cmd << credentials_string
  info = nil
    ..................
end

なるほど…。


でも、やっぱりコミットログや、Authorなどの属性は表示されるわけではないので、あくまでも補助的なものになりますね。

2010-01-07

Ploneおぼえがき

取り急ぎ、メモ。(ちゃんとした記事でなく、自分用..。)

Ploneをbuildoutして、プロダクトの追加を行ったら、以下のようなエラーが出てインスタンスが起動してくれませんでした。

ConfigurationExecutionError: zope.component.interfaces.ComponentLookupError: (<InterfaceClass zope.security.interfaces.IPermission>, 'plone.app.portlets.ManageOwnPortlets')
  in:
  File "/usr/local/Plone3.3.2/buildout-cache/eggs/collective.portlet.feedmixer-1.4-py2.4.egg/collective/portlet/feedmixer/configure.zcml", line 30.4-37.10
      <plone:portlet
          name="collective.portlet.feedmixer.FeedMixer"
          interface=".portlet.IFeedMixer"
          assignment=".portlet.Assignment"
          renderer=".portlet.Renderer"
          addview=".portlet.AddForm"
          editview=".portlet.EditForm"
          />

なにやら、セキュリティのパーミッションでのエラーらしい。

とりいそぎ、上記のエラーに出ていたプロダクトのconfigure.zcml を修正しました。

具体的には、以下の一行を追加するだけ。

<include package="plone.app.portlets" />

これだけでとりあえず済んでよかった….

#なぜこの方法がわかったのか、ちょっと忘れてしまいましたが、いろいろとエラーが出なかったバージョンのzcmlを参照しまくったような気が…。

2010-01-05

TortoiseSVNのインストール / 設定

Subversion関係の話題はネットにはたくさんありますので、わたしが書くまでも無いのですが、Redmineを使っている関係でSubversionにはお世話になりっぱなしです。また、PerlやRubyといったスクリプト言語だけでなく、VisualStudioで開発している .NETのコードも、Subversionで管理したりしています。この関係で、いくつか覚書のようなものを書いていこうと思います…。

TortoiseSVNインストール

Windowsのインストーラーをダウンロードしてインストール、その後に日本語化パックを適用させます。

ダウンロードサイト: http://tortoisesvn.net/downloads

  1. “Download Application”から、最新版(Installer)を選択します。
  2. “Language packs”から、JapaneseのSetupを選択します。
  3. Installerを起動してインストールします。完了すると、OSの再起動を促されます。(再起動しないと完全に設定が反映されないという意味なので、すぐにTortoiseSVNを使いたいというのでなければ、あわてて再起動しなくても大丈夫…)
  4. 続けて、日本語化パック(上記の2)をインストールします。

TortoiseSVNはシェル拡張なので、インストールしても、直後にアプリケーションが起動する、というものではないのでご注意。

まず、ウインドウの適当な場所で右クリックします。カメのアイコンとともに”TortoiseSVN”というメニューが出ますので、TortoiseSVN –> Settings という順で選択すると、設定画面が表示されます。

 TortoiseSVNの日本語設定

"General"から、”Language”の設定で言語を切り替えれば、日本語メニューでの利用ができるようになります。

コマンドラインからの利用

TortoiseSVNは、基本はGUIでの操作になります。

ですが、バッチ操作を行いたい場合、コマンドラインから操作できるほうが便利だったりします。Subversionのコマンドライン操作には、svn.exe という、一番シンプルなコマンドライン専用インタフェースがありますが、TortoiseSVNには含まれていません。でも、『TortoiseSVNとsvn.exeを両方入れないとだめなの?』かというと、そうでもありません。

TortoiseSVNは、TortoiseProc.exe というプログラムを通して操作できます。

 

TortoiseSVNをインストールすると、TortoiseProc.exeへのパスが通るはずなので、適当にcmd.exeでプロンプトを開いて、以下のような感じで実行できます。

たとえば、Redmineのconfig(trunk)のディレクトリ一式をエクスポートする場合は、以下のようになります。

C:\Users\akiko>TortoiseProc /command:export /url:"http://redmine.rubyforge.org/svn/trunk/config" /path:C:\Temp\config /closeend

*.batなどのファイルを書けば、ジョブでsvn.exeを使うのと同じように、updateやcommitを行うことができます。