前回、apache httpd 2.4.2 を利用していて、mod_cgi が mod_cgid に変更になっていた(2.2.4では、Makefile を作成する configure のデフォルトが --enable-cgi で、 --enable-cgid がオプションでした。)ことに気が付いたので、古い 2.2.4 とちょっと比較しました。
インストールした /usr/local/httpd242 ディレクトリの下は、APRが独立したので lib ディレクトリが無くなった他にはディレクトリ構成は変わりませんが、ほとんどの機能がモジュール化(Apache で 動的共有オブジェクト Dynamic Shared Objeect (DSO) サポートと httpd.conf の中でコメントされています。)されて、modules ディレクトリの下に多数置かれるようになりました。httpd.conf の中で、 LoadModule ディレクティブによってこれらのモジュールを使うか使わないかを指定するので、これらを示すリストのようになっています。
さて、mod_cgid に戻って、それが使うソケット(logs/cgisock.*)に関して気が付いた点を示します。
まず、ソケットの作成権限が無い場合のエラーです。
$ ls /usr/local/httpd242/logs
access_log error_log
$
$ /usr/local/httpd242/bin/apachectl start
(13)Permission denied: AH00072: make_sock: could not bind to address [::]:80
(13)Permission denied: AH00072: make_sock: could not bind to address 0.0.0.0:80
no listening sockets available, shutting down
AH00015: Unable to open logs
$
これは、ソケット作成権限を持つ、例えば root で行えば以下のように解決します。
# ls /usr/local/httpd242/logs
access_log error_log
#
# /usr/local/httpd242/bin/apachectl start
#
# ls /usr/local/httpd242/logs
access_log cgisock.1715 error_log httpd.pid
#
このように新しいソケットが作成されます。ここでリスタートしてみます。
(ps コマンドの出力は少し縮めてあります。)
このようにリスタートすると親プロセスは残って、子プロセスだけを立ち上げ直しています。つまり、先ほど作成したソケットは再利用されます。
ここで、httpd を終了してみます。
# /usr/local/httpd242/bin/apachectl stop
#
# ps -ef |grep httpd
root 2079 1710 0 xx:20 pts/0 00:00:00 grep httpd
#
# ls /usr/local/httpd242/logs/
access_log error_log
#
全てのプロセスが終了し、ソケットも消去されます。
もし、何らかの理由で(今回の例は、Windowsをアップデートしたら再起動して、coLinux が強制終了したときのものです。)ソケットが消去できなかった場合は、
# ls /usr/local/httpd242/logs
access_log cgisock.1731 error_log httpd.pid
#
# /usr/local/httpd242/bin/apachectl start
#
# ls /usr/local/httpd242/logs
access_log cgisock.1715 cgisock.1731 error_log httpd.pid
#
のように、残ってしまった、cgisock.1731 はそのままで、新しいソケットが作成されます。その場合は、消しておく必要があります。
# rm /usr/local/httpd242/logs/cgisock.1731
注意したい点です。httpd.pid は、毎回作成されますのでそのままで問題ないのは従来どおりです。
インストールした /usr/local/httpd242 ディレクトリの下は、APRが独立したので lib ディレクトリが無くなった他にはディレクトリ構成は変わりませんが、ほとんどの機能がモジュール化(Apache で 動的共有オブジェクト Dynamic Shared Objeect (DSO) サポートと httpd.conf の中でコメントされています。)されて、modules ディレクトリの下に多数置かれるようになりました。httpd.conf の中で、 LoadModule ディレクティブによってこれらのモジュールを使うか使わないかを指定するので、これらを示すリストのようになっています。
さて、mod_cgid に戻って、それが使うソケット(logs/cgisock.*)に関して気が付いた点を示します。
まず、ソケットの作成権限が無い場合のエラーです。
$ ls /usr/local/httpd242/logs
access_log error_log
$
$ /usr/local/httpd242/bin/apachectl start
(13)Permission denied: AH00072: make_sock: could not bind to address [::]:80
(13)Permission denied: AH00072: make_sock: could not bind to address 0.0.0.0:80
no listening sockets available, shutting down
AH00015: Unable to open logs
$
これは、ソケット作成権限を持つ、例えば root で行えば以下のように解決します。
# ls /usr/local/httpd242/logs
access_log error_log
#
# /usr/local/httpd242/bin/apachectl start
#
# ls /usr/local/httpd242/logs
access_log cgisock.1715 error_log httpd.pid
#
このように新しいソケットが作成されます。ここでリスタートしてみます。
(ps コマンドの出力は少し縮めてあります。)
# ps -ef |grep httpd root 1715 1 0 xx:08 ? 00:00:00 /usr/local/httpd242/bin/httpd -k start daemon 1896 1715 0 xx:12 ? 00:00:00 /usr/local/httpd242/bin/httpd -k start daemon 1897 1715 0 xx:12 ? 00:00:00 /usr/local/httpd242/bin/httpd -k start daemon 1898 1715 0 xx:12 ? 00:00:00 /usr/local/httpd242/bin/httpd -k start daemon 1899 1715 0 xx:12 ? 00:00:00 /usr/local/httpd242/bin/httpd -k start root 1984 1710 0 xx:14 pts/0 00:00:00 grep httpd # # /usr/local/httpd242/bin/apachectl restart # # ps -ef |grep httpd root 1715 1 0 xx:08 ? 00:00:00 /usr/local/httpd242/bin/httpd -k start daemon 1988 1715 0 xx:14 ? 00:00:00 /usr/local/httpd242/bin/httpd -k start daemon 1989 1715 0 xx:14 ? 00:00:00 /usr/local/httpd242/bin/httpd -k start daemon 1990 1715 0 xx:14 ? 00:00:00 /usr/local/httpd242/bin/httpd -k start daemon 1991 1715 0 xx:14 ? 00:00:00 /usr/local/httpd242/bin/httpd -k start root 2074 1710 0 xx:14 pts/0 00:00:00 grep httpd # # ls /usr/local/httpd242/logs access_log cgisock.1715 error_log httpd.pid #
このようにリスタートすると親プロセスは残って、子プロセスだけを立ち上げ直しています。つまり、先ほど作成したソケットは再利用されます。
ここで、httpd を終了してみます。
# /usr/local/httpd242/bin/apachectl stop
#
# ps -ef |grep httpd
root 2079 1710 0 xx:20 pts/0 00:00:00 grep httpd
#
# ls /usr/local/httpd242/logs/
access_log error_log
#
全てのプロセスが終了し、ソケットも消去されます。
もし、何らかの理由で(今回の例は、Windowsをアップデートしたら再起動して、coLinux が強制終了したときのものです。)ソケットが消去できなかった場合は、
# ls /usr/local/httpd242/logs
access_log cgisock.1731 error_log httpd.pid
#
# /usr/local/httpd242/bin/apachectl start
#
# ls /usr/local/httpd242/logs
access_log cgisock.1715 cgisock.1731 error_log httpd.pid
#
のように、残ってしまった、cgisock.1731 はそのままで、新しいソケットが作成されます。その場合は、消しておく必要があります。
# rm /usr/local/httpd242/logs/cgisock.1731
注意したい点です。httpd.pid は、毎回作成されますのでそのままで問題ないのは従来どおりです。