2014年10月17日金曜日

Mac OS X YosemiteでApacheのコンフィグが反映されない時のメモ

あれ?なんで反映されないの?


先に言い訳しておく。このエントリで取り上げている問題は、ボクの勘違いや手順ミスによって引き起こされたものかもしれない。

早速Yosemiteにアップグレードしたので、開発環境の整備をしていたのだけれども困ったことが起きた。なぜか修正したApacheのコンフィグが反映されない。しばらく悩んだ結果それなりにうまく動くようになったので、その対応メモを残しておく。

もしかしたら、他の誰かの役に立つかもしれないので。

ちなみに環境構築についてはMavericks向けに書いた下記のエントリが参考になるはず。ただ、Apacheのコンフィグについてはこのエントリを参照して欲しい。



原因らしきもの……


Apacheのコンフィグを書き換えた場合、何らかの方法でApacheのプロセスを再起動してコンフィグをリロードさせたりする。

ボクの場合は、

$ sudo apachectl stop

でプロセスを終了してから

$ sudo apachectl start

でプロセスを起動する……って手順でやっている。

本来なら、この手順でコンフィグが反映されるのだけれど、なぜか反映されなくて困っていた。記述が間違ってるのかな……とおもってチェックしてみたけど合っているっぽい。

そこでしばらく悩んでしまっていたのだけれど、「sudo apachectl stop」でプロセスを終了した状態で

$ ps -efww | grep httpd

とやってみたところ……

$ ps -efww | grep httpd
    n nnnnn nnnnn   0  HH:MM ??         0:00.24 /usr/sbin/httpd -D FOREGROUND
    n nnnnn nnnnn   0  HH:MM ??         0:00.00 /usr/sbin/httpd -D FOREGROUND

という表示が得られた。つまり、Apacheのプロセスが落ちてねぇって話だ。なんでやねん(;´Д`)

しょうがないので

$ sudo killall httpd

で全部killってみた。

「 ps -efww | grep httpd」コマンドで再度確認してみたところ、とりあえず完全に止めることができたっぽい。再び「sudo apachectl start」コマンドで起動してみたところ……今度はちゃんと反映されたようだ。

念のため「sudo apachectl stop」で止めた後に「 ps -efww | grep httpd」で確認すると、今度はちゃんと落ちている。いったい最初の「落ちないApacheプロセスの怪」はなんだったのだろう。Yosemiteのなにかが使ってるサービスがアレしてたのだろうか。

まあ、とりあえず意図したとおりに動いているようなのでよしとする。類似の事象が起きたら、ちゃんとプロセスが落ちてるかをチェックすべきなんだな。うん。

Yosemite用のApacheコンフィグ


あくまで開発環境で使う用のコンフィグなので、本番環境とかでこのエントリを参考にしようとしているのであればちゃんと理解してからにしてね。ボクは何が起こっても責任とらないからね?

YosemiteにデフォルトでインストールされているApacheは2.4.9(*1)で、Maverickの2.2系と記述が異なる箇所がある。基本的にはMavericksのコンフィグと同様だけれども、手元の環境で動作確認が取れたものをのせておく。2.2系の時に使っていたコンフィグをコピーするのではなくて、新規に1から作ってる(*2)のでその点は注意。

まずは「/private/etc/apache2/httpd.conf」。長いのでdiffで。

例によって必要そうなモジュールを読み込んだり、不要なモジュールを読み込まなくしたりしているのがメイン。あとは自分の開発環境用(バーチャルホスト)設定が書かれたコンフィグを読むようにしているくらいか。

$ diff ./httpd.conf.original ./httpd.conf
80c80
< LoadModule access_compat_module libexec/apache2/mod_access_compat.so
---
> #LoadModule access_compat_module libexec/apache2/mod_access_compat.so
103c103
< #LoadModule include_module libexec/apache2/mod_include.so
---
> LoadModule include_module libexec/apache2/mod_include.so
127,132c127,132
< LoadModule proxy_module libexec/apache2/mod_proxy.so
< LoadModule proxy_connect_module libexec/apache2/mod_proxy_connect.so
< LoadModule proxy_ftp_module libexec/apache2/mod_proxy_ftp.so
< LoadModule proxy_http_module libexec/apache2/mod_proxy_http.so
< LoadModule proxy_fcgi_module libexec/apache2/mod_proxy_fcgi.so
< LoadModule proxy_scgi_module libexec/apache2/mod_proxy_scgi.so
---
> #LoadModule proxy_module libexec/apache2/mod_proxy.so
> #LoadModule proxy_connect_module libexec/apache2/mod_proxy_connect.so
> #LoadModule proxy_ftp_module libexec/apache2/mod_proxy_ftp.so
> #LoadModule proxy_http_module libexec/apache2/mod_proxy_http.so
> #LoadModule proxy_fcgi_module libexec/apache2/mod_proxy_fcgi.so
> #LoadModule proxy_scgi_module libexec/apache2/mod_proxy_scgi.so
134,137c134,137
< LoadModule proxy_wstunnel_module libexec/apache2/mod_proxy_wstunnel.so
< LoadModule proxy_ajp_module libexec/apache2/mod_proxy_ajp.so
< LoadModule proxy_balancer_module libexec/apache2/mod_proxy_balancer.so
< LoadModule proxy_express_module libexec/apache2/mod_proxy_express.so
---
> #LoadModule proxy_wstunnel_module libexec/apache2/mod_proxy_wstunnel.so
> #LoadModule proxy_ajp_module libexec/apache2/mod_proxy_ajp.so
> #LoadModule proxy_balancer_module libexec/apache2/mod_proxy_balancer.so
> #LoadModule proxy_express_module libexec/apache2/mod_proxy_express.so
143c143
< #LoadModule ssl_module libexec/apache2/mod_ssl.so
---
> LoadModule ssl_module libexec/apache2/mod_ssl.so
160c160
< #LoadModule vhost_alias_module libexec/apache2/mod_vhost_alias.so
---
> LoadModule vhost_alias_module libexec/apache2/mod_vhost_alias.so
168c168
< #LoadModule rewrite_module libexec/apache2/mod_rewrite.so
---
> LoadModule rewrite_module libexec/apache2/mod_rewrite.so
212a213
> ServerName localhost:80
527a529
> Include /path/to/dir/apache2/conf/*.conf

続いては「/path/to/dir/apache2/conf/localhost.conf」。こちらが開発環境で使うバーチャルホスト設定。

ポイントは「Order deny,allow」とか「Deny from all」といったあたりの記述が「Require〜」のようになっている(*3)という点。Apache2.4からは結構柔軟かつ直感的に書けるようになっている(*4)のでそれを使わない手はない。

Listen 443

<VirtualHost *:80>
    ServerName localhost
    ErrorLog  "/path/to/dir/apache2/logs/error.log"
    LogLevel warn
    CustomLog "/path/to/dir/apache2/logs/access.log" combined

    SSLEngine off

    DocumentRoot "/path/to/dir/apache2/showcase/public_html"
    <Directory "/path/to/dir/apache2/showcase/public_html">
        AllowOverride All
        Options All
        Require method GET POST OPTIONS
        Require local
    </Directory>
</VirtualHost>

<VirtualHost *:443>
    ServerName localhost
    ErrorLog  "/path/to/dir/apache2/logs/error.log"
    LogLevel warn
    CustomLog "/path/to/dir/apache2/logs/access.log" combined

    SSLEngine               on
    SSLProtocol             ALL -SSLv2 -SSLv3
    SSLHonorCipherOrder     On
    SSLCipherSuite          ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS
    SSLCertificateFile    /path/to/dir/apache2/conf/server.crt
    SSLCertificateKeyFile /path/to/dir/apache2/conf/server.key

    DocumentRoot "/path/to/dir/apache2/showcase/public_html"
    <Directory "/path/to/dir/apache2/showcase/public_html">
        AllowOverride All
        Options All
        Require method GET POST OPTIONS
        Require local
    </Directory>
</VirtualHost>

PHPの設定等、それ以外の部分についてはMac OS X MavericksにApacheとPHPをインストールしてWebアプリの開発環境を作ってみる というエントリを参照のこと。

MySQLについてもMac OS X MavericksにMySQLをインストールしてみるというエントリの内容でいけるっぽい。


*1:ちなみにPHPはPHP 5.5.14だったよ
*2:といっても対したことはやってないんだけども
*3:access_compat_module(mod_access_compat.so)を読み込むようにすれば2.2系までの記述方法のままでいけるはず
*4:このエントリとMac OS X MavericksにApacheとPHPをインストールしてWebアプリの開発環境を作ってみる のエントリを見比べてみると、Apache2.2系からApache2.4系にアレするときの参考になるかもしれない

0 件のコメント:

コメントを投稿