ある朝、いつも通りMacbookを起動したのですが、ローカルPCのApache(localhost:80)につながりません。
いろいろなWebアプリをインストールして、ローカルで作業しているので、致命的に困った事態発生です。
そういえば、寝る前に・・・何かのアップデートがあったような気がするのですが・・・。寝ぼけていて覚えていません。
そのため、原因なのか分かりません。
というわけで、原因を調査していきましょう。その様子をここにメモします。たぶん、他の方もそんな状態になることがあるかもしれません。
Apacheを再起動
大抵は、再起動すると直ります。
$ sudo apachectl restart
問題があれば、ここでエラーが表示されるはずなのですが・・・しかし、今回エラーも何も表示されません。
エラーログを確認しよう
大抵の問題は、エラーログに何かしらのメッセージが記録されます。
以下のパスにどこかにある、エラーログを確認してみましょう。
/var/log/apache2/error_log
/private/var/log/apache2/error_log
/var/log/httpd/error_log
今回私の症状ですが、なんと、エラーログにも何も記録されていません。昨夜に寝る前にアプリをデバッグした痕跡は残っているのですが、今朝、この瞬間のログは何も記録されていませんでした。
ポートが占有されてないか確認
それでは、本腰入れてトラブルシューティングしようと思いました。
まず、試したのは、ポートスキャンして、他にポート80を占有しているアプリがないかを確認することからです。以下のアプリで、Portscanのタブを開いて、localhostのポート80番を調べます。
OS X:ネットワークユーティリティについて
https://support.apple.com/ja-jp/HT202790
あるいは、男らしくコマンドを打って確認しましょう。
$ sudo lsof -i -P | grep "LISTEN"
そういえば、何かアプリをインストールした気がする・・・と思ったら、そのアプリがポート80番を占有していないでしょうか。
私の今回の症状では、ポート80番には何も表示されません。
設定ファイルが壊れていないか確認
希に、インストールしたアプリが、勝手に、Apacheの設定ファイルを書き換えることがあります。そこで、設定ファイルが正しいかどうか調べましょう。
$ apachectl configtest
と、ここでエラーが出ました。
Syntax error on line 170 of /private/etc/apache2/httpd.conf: Cannot load /usr/local/opt/php56/libexec/apache2/libphp5.so into server: dlopen(/usr/local/opt/php56/libexec/apache2/libphp5.so, 10): Symbol not found: _ldap_control_find\n Referenced from: /usr/local/opt/php56/libexec/apache2/libphp5.so\n Expected in: /System/Library/Frameworks/LDAP.framework/Versions/A/LDAP\n in /usr/local/opt/php56/libexec/apache2/libphp5.so
どうやら、PHPのApacheモジュールの読み込みで死んでいるようです。ここまで分かれば何とかなりそうです。
エラーメッセージでググってみると・・・
ありました。全く同じエラーメッセージが出ています。
どうやら、ApacheとPHPの相性の問題です。そういえば、先日、brew updateをかけた気がする・・・
このスレッドに解決策も書かれていました。
$ brew uninstall php56
$ brew cleanup
$ brew install php56
ただ、これをやっても解決しません。。。それで、さらいスレッドの下の方を読んでいくと、やはりこれでも解決できないという書き込みがあり、以下のようにした直ったという話がありました。
brew uninstall php56
brew cleanup
brew update
brew install php56 --without-ldap
なるほど、LDAP関係のエラーなので、LDAPをオプションから外してコンパイルするのでしょう。
試してみると、無事解決しました。
最初、エラーを見つけたときに、Homebrewのphp56が問題だと思ったので、最新のphp71を試したのですが、それでも直らなかったので、どうしようかと思っていたのですが、なんとかなって良かったです。
結論
ある日、突然、Apacheが動かなくなることもありますが、一つずつ、落ち着いて対処していけばなんとかなるようです。
Apacheが動かなかったので、とりあえず、PHPの簡易サーバーを使ったのですが、ちょっとしたWebアプリをテストするにはそれでも十分ですね。