さくらインターネットの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
ちなみに、、、
試しにめっちゃ単純な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を初期状態に戻しました。
すると、普通に動きました...
ってことはおそらく事の成り行きは以下のようだったのかもしれません。
- Tracが動かなくなる
- Pythonが2.4から2.5に上がっていたことが判明
- Python2.5でTracを再インストール
- さくらのOSバージョンアップによりSQLiteがエラーを吐いていたことが判明し、対応
- Python2.5で再インストールしたため、「4」を直してもプラグインのeggファイルが2.4用なのでエラー ← 今日気づく...
ということで本当はPython2.4のままで問題なかったのかもしれません。
とりあえず、直ってよかったー。