さくらインターネットのTracが動かなくなっていた件

急にさくらインターネットに入れてるTracが動かなくなった。
本日すでにがんばって2週間目くらい。泣

現象

ブラウザからアクセスすると、Internal Server Errorで何が原因かもわからず。
とりあえずバックアップだけでも取ろうと

$ trac-admin /path/to/trac hotcopy trac.dmp 

すると、Segmentation faultというメッセージのみ。
という感じで何が原因か全くわからず。

問題点1 python2.4 -> 2.5

さくらインターネットpythonのバージョンを2.4から2.5にあげていたことが発覚。
それに伴い、python2.5で全てコンパイルし直したけどダメ。。。

問題点2 OSのバージョンアップ FreeBSD7.1へ

いろいろ触っているとどうもsqliteのモジュールをインポートするところでこけている様子。
以下のようなエラーも出ているし。

$ /usr/local/bin/sqlite3 -version
/libexec/ld-elf.so.1: /usr/local/lib/compat/libpthread.so.2: Undefined symbol "__malloc_lock"

ってこれさくらインターネットせいやん、と思ってサポートへメールをしたところ、OSのバージョンアップが発覚。

▼[2009年4月13日-4月17日] [OSバージョンアップ]さくらのレンタルサーバ スタンダード、プレミアム
http://support.sakura.ad.jp/page/news/20090406-011.news

原因はというと、ローカルディレクトリにsqlite3をインストールしていて、それが古いOSのライブラリを参照していたからっぽい。
ということでローカルのsqlite3をコンパイルしなおしたら直った。
(なぜローカルの$HOME/local/bin/sqlite3をコンパイルし直すと/usr/local/bin/sqlite3のエラーが直るのかはちょっとよくわからん。共有ライブラリ??)
これで直ったか、と思ったら以前としてSegmentation fault...

問題の切り分け

trac0.11.4-jaをインストール

とりあえず、バージョンアップしてみる
準備として、$HOME/local/lib/pythonシンボリックリンクを張りなおす。

$ rm ~/local/lib/python
$ mkdir ~/local/lib/python2.5
$ ln -s ~/local/lib/python2.5/ ~/local/lib/python

で、インストール。

$ wget http://www.i-act.co.jp/project/products/downloads/Trac-0.11.4.ja1.zip
$ unzip Trac-0.11.4.ja1.zip
$ wget http://peak.telecommunity.com/dist/ez_setup.py
$ python ez_setup.py --prefix=$HOME/local
$ cd Trac-0.11.4.ja1
$ python setup.py install --prefix=$HOME/local
$ trac-admin /path/to/trac upgrade
$ trac-admin /path/to/trac wiki upgrade

ちょっともう忘れかけですが、下記注意。

  • setuptoolsをインストールするため、ez_setup.pyを実行
  • genshiは勝手にインストールされる
  • trac-adminが~/local/lib/python/にインストールされるためパスを通すこと

ブラウザからアクセスすると、、、ダメだった。
こうなるとどうもライブラリ関係が悪い気がしてならない。
でもtrac-adminは使えるようになったので、バックアップだけ取得。

pyexpatが悪い??

こんな記事があったので試してみる。
とはいえ、さくらインターネットではapacheがどのライブラリを使用しているかは確認できない。
でもたぶん/usr/local/lib/libexpat.soを使用しているんだと思う。

$ strings /usr/local/lib/libexpat.so | grep expat_
expat_2.0.1
$ python
Python 2.5.2 (r252:60911, Feb  2 2009, 19:00:18) 
[GCC 4.2.1 20070719  [FreeBSD]] on freebsd7
Type "help", "copyright", "credits" or "license" for more information.
>>> import pyexpat
>>> pyexpat.version_info
(2, 0, 0)

うーん確かに違う。

$ LD_PRELOAD=/usr/local/lib/libexpat.so python
Python 2.5.2 (r252:60911, Feb  2 2009, 19:00:18) 
[GCC 4.2.1 20070719  [FreeBSD]] on freebsd7
Type "help", "copyright", "credits" or "license" for more information.
>>> import pyexpat
>>> pyexpat.version_info
(2, 0, 0)

え、、、LD_PRELOAD効いてないんですけど。笑
よくわからん。。。

genshiをzipでインストールしたらダメ?

ココにはgenshiがダメだとか。

$ rm ~/local/lib/python/site-packages/Genshi-0.5.1-py2.5-freebsd-7.1-RELEASE-p4-i386.egg
$ sudo easy_install --always-unzip Genshi==0.5

はいはい、でもダメ。
もうやけになってきた。

同じ現象の人発見!!

ココに全く同じ現象に出くわしている人がいた。
エラーメッセージは違うけど。

$ sh ~/www/trac.cgi 
'SERVER_PORT'
Traceback (most recent call last):
  File "/home/hoge/www/trac_.cgi", line 20, in <module>
    cgi_frontend.run()
  File "/home/hoge/local/lib/python2.5/site-packages/Trac-0.11.4.ja1-py2.5.egg/trac/web/cgi_frontend.py", line 71, in run
    gateway.run(dispatch_request)
  File "/home/hoge/local/lib/python2.5/site-packages/Trac-0.11.4.ja1-py2.5.egg/trac/web/wsgi.py", line 87, in run
    response = application(self.environ, self._start_response)
  File "/home/hoge/local/lib/python2.5/site-packages/Trac-0.11.4.ja1-py2.5.egg/trac/web/main.py", line 404, in dispatch_request
    req = Request(environ, start_response)
  File "/home/hoge/local/lib/python/site-packages/Trac-0.11.4.ja1-py2.5.egg/trac/web/api.py", line 186, in __init__
    self.base_url = self._reconstruct_url()
  File "/home/hoge/local/lib/python/site-packages/Trac-0.11.4.ja1-py2.5.egg/trac/web/api.py", line 541, in _reconstruct_url
    if self.server_port and self.server_port != default_port[self.scheme]:
  File "/home/hoge/local/lib/python/site-packages/Trac-0.11.4.ja1-py2.5.egg/trac/web/api.py", line 223, in <lambda>
    server_port = property(fget=lambda self: int(os.environ['SERVER_PORT']),
  File "/usr/local/lib/python2.5/UserDict.py", line 22, in __getitem__
    raise KeyError(key)
KeyError: 'SERVER_PORT'
Status: 500 Internal Server Error
Content-Type: text/plain

Oops...

Trac detected an internal error: 'SERVER_PORT'

Traceback (most recent call last):
  File "/home/hoge/www/trac_.cgi", line 20, in <module>
    cgi_frontend.run()
  File "/home/hoge/local/lib/python2.5/site-packages/Trac-0.11.4.ja1-py2.5.egg/trac/web/cgi_frontend.py", line 71, in run
    gateway.run(dispatch_request)
  File "/home/hoge/local/lib/python2.5/site-packages/Trac-0.11.4.ja1-py2.5.egg/trac/web/wsgi.py", line 87, in run
    response = application(self.environ, self._start_response)
  File "/home/hoge/local/lib/python2.5/site-packages/Trac-0.11.4.ja1-py2.5.egg/trac/web/main.py", line 404, in dispatch_request
    req = Request(environ, start_response)
  File "/home/hoge/local/lib/python/site-packages/Trac-0.11.4.ja1-py2.5.egg/trac/web/api.py", line 186, in __init__
    self.base_url = self._reconstruct_url()
  File "/home/hoge/local/lib/python/site-packages/Trac-0.11.4.ja1-py2.5.egg/trac/web/api.py", line 541, in _reconstruct_url
    if self.server_port and self.server_port != default_port[self.scheme]:
  File "/home/hoge/local/lib/python/site-packages/Trac-0.11.4.ja1-py2.5.egg/trac/web/api.py", line 223, in <lambda>
    server_port = property(fget=lambda self: int(os.environ['SERVER_PORT']),
  File "/usr/local/lib/python2.5/UserDict.py", line 22, in __getitem__
    raise KeyError(key)
KeyError: 'SERVER_PORT

はいはい、意味不明。
こりゃどうも、CGI環境変数が取れてないっぽい??

ちなみに、、、

試しにめっちゃ単純なpythonのプログラムをcgiで実行してみる

$ vi ~/www/python.cgi
#!/usr/local/bin/python

try:
    import pyexpat
    print pyexpat.version_info
except SystemExit:
    raise
except Exception, e:
    import syst
    import traceback

    print>>sys.stderr, e
    traceback.print_exc(file=sys.stderr)

    print 'Status: 500 Internal Server Error'
    print 'Content-Type: text/plain'
    print
    print 'Oops...'
    print
    print 'Trac detected an internal error:', e
    print
    traceback.print_exc(file=sys.stdout)

$ chmod 755 ~/www/python.cgi
$ vi ~/www/python_front.cgi
#!/bin/sh
LD_LIBRARY_PATH=/home/hoge/local/lib;export LD_LIBRARY_PATH
PYTHONPATH=/home/hoge/local/lib/python:/home/hoge/local/lib/python/site-packages;export PYTHONPATH
/usr/local/bin/python /home/hoge/www/python.cgi

$ chmod 755 ~/www/python_front.cgi

まあさっきのpyexpatの応用ということで、見よう見まねでやってみたところ、

$ ~/www/python_front.cgi
(2, 0, 0)

でもこれをブラウザからアクセスすると、Internal Server Error...

総括

すみません、もう勘弁してください...
でもOSのバージョンアップが4/15くらいから随時行われていて、ちょうどその辺りから動かなくなったので、OSのバージョンアップが影響していることは間違いなしなんやけど。
誰か同じ現象の人いたら、HELP ME!!!!!!!!

追記 2009/5/1 3:00

冷静になって考えてみると、KeyError: 'SERVER_PORT'はシェルとして叩いているから、CGI環境変数が取れるわけがない。
ということでこのエラーメッセージは宛てにならず。。。
あとpython.cgi

import pyexpat 
print "Content-Type: text/plain"
print
print pyexpat.version_info

ってやったら普通に動いた。おれアホ過ぎ。。。
こりゃもう全然何が悪いかわからん。

追記 2009/5/30

もう諦めてたんですが、ふと実はプラグインが悪かったんじゃなかろうかということで、trac.iniを初期状態に戻しました。
すると、普通に動きました...
ってことはおそらく事の成り行きは以下のようだったのかもしれません。

  1. Tracが動かなくなる
  2. Pythonが2.4から2.5に上がっていたことが判明
  3. Python2.5でTracを再インストール
  4. さくらのOSバージョンアップによりSQLiteがエラーを吐いていたことが判明し、対応
  5. Python2.5で再インストールしたため、「4」を直してもプラグインのeggファイルが2.4用なのでエラー ← 今日気づく...

ということで本当はPython2.4のままで問題なかったのかもしれません。
とりあえず、直ってよかったー。