完全にチラシの裏になることをお許しください。自分用メモを書くWikiが壊れた時のメモを、そのWiki自体に書いといても次回参照出来ないのです!
さて、MoinMoin というのはPythonで書かれたWikiのことです。
先日、Debianをアップデートしたら wiki の当該ページで503が出るようになりました。そこそこ一般性のありそうな内容ではあるので、メモっときます。
Debian wheezy で debian_version は 7.1。2013-06-27時点での作業記録ですので、後々の人はこのドキュメントをそういう視点で見てください。
エラー、1つ目。write パーミッションが剥がれる。
ログはこちら
[Thu Jun 27 14:54:34 2013] [error] IOError: [Errno 13] Permission denied: '/usr/share/moin/data/event-log'
これは私のミスとも言えるのかも。/usr/share/moin 下にデータを全部置くよう設定を書いておいた状態で、おそらくはパッケージのアップデート中に当該ファイルのパーミッションが変わってしまったんでしょう。実際、所有者が (www-dataではなく) root:root になっていました。
# 真面目にやるなら、具体的に何のアップデートパスでそうなったのか知るべきですが、ちょっと置いておきます。言い訳として、パーミッションの弱い方向にではなく安全方向に倒れていたので、まぁこれは悪意のある何かではないと期待してます。確証はない。
MoinMoinは適切に設定するなら、 /opt 下などに(moinの) data/ ディレクトリ等を置いておくのが正しいと思われます。下記のサイトに記載されている感じで設定しなおすことにしました。data/, underlay/ の移動が重要。ちょっと古いので、色々中身を理解しながらですが……
上記の設定では、cgi なファイルを介してMoinMoin を実行することを前提にしてますが、現在の設定では wsgi を使うのが普通ですので、cgi をコピるあたりの説明については無視します。wsgiって何。
なお、後述しますが、上記のサイトの説明の通りに /opt/wiki 下に wikiconfig.py 等を置くのもやめて /etc/moin に静的な設定ファイルを置いて設定ファイルをシステム全体で一本化しておくのがDebian流儀っぽいです。動的なファイルだけ /opt 下に置きましょう。
あと、パーミッションに関連する変更は忘れないように。/opt/wiki 配下のデータは概ね www-dataからは読めて書ける必要があります。
# 他のセキュリティ機構 (AppArmor, SELinux) が有効になってたら話はさらに面倒ですね
エラー、2つ目
[Thu Jun 27 15:27:27 2013] [error] [client 142.4.213.26] File "\xe3\x83\x95\xe3\x83\xad\xe3\x83\xb3\xe3\x83\x88\xe3\x83\x9a\xe3\x83\xbc\xe3\x82\xb8", line 2, in <module>
[Thu Jun 27 15:27:27 2013] [error] [client 142.4.213.26] TypeError: 'dict' object is not callable
怪しい文字列は UTF-8 で「フロントページ」のことです。なんで dict に対して exec しかけんだこの子。
これは、エラーメッセージの詳細はどうでもよく、どうやらPythonのバージョンアップ時に結果としてMoinMoin 側で発生する問題らしいです。
対策は moin コマンドで対象モジュールのキャッシュをクリアすることです。以下のサイトの通り。
moin --config-dir=/var/www/wiki --wiki-url=wiki.example.com/XXX maint cleancache
今回は /opt/wiki 下を config-dir の対象にすれば良いです。
なお、 moin コマンドは、暗黙にMoinMoinの各種 設定ファイル (wikiconfig.py, farmconfig.pyとか) が /etc/moin 下にあることを前提にしてます。
> cat `which moin`
#! /usr/bin/python
import sys
sys.path.insert(0, '/etc/moin')
from MoinMoin.script.moin import run
run()
/opt/wiki 下に wikiconfig.py とかを置いておいても /etc/moin 下の設定ファイルを読み込んでエラーを出しますので、静的な設定ファイルを /etc/moin/ 下に読み込み専用の設定ファイルを全部置くか、symlink等で対策を取るかしたほうが良い気がします。
もしかすると、パッケージアップデート時に /etc/moin 下の設定ファイルを元に色々やった結果として上のような問題が発生した可能性もありますなぁ。