AR ホームベーカリー

オイラのアウトプット用ホームベーカリー!

「make_sock: could not bind to address 0.0.0.0:80」と言われるとき

ロケ地: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なりして表示は確認しましょう、というお話でしたね。