猫でもわかるWebプログラミングと副業

本業エンジニアリングマネージャー。副業Webエンジニア。Web開発のヒントや、副業、日常生活のことを書きます。

MacのApacheとPHPのバージョンが勝手に上がったので設定をし直す

もくじ

概要

もともとソースからビルドしたApacheと、brewで入れたPHP5.6がMacに入っていて、簡単な動作確認などに利用していました。 ある日、brewのアップデートをしたからなのか、何かのライブラリを入れた関係で勝手に依存パッケージが入れられたのか分かりませんが、Apache 2.4が新しくインストールされていて、PHPのバージョンも7になっていました。

$ httpd -v
Server version: Apache/2.4.33 (Unix)
Server built:   Apr 10 2018 15:28:33

$ php -v
PHP 7.2.4 (cli) (built: Apr 10 2018 16:11:28) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.2.4, Copyright (c) 1999-2018, by Zend Technologies

なんか色々動かなくなっていたので直そうと試みます。

Set the 'ServerName' directive globally to suppress this message

http://localhost にアクセスしましたが何も表示されませんでした。とりあえず、apachectl restartしてみると以下のエラーが表示されました。

AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using ysakamoto.local. Set the 'ServerName' directive globally to suppress this message

configの場所を特定する

もともとソースからビルドしたapacheが入っており、configは /etc/apache2/conf/httpd.conf を参照していました。そこで、このファイルに ServerName localhost:80 の設定を追加しましたが、apachectl restartした結果同じエラーが出ました。

もしかしてこのconfigが読まれていない?ということでconfigの場所を見てみます。 httpd -V または apachectl -V で見られます。

$ httpd -V
Server version: Apache/2.4.33 (Unix)
Server built:   Apr 10 2018 15:28:33
Server's Module Magic Number: 20120211:76
Server loaded:  APR 1.6.3, APR-UTIL 1.6.1
Compiled using: APR 1.6.3, APR-UTIL 1.6.1
Architecture:   64-bit
Server MPM:     prefork
  threaded:     no
    forked:     yes (variable process count)
Server compiled with....
 -D APR_HAS_SENDFILE
 -D APR_HAS_MMAP
 -D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
 -D APR_USE_SYSVSEM_SERIALIZE
 -D APR_USE_PTHREAD_SERIALIZE
 -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
 -D APR_HAS_OTHER_CHILD
 -D AP_HAVE_RELIABLE_PIPED_LOGS
 -D DYNAMIC_MODULE_LIMIT=256
 -D HTTPD_ROOT="/usr/local/Cellar/httpd/2.4.33"
 -D SUEXEC_BIN="/usr/local/opt/httpd/bin/suexec"
 -D DEFAULT_PIDLOG="/usr/local/var/run/httpd/httpd.pid"
 -D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
 -D DEFAULT_ERRORLOG="logs/error_log"
 -D AP_TYPES_CONFIG_FILE="/usr/local/etc/httpd/mime.types"
 -D SERVER_CONFIG_FILE="/usr/local/etc/httpd/httpd.conf"

みると /usr/local/etc/httpd/httpd.conf が参照されているようだったので、こちらを編集する必要がありそうです。

ServerName を書く

ServerName がコメントアウトされている行があったので、コメントアウトを外して以下のように書き換えました。

ServerName localhost:8080

以前の /etc/apache2/conf/httpd.conf の設定ではポートは80になっていましたが、/usr/local/etc/httpd/httpd.conf ではポート8080で動くようになっていました。とりあえず8080のまま動かしておくことにしました。古いconfを新しい方のconfにコピーしても動くかもしれないですが、とりあえずそのようなドラスティックなことはせず、地道に書き換えられるならその方針で行こうと思いました。

これを記載したうえで apachectl restart して localhost:8080 にアクセスしたら無事 It works! のページが表示されました。

PHPの問題

さて、PHPのバージョンが5.6から7に上がってしまったことに加え、先程のhttpd.confからもPHPの設定が消えてしまったので、このあたりをどうにかしなければなりません。

とりあえずPHPのバージョンが5.6から7になっても大きく困ることはないので、このままApacheにPHP7の設定をしてしまうことにしました。

brewでインストールされているPHPのディレクトリ

brewでインストールされたライブラリなどはだいたい /usr/local/Cellar以下にあります。phpであれば /usr/local/Cellar/php あたりです。これに関しては、 which コマンドあたりを活用してもわかります。

$ which php
/usr/local/bin/php

$ ls -la /usr/local/bin/php
lrwxr-xr-x  1 xxxxx  admin  27  4 10 16:12 /usr/local/bin/php@ -> ../Cellar/php/7.2.4/bin/php

今回brewでインストールされたのは PHP 7.2.4 だったため、 /usr/local/Cellar/php/7.2.4/ がPHPのディレクトリとなります。

Apache用のPHPモジュールのディレクトリ

だいたいは PHPのディレクトリ/lib/httpd/ とか PHPのディレクトリ/libexec/apache2 とかそのあたりにあります。

PHP7.2.4の場合、/usr/local/Cellar/php/7.2.4/lib/httpd/modules/libphp7.so にありました。

ApacheのconfigにPHPのLoadModulesを追加

httpd.confに以下を追加しました。

LoadModule php7_module /usr/local/Cellar/php/7.2.4/lib/httpd/modules/libphp7.so
AddHandler application/x-httpd-php .php

/usr/local/Cellar/php/7.2.4/lib/httpd/modules/libphp7.so この部分のバージョンなんかにあわせてください。

PHP5.6の時は LoadModule php5_module local/Cellar/php56/5.6.11_2/libexec/apache2/libphp5.so みたいな感じでした。

Handlerも追加する必要があるようです。PHP5.6の時はAddHandler無くても動いていましたが、PHP7から必要になったんでしょうか。

設定したら

設定を見たらわかると思いますが、ドキュメントディレクトリも /usr/local/var/www とかになってます(もともとは /Library/WebServers/Document とかそんなんだった)

これは httpd -S とかすればわかります。

$ httpd -S
VirtualHost configuration:
ServerRoot: "/usr/local/opt/httpd"
Main DocumentRoot: "/usr/local/var/www"
Main ErrorLog: "/usr/local/var/log/httpd/error_log"
Mutex default: dir="/usr/local/var/run/httpd/" mechanism=default
Mutex mpm-accept: using_defaults
PidFile: "/usr/local/var/run/httpd/httpd.pid"
Define: DUMP_VHOSTS
Define: DUMP_RUN_CFG
User: name="_www" id=70 not_used
Group: name="_www" id=70 not_used

ということで、 /usr/local/var/www とかに適当なPHPを置いて、 http://localhost:8080/hoge.php とかでアクセスしてPHPが動くことを確認します。

index.php がいい感じに表示されるやつ

http://localhost/ で index.html が表示されるように、index.php も表示されるようにしたいです。

httpd.conf で

<IfModule dir_module>
    DirectoryIndex index.html
</IfModule>

という行があるので

<IfModule dir_module>
    DirectoryIndex index.html index.php
</IfModule>

というように修正します。これでindex.phpが/で見られるようになります。

参考