酒飲んで、車いじって、トロンボーン吹いて、寝る。そんな生活に憬れる今日この頃。
日記の更新は気の向くまま、つれづれなるままに・・・

owncloudを導入してみた

自宅のサーバをDropboxみたいに使えればいいかな、と思ってowncloudをインストールしてみた。
そのときのトラブルと解決の経緯を。


owncloudのサイトからtar.gzファイルを落として解凍。
でもってapacheのドキュメントディレクトリにコピーしてapacheの設定を修正して見れるように。
さらに、mysqlのデータベースを作成。

$ mysql -u root -p
> create database owncloud;
> grant all privileges on owncloud.* to 'owncloud'@'localhost' identified by 'password';

ここまでは普通のインストールの方法。詳細は別のサイトに委ねます。


で、Chromeからサイトへ移動。ログイン名やデータベース情報を入れてGO!とおもったら、暫くして

データを受信していません
サーバーからデータが送信されていないためウェブページを読み込むことができません
ヒント:
このウェブページを跡で読み込んでください
エラー 324 (net::ERR_EMPTY_REPSPONSE): サーバーはデータを送信せずに接続を切断しました。

という表示が。その後何度再読み込みさせても同じ表示のまま。
apacheerror.logを見ると

[notice] child pid 15785 exit signal Segmentation fault (11)

とでている。なんじゃそりゃ?
行き詰まってgoogleで検索すると、海外のフォーラムサイトで同じエラーのスレッドが見つかるが「bug fixで直ったよ」みたいな記事ばかりで決定的な解決策は無い様子。


はて困った。


そもそもSegmentation faultってなんじゃい?と思って調べてみたら
メモリデータへの不正アクセスによるエラーとのこと。
http://sarface2012.hatenablog.com/entry/20101027
メモリが少ない(1G)わけでもない(かといって多いわけでもないけど)
とにかく上記のサイトのように、なにが悪さをしているのかを調べてみることに。


まず、apacheにcoreを吐かせるためにapache2.confに一行追加

CoreDumpDirectory /tmp

coreのファイルサイズ制限を解除(無限)にするために

$ ulimit -c unlimited

とする。
念の為にulimit -aで確認

$ulimit -a
core file size (blocks, -c) unlimited
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
・・・・・

この状態でapacheを再起動させて、ブラウザで再読込させてみる。
表示はやっぱり「エラー324 (net::ERR_EMPTY_REPSPONSE)」
/tmpにcoreが出来ていることを確認してgdbでcoreを解析

# gdb /usr/sbin/apache2 -c /tmp/core

GNU gdb (GDB) 7.4.1-debian
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later http://gnu.org/licenses/gpl.html
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "i486-linux-gnu".
For bug reporting instructions, please see:
http://www.gnu.org/software/gdb/bugs/...
Reading symbols from /usr/sbin/apache2...(no debugging symbols found)...done.
[New LWP 16421]

warning: Can't read pathname for load map: 入力/出力エラーです.
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/i386-linux-gnu/i686/cmov/libthread_db.so.1".
Failed to read a valid object file image from memory.
Core was generated by `/usr/sbin/apache2 -k start'.
Program terminated with signal 11, Segmentation fault.
#0 0xb6e2fede in ?? () from /usr/lib/apache2/modules/libphp5.so
(gdb)

なんかlibphp5.soがおかしいらしい
もうすこし詳しく調べるために「where」と入力

(gdb) where
#0 0xb6e2fede in ?? () from /usr/lib/apache2/modules/libphp5.so
#1 0xb6e31229 in zend_parse_parameters () from /usr/lib/apache2/modules/libphp5.so
#2 0xb6d37246 in ?? () from /usr/lib/apache2/modules/libphp5.so
#3 0xb6ed6805 in ?? () from /usr/lib/apache2/modules/libphp5.so
#4 0xb6e91b65 in execute () from /usr/lib/apache2/modules/libphp5.so
#5 0xb6e282d9 in zend_execute_scripts () from /usr/lib/apache2/modules/libphp5.so
#6 0xb6dc211e in php_execute_script () from /usr/lib/apache2/modules/libphp5.so
#7 0xb6ed8fb8 in ?? () from /usr/lib/apache2/modules/libphp5.so
#8 0xb7746656 in ap_run_handler ()
#9 0xb7746aa9 in ap_invoke_handler ()
#10 0xb7758d50 in ap_process_request ()
#11 0xb7755908 in ?? ()
#12 0xb774db26 in ap_run_process_connection ()
#13 0xb775e3c0 in ?? ()
#14 0xb775ed13 in ?? ()
#15 0xb775eded in ?? ()
#16 0xb775f9f5 in ap_mpm_run ()
#17 0xb772f6a4 in main ()

なんかzendがアレコレするときにおかしくなるらしい。


といってもやることといえば・・・libphp5を更新する位しか思いつかない。
一旦quitで抜けて、libphp5.soが含まれているパッケージをapt-fileで検索してみた

# apt-file find libphp5.so
libapache2-mod-php5: /usr/lib/apache2/modules/libphp5.so
libphp5-embed: /usr/lib/php5/libphp5.so
php5-dbg: /usr/lib/debug/usr/lib/apache2/modules/libphp5.so

ウチのサーバはLAMP環境が整っているので、libapache2-mod-php5は当然の如くインストール済み。
ここはとりあえず、他の2つをインストールしてみる(ぉぃ

# aptitude install libapache2-mod-php5 libphp5-embed php5-dbg

この状態でapacheを再起動して、もう一度ブラウザで再読込させてみるも、
表示は当然の如く「エラー324 (net::ERR_EMPTY_REPSPONSE)」
apacheerror.logには
[notice] child pid 15785 exit signal Segmentation fault (11)
が一行追加されている。
一応/tmpに吐き出されたcoreをもう一度解析してみる

# gdb /usr/sbin/apache2 -c /tmp/core

GNU gdb (GDB) 7.4.1-debian
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later http://gnu.org/licenses/gpl.html
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "i486-linux-gnu".
For bug reporting instructions, please see:
http://www.gnu.org/software/gdb/bugs/...
Reading symbols from /usr/sbin/apache2...(no debugging symbols found)...done.
[New LWP 16421]

warning: Can't read pathname for load map: 入力/出力エラーです.
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/i386-linux-gnu/i686/cmov/libthread_db.so.1".
warning: the debug information found in "/usr/lib/debug//usr/lib/php5/20100525+lfs/mysql.so" does not match "/usr/lib/php5/20100525+lfs/mysql.so" (CRC mismatch).
warning: the debug information found in "/usr/lib/debug/usr/lib/php5/20100525+lfs/mysql.so" does not match "/usr/lib/php5/20100525+lfs/mysql.so" (CRC mismatch).
warning: the debug information found in "/usr/lib/debug//usr/lib/php5/20100525+lfs/mysqli.so" does not match "/usr/lib/php5/20100525+lfs/mysqli.so" (CRC mismatch).
warning: the debug information found in "/usr/lib/debug/usr/lib/php5/20100525+lfs/mysqli.so" does not match "/usr/lib/php5/20100525+lfs/mysqli.so" (CRC mismatch).
warning: the debug information found in "/usr/lib/debug//usr/lib/php5/20100525+lfs/pdo_mysql.so" does not match "/usr/lib/php5/20100525+lfs/pdo_mysql.so" (CRC mismatch).
warning: the debug information found in "/usr/lib/debug/usr/lib/php5/20100525+lfs/pdo_mysql.so" does not match "/usr/lib/php5/20100525+lfs/pdo_mysql.so" (CRC mismatch).

Failed to read a valid object file image from memory.
Core was generated by `/usr/sbin/apache2 -k start'.
Program terminated with signal 11, Segmentation fault.
#0 0xb6e2fede in zend_parse_va_args (num_args=0, type_spec=0xb5c155cc "\016",
va=,
flags=)
at /build/buildd-php5_5.4.4-14-i386-gpFYGr/php5-5.4.4/Zend/zend_API.c:506

前半のwarningはphp5-dbgをインストールした影響だと思うんですが、
その下に具体的なエラー内容が表示されている。(php5-dbgのおかげ?)
ここでもzendがなにやらおかしい様子。


ということで、PHPの問題であることがなんとなくわかってきた


zendについてはよく知らないのだが、いずれも「Failed to read a valid object file image from memory.」とあるので、なんとなくPHPのメモリ設定がおかしいのかもしれない。
ウチのサーバでphpのメモリに関する設定といえば・・・・そういえば高速化ってことでapcとeaccerelatorが両方設定している。それ以外は教科書通りの設定なので、怪しいのはこの2つくらいしかない。


ここは物は試しでeacceleratorの設定を削除してみてapacheを再起動。
再読み込みさせたら・・・owncloudのログイン画面が!
ログインしてみたところ、正常に動きました。


最後は意外にあっけなく解決しちゃいましたが、私のサーバ環境においてapcとeacceleratorが共存していたことが問題だったようです。
もともとapcとeacceleratorは共存できる/できないの議論があったようなので、これを機会にapc一本にします。