ロケ地:AWS EC2@m3.medium
httpdが起動しない
CentOS7のApache2.4な環境で、以下のようなメッセージが出力されて、httpdが起動しない状態になった。
[root@localhost ~]# systemctl start httpd Job for httpd.service failed because the control process exited with error code. See "systemctl status httpd.service" and "journalctl -xe" for details.
これらから「/var/run/httpd/にpidファイルが残ってるんじゃろ……ほらあった!」と意気揚々、rmしてもう一度再起動した。
[root@localhost ~]# systemctl start httpd Job for httpd.service failed because the control process exited with error code. See "systemctl status httpd.service" and "journalctl -xe" for details.
ああん……?
make_sock: could not bind to address
error_logを確認した所、以下のように記録されていました。
[Tue Oct 01 11:45:14.000000 2016] [core:crit] [pid 9722] (22)Invalid argument: AH00069: make_sock: for address [::]:80, apr_socket_opt_set: (IPV6_V6ONLY) (98)Address already in use: AH00072: make_sock: could not bind to address [::]:80 (98)Address already in use: AH00072: make_sock: could not bind to address 0.0.0.0:80 [Tue Oct 01 11:45:14.114514 2016] [mpm_prefork:alert] [pid 9722] no listening sockets available, shutting down
port 80が使用されているので使えない、と言っています。が、netstat -an|grep :80しても使用しているプロセスが見当たりません。
Listenが複数記述されていたのが原因だった
ファイルの構成が以下のようになっていました。
/etc/httpd/ ├conf/ │└httpd.conf └conf.d/ ├vhosts.conf └ssl.conf
この中で、httpd.confの中に、以下の記述がされていました。
- Listen 80
- include conf.d/*.conf
でvhost.confには以下の記述がありました。
- Listen 80
httpd.condでport80を掴んだ後に、vhosts.confを読み込んだ段階でもport80をつかもうとして「Address already in use」となっているようですね。
結論
同じポートのListenは二度書くな、と言うことでござった。 自分以外の人が手を入れたサーバだったので、普段は無意識のうちにやってることがされてなくてめっちゃ焦りました。
ちなみに「Listen 80」を二重に記述した状態でapachectl configtestしてもSyntax OKとなります。ちゃんとrestartなりして表示は確認しましょう、というお話でしたね。