突然Mac の apache が起動しなくなった
Mac にデフォルトで入っている apache が突然起動しなくなったのでその原因と解決方法
apache を start するが起動しない
いつものようにでapahceを起動
$ sudo apachectl start
プロセスとポートを確認するが、httpdが動いていないし 80番ポートもリスンされていない
$ ps aux | grep httpd
xxxx 1270 0.0 0.0 2434840 780 s000 R+ 4:17PM 0:00.00 grep httpd
$ netstat -ant | grep LISTEN
tcp4 0 0 127.0.0.1.17603 *.* LISTEN
tcp4 0 0 127.0.0.1.17600 *.* LISTEN
tcp4 0 0 *.17500 *.* LISTEN
tcp6 0 0 *.17500 *.* LISTEN
tcp4 0 0 *.88 *.* LISTEN
tcp6 0 0 *.88 *.* LISTEN
tcp4 0 0 127.0.0.1.49153 *.* LISTEN
tcp4 0 0 127.0.0.1.49152 *.* LISTEN
tcp4 0 0 *.445 *.* LISTEN
tcp6 0 0 *.445 *.* LISTEN
tcp4 0 0 *.548 *.* LISTEN
エラーを確認
/var/log/apache2/error_log を確認するが、該当の時刻のログが何も出ていない
/var/log/system.log を確認すると以下のログが出ていたので、どうやら起動に失敗しているらしいことを確認できた
sudo[975]: xxxx : TTY=ttys001 ; PWD=/Users/xxxx ; USER=root ; COMMAND=/usr/sbin/apachectl start
com.apple.xpc.launchd[1] (org.apache.httpd): This service is defined to be constantly running and is inherently inefficient.
com.apple.xpc.launchd[1] (org.apache.httpd[978]): Service could not initialize: 15F34: xpcproxy + 12684 [1462][F7717708-ACF7-307D-B04E-998DFC36598F]: 0x2
原因を追っていく
/usr/sbin/apachectl の中をみると launchctl で起動しているらしいことがわかった
LAUNCHCTL="/bin/launchctl"
LAUNCHD_JOB="/System/Library/LaunchDaemons/org.apache.httpd.plist"
org.apache.httpd.plist の内容をみて、実際に実行されているコマンドを確認する
<key>ProgramArguments</key>
<array>
<string>/usr/sbin/httpd-wrapper</string>
<string>-D</string>
<string>FOREGROUND</string>
</array>
コマンドを直接実行してみる
$ /usr/sbin/httpd-wrapper -D FOREGROUND
すると以下のエラーがでた
-bash: /usr/sbin/httpd-wrapper: /usr/bin/ruby: bad interpreter: No such file or directory
なぜ rudy が関係しているのかわからないが、何らかのファイルが見つからずに起動に失敗しているだろうと予想する
/usr/sbin/httpd-wrapper の中を見ると、どうやらこれは ruby スクリプトらしいことがわかった
#!/usr/bin/ruby
念のため /usr/bin/ruby を確認してみるとなんとファイルがない
$ ls -l /usr/bin/ruby
ls: /usr/bin/ruby: No such file or directory
エラーの原因
ruby スクリプトを起動する際に /usr/bin/ruby が指定されいているが実行ファイルがないため起動に失敗しているようだった
そういえば最近 mac のデフォルトで入っている ruby を消して、homebrew で入れ直していたことを思い出す
その際に ruby コマンドのパスは /usr/local/bin/ruby に場所が変わっていた
$ which ruby
/usr/local/bin/ruby
/usr/bin/ruby をシンボリックリンクにして ruby へのパスが通るように修正
$ sudo ln -s /usr/bin/ruby /usr/local/bin/ruby
すると apache が正常に起動するように戻った
教訓
ruby、python などは OS のスクリプトで利用されていることが多いので、デフォルトのものはなるべく変更しない
開発をする際には rubyenv などの仮想環境を使うのがいい
ていうか mac の環境まじでわかりにくい