PHPを起動するとhttpdがSegmentation faultになる場合の対処法
Apache 2.0.52でPHPが動いてないウェブサーバがあった。
GETするといきなりEOFでコンテンツが何もこない。
httpdのerror_logにセグメンテーション違反が出てた。
[Mon Feb 16 13:30:24 2009] [notice] child pid 7897 exit signal Segmentation fault (11)
gdbでhttpdを起動してみるとバックトレースはこんな感じ。
やり方はここを参考にした。http://dozo.rgr.jp/log/eid454.html
Program received signal SIGSEGV, Segmentation fault. [Switching to Thread -1209084224 (LWP 3094)] 0x00000000 in ?? () (gdb) (gdb) bt #0 0x00000000 in ?? () #1 0x01250aa7 in php_hash_environment () at /usr/local/src/php-5.1.6/main/php_variables.c:656 #2 0x01245e76 in php_request_startup () at /usr/local/src/php-5.1.6/main/main.c:1118 #3 0x012f4d46 in php_handler (r=0x9eadde0) at /usr/local/src/php-5.1.6/sapi/apache2handler/sapi_apache2.c:542 #4 0x00dea9c7 in ap_run_handler () from /usr/sbin/httpd #5 0x00deae33 in ap_invoke_handler () from /usr/sbin/httpd #6 0x00de78b5 in ap_process_request () from /usr/sbin/httpd #7 0x00de263f in _start () from /usr/sbin/httpd #8 0x09eadde0 in ?? () #9 0x00000004 in ?? () #10 0x09eadde0 in ?? () #11 0x00927d89 in modperl_process_connection_handler () from /etc/httpd/modules/mod_perl.so #12 0x00df5359 in ap_run_process_connection () from /usr/sbin/httpd #13 0x00df56c4 in ap_process_connection () from /usr/sbin/httpd #14 0x00de8909 in ap_graceful_stop_signalled () from /usr/sbin/httpd #15 0x00de8b00 in ap_graceful_stop_signalled () from /usr/sbin/httpd #16 0x00de8c1f in ap_graceful_stop_signalled () from /usr/sbin/httpd #17 0x00de94e4 in ap_mpm_run () from /usr/sbin/httpd #18 0x00df035a in main () from /usr/sbin/httpd
原因は単純。Apacheの設定でPHP5とPHP4のモジュールをどっちもロードしてた。
PHP4のほうをコメントアウトしてhttpd再起動で終わり。
conf/httpd.confで
LoadModule php5_module modules/libphp5.so
conf.d/php.confで
#LoadModule php4_module modules/libphp4.so
PHP5のモジュール入れたら動作確認は必ずやりましょうね。