PHP5.3
CentOS6.x
Apache2.2

Cent OS 6.9 でapacheをソースからインストールすると $service httpd status で「httpd dead but subsys locked」と表示された

More than 1 year has passed since last update.


はじめに

apache をソースからインストール後,

httpd を起動してステータスを表示したら何かがおかしい.

この問題に対する作業記録を備忘録としての意味も込めて残したいと思います.


環境


  • OS: Cent 6.9

    OSX 10.13.3 上で動く Dockerコンテナ

    (イメージのリポジトリとタグ:centos,centos6)


  • Apache: 2.2.15


  • php: 5.3.3



問題の内容

以下のように, httpd 起動時のメッセージは正常であるが, 起動後の status を確認すると

httpd dead but subsys locked

と表示されてしまう.

$ service httpd start

Starting httpd: [ OK ]
$ service httpd status
httpd dead but subsys locked


問題が発生するまでの環境構築手順

以下の Dockerfile を用いて環境を構築した.

FROM centos:centos6

# 必要なライブラリ等をインストール
RUN yum -y update
RUN yum -y install vim wget gcc autoconf automake libtool re2c libxml2-devel mysql-devel initscripts lynx
RUN wget -P /usr/local/src http://archive.apache.org/dist/httpd/httpd-2.2.15.tar.gz ;\
tar --directory /usr/local/src -xf /usr/local/src/httpd-2.2.15.tar.gz ;\
wget -P /usr/local/src/ http://museum.php.net/php5/php-5.3.3.tar.gz ;\
tar --directory /usr/local/src -xf /usr/local/src/php-5.3.3.tar.gz ;
RUN wget -P /var/tmp http://ftp-srv2.kddilabs.jp/Linux/distributions/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm ;\
rpm -ivh /var/tmp/epel-release-6-8.noarch.rpm

# apache, php のインストール
RUN cd /usr/local/src/httpd-2.2.15/ ;\
./configure --enable-so --prefix=/usr/local/apache2 && make && make install

RUN cd /usr/local/src/php-5.3.3/ ;\
./configure --prefix=/usr/local --with-apxs2=/usr/local/apache2/bin/apxs --with-mysql --with-libdir=lib64 && make && make install ;\
cd

# 事前に用意した,設定ファイルをコンテナへ追加 (事前にホスト上にコピーしておいた設定ファイルをコンテナにコピー)
## php.ini : from /etc/usr/local/lib/php.ini
## httpd.conf : from /usr/local/src/apache2/conf/httpd.conf
## httpd : from /usr/local/src/httpd-2.2.15/build/rpm/httpd.init
ADD ./php.ini /usr/local/lib/
ADD ./httpd.conf /usr/local/apache2/conf/
ADD ./httpd ./etc/init.d/

# httpd を起動スクリプトに登録
RUN chkconfig --add httpd ;\
chkconfig httpd on

コンテナへコピーするファイルは,以下のような修正を加えた.


/etc/usr/local/lib/php.ini

# 変更前

;date.timezone =

# 変更後
date.timezone = "Asia/Tokyo"


/usr/local/src/apache2/conf/httpd.conf

# 以下を追加

ServerName www.hoge.hoge:80

<FilesMatch \.php$>
SetHandler application/x-httpd-php
</FilesMatch>



/usr/local/src/httpd-2.2.15/build/rpm/httpd.init

# 変更前

httpd=${HTTPD-/usr/sbin/httpd}
pidfile=${PIDFILE-/var/run/${prog}.pid}
CONFFILE=/etc/httpd/conf/httpd.conf

# 変更後
httpd=${HTTPD-/usr/local/apache2/bin/httpd}
pidfile=${PIDFILE-/usr/local/apache2/logs/httpd.pid}
CONFFILE=/usr/local/apache2/conf/httpd.conf



問題の対処方法

結論としては, 以下に含まれる else 直後の一行を status $httpd に変えれば良い.

status コマンドのヘルプを表示すると p オプションが無い.

これが,今回の問題に関わっていると推察した.


/etc/init.d/httpd


status)
if ! test -f ${pidfile}; then
echo $prog is stopped
RETVAL=3
else
status -p {$pidfile} $httpd # → status $httpd
RETVAL=$?
fi
;;

参考:https://gist.github.com/vittee/7262943 の L.66

修正後,再度コマンドを叩いていみる.

$ service httpd start

Starting httpd: [ OK ]
$ service httpd status
httpd (pid 32) is running...

これで,問題の表示がでなくなった.


参考

PHP公式リファレンス: Apache 2.x (Unixシステム用)

Apache公式リファレンス:コンパイルとインストール

Linux(CentOS)のApache HTTP Serverを自動起動させる