2010-02-16

iw.rotatezlogs

通常は、Zope/PloneはApacheと同様に KILL -HUPなどでログをローテートしないといけません。
Windows版のPlone2.1x を使っていたころは、WindowsのサービスをKill hup するような方法がわからなかったので、rotatezlogs というZope専用のプロダクトを利用していました。

現在は、ベースのOSをCentOSに切り替えているので、/etc/logrotate.d/ 以下に設定を追加すれば良いのですが、zopecrl logreopen がどうもうまく動いてくれません…。 (ただいま調査中)

どうしたら良いものかと思っていたところ、iw.rotatezlogs というPlone3対応のものが出ていたので、今回もその方法に頼ることにしました。


  • Package:  iw.rotatezlogs
  • easy_install で追加しています。(buildoutだと、依存関係で失敗した場合、設定ファイルが消えたり、全体に影響が出てしまうため)
    • easy_install iw.rotatezlogs で Pythonのsite_pakages に追加。
    • zope.conf に 設定追加。
    • 私の場合は、/var/log/zope に 1MBで6世代ローテートします。(このへんはオプションで設定できます)

    ※iw.rotatezlogsは、ログの指定はサイズ指定なので、Dailyでのローテートは出来ません。ですが、形式を指定したアーカイブオプションなどがあり、機能としては十分かなと思います。

    設定は以下のような感じになります。

    <eventlog>
    level INFO
    # zopeのデフォルト
    # <logfile>
    # path /var/log/zope/instance.log
    # level INFO
    # </logfile>

    <rotatelogfile>
    # Required parameters
    # -------------------
    path /var/log/zope/instance.log
    # 1MBごとに過去5世代まで
    max-bytes 1MB
    backup-count 5

    # Optional parameters
    # -------------------
    # compression zip
    # format ------\n%(asctime)s %(levelname)s %(name)s %(message)s
    </rotatelogfile>
    </eventlog>

    <logger access>
    level WARN
    # zopeのデフォルト
    # <logfile>
    # path /var/log/zope/instance-Z2.log
    # format %(message)s
    # </logfile>
    <rotatelogfile>
    # Required parameters
    # -------------------
    path /var/log/zope/instance-Z2.log
    # 1MBごとに過去5世代まで
    max-bytes 1MB
    backup-count 5

    # Optional parameters
    # -------------------
    # compression zip
    # format ------\n%(asctime)s %(levelname)s %(name)s %(message)s
    </rotatelogfile>
    </logger>


    ところで、ログのローテートの指定は、zope.conf上になるので、何も指定しないとbuildoutを実行した場合はzope.confが更新されてしまい、せっかく書いた設定も消えてしまいます。うっかりbuildoutしたのを忘れてしまい、Zopeを再起動させると、ログのローテートが無効になってしまうので、気がついたらログが数十MBになっていました。

    これは困ったな~と思っていたら、幸いにも buildoutで設定できるというBlogを発見!



    * How to add rotatezlogs in your buildout ( http://tarekziade.wordpress.com/2008/03/02/how-to-add-rotatezlogs-in-your-buildout/ )



    以下のような感じで、buildout.cfgに指定すれば、zope.confに書き出してくれます。



    [instance]

    ...

    event-log-custom =
    %import iw.rotatezlogs
    <rotatelogfile>
    path ${buildout:folder}/var/log/instance.log
    max-bytes 1MB
    backup-count 5
    </rotatelogfile>

    access-log-custom =
    %import iw.rotatezlogs
    <rotatelogfile>
    path ${buildout:folder}/var/log/instance-Z2.log
    max-bytes 1MB
    backup-count 5
    </rotatelogfile>



    ということで、これでだいぶ助かりました。

    buildout.cfgで、ずいぶんいろんな設定ができるものだと感心しきりです。まだまだ便利な使い方があるので、もっとうまく利用できるようにしたいなと思います。

    2010-02-04

    SetEnvIf を使うんだけど…。

    Ploneで公開しているコンテンツについて、アクセス元のIPをチェックして、アクセス制限を行ったり、ドキュメントルートに割り当てるパスを調整しようと思いました。

    ただし、アクセス元は、Proxyを経由してくるので、環境変数の HTTP_X_FORWARDED_FOR を見て判断することにしました。

    動作確認として、SetEnvIf 条件 環境変数 –> で、Options Deny,Allow を利用して試すことに。

    環境変数は、PerlのCGIを使ってチェック。

    #!/usr/bin/perl

    print "Content-type: text/plain\n\n";
    foreach $var (sort(keys(%ENV))) {
        $val = $ENV{$var};
        $val =~ s|\n|\\n|g;
        $val =~ s|"|\\"|g;
        print "${var}=\"${val}\"\n";
    }

    上記のコードで拾った HTTP_X_FORWARDED_FOR を元にhttpd.conf を調整したのですが、どうも思ったように動きません…。

    # Access Control From Source IP
     
    SetEnvIf HTTP_X_FORWARDED_FOR xx\.xx\.xx check

    Order deny,allow
    deny from all
    allow from env=check
    Deny from all

    なにやら、許可されるべきIPなのに、どうやってもアクセスがブロックされてしまいます…(x_x)

    仕方がないから、mod_perlでPerlAccessHandlerまで書かないといけないの??とまで考えたのですが、ちょっと調べたら、出てきました、その答えが…。

    SetEnvIf X-Forwarded-For xx\.xx\.xx check 

    こうしないといけないんですね…。

    逆に、RewriteCond の場合は、RewriteCond %{HTTP:X-Forwarded-For} という具合に指定しないといけないそう。

    うーん、勉強になりました…。

    2010-02-01

    blobstorageの中身

    Ploneのblobstorageの中身は、ファイルシステム上からは何がなんだかわかりません…。

    それでも、実際の本体のファイルはどういうドキュメントなのかくらいは見当がついて欲しいこの頃。

    そう思っていたら、Twitter経由でこんなふうにコマンドでチェックするといいよ、という書き込みを発見しました。

    # find /var/blobstorage -type f 

    やってみると、なるほど、とりあえず *.blob というファイル本体だけは、きちんと取得できました。

    fileコマンドと組み合わせると、もうちょっとわかりやすくなりました。

    # find /var/blobstorage -type f  -ls -exec file {} \;

    …0x0380724.blob: Microsoft Office Document
    …/0x03f07855.blob: PDF document, version 1.4
    …/0x03816348bb.blob: Zip archive data, at least v2.0 to extract

    なんとかOSからファイル名がわかるような仕組みだとうれしいのですが、やはりReflectoとか、FSSを使うほうが良いんでしょうか。