HomebrewでApacheとPHP-FPMをインストールする


Macで新しめのPHPを使うには、XAMPPやphpenvなどいくつかの方法があるが、Homebrewでもインストールできる。

（参考）[MacにあたらしめなPHPを簡単便利に入れる方法たくさん - uzullaがブログ](http://uzulla.hateblo.jp/entry/2013/12/29/224058)

以前はjosegonzalez/phpなどの外部リポジトリを使う必要があったが、現在はPHP関連のbrewが[Homebrew/homebrew-php](https://github.com/Homebrew/homebrew-php)としてまとめて整備された。なのでHomebrewでインストールするのはXAMPPの次くらいに簡単になっている。

- 何も考えずApache+PHP+MySQLを簡単に動かしたい人、既存の環境と分離したい人はXAMPPを、
- 複数バージョンを使い分けたい上級者であればphpenvを、
- 最新のPHPを使いたいけどphpenvはしんどすぎるという人はHomebrewを、

となるだろうか。

今回はPHP（とApacheも）をHomebrewでインストールし、mod_phpではなくPHP-FPMでPHPを動かしてみる。

## 準備

[Homebrew Apache](https://github.com/Homebrew/homebrew-apache)と[Homebrew PHP](https://github.com/Homebrew/homebrew-php)に従いインストールしていく。

まず必要なリポジトリを`brew tap`で追加する。

- `homebrew/dupes`：Macに既に入っているソフトの最新版/バグ修正版を提供する
- `homebrew/versions`：古いバージョンのソフトを提供する

```
brew tap homebrew/dupes
brew tap homebrew/versions
brew tap homebrew/homebrew-php
brew tap homebrew/apache
```

各ソフトのインストールオプションは`brew options パッケージ名`で確認できる。

```
brew options php56
```

## Apache（2.4）をインストールする

HomebrewのApacheはsudoなしで起動できるように、デフォルトでは8080番ポートを使うように設定されている。
`--with-privileged-ports`を指定すると80番ポートを使うようにできる。

また、MPMもデフォルトではPreforkとなっているが、今回はPHP-FPMを使うのでPrefork MPMにしなくてもよい。
`--with-mpm-event`でApache2.4から標準のEvent MPMを使うようにする。

Mac起動時に自動起動するにはインストール後のメッセージに従い、LaunchDaemons/LaunchAgentsに登録する。

- `--with-privileged-ports`：8080番ポートではなく80番ポートを使う
- `--with-mpm-event`：Event MPMを使う
- インストール後のメッセージに従い、自動起動させるようにする

```
brew install httpd24 --with-privileged-ports --with-mpm-event

# `--with-privileged-ports`を指定した場合
sudo cp -v /usr/local/Cellar/httpd24/2.4.10/homebrew.mxcl.httpd24.plist /Library/LaunchDaemons
sudo chown -v root:wheel /Library/LaunchDaemons/homebrew.mxcl.httpd24.plist
sudo chmod -v 644 /Library/LaunchDaemons/homebrew.mxcl.httpd24.plist
sudo launchctl load /Library/LaunchDaemons/homebrew.mxcl.httpd24.plist

# `--with-privileged-ports`を指定しなかった場合
ln -sfv /usr/local/opt/httpd24/*.plist ~/Library/LaunchAgents
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.httpd24.plist
```

## PHP（5.6）をインストールする

`--with-fpm`でPHP-FPMを使うようにして、PHPをインストールする。結構時間がかかる。

- `--with-fpm`：PHP-FPMを有効化する
- Apacheと同様、自動起動させる

```
brew install php56 --with-fpm

ln -sfv /usr/local/opt/php56/*.plist ~/Library/LaunchAgents
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.php56.plist
```

## 起動・停止

自動起動する設定にしていれば、既にApacheが[localhost](http://localhost/)で起動している。アクセスして「It works!」と表示されればOK。

起動・停止は以下のように行う。長いので`alias`とかしておくといいかも

```
# Apache（80番ポートを使うためsudoが必要）
sudo launchctl unload /Library/LaunchDaemons/homebrew.mxcl.httpd24.plist
sudo launchctl load /Library/LaunchDaemons/homebrew.mxcl.httpd24.plist

# PHP-FPM
launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.php56.plist
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.php56.plist
```

## パス設定
ApacheやPHPはMacに標準添付されているので、そのままだとそちらが優先されてしまう。

```
which apachectl
```

を実行して`/usr/local/bin/apachectl`となっていなければ、`/usr/local`以下が優先されるようにPATHの設定をしておく。

```
echo 'export PATH="/usr/local/bin:/usr/local/sbin:$PATH"' >> ~/.bash_profile
exec $SHELL -l
```

## PHP-FPMの設定

ApacheをPHP-FPMと連携させるには、`mod_proxy_fcgi`を使うのが現在では一般的のようだ。

`/usr/local/etc/apache2/2.4/httpd.conf`を編集する。

```apache:httpd.conf
# 125行目付近：コメントを外し、必要なモジュールを有効化
LoadModule proxy_module libexec/mod_proxy.so
LoadModule proxy_fcgi_module libexec/mod_proxy_fcgi.so
```

あとは最低限、

```apache:httpd.conf
DirectoryIndex index.php index.html

<FilesMatch \.php$>
    SetHandler "proxy:fcgi://127.0.0.1:9000"
</FilesMatch>
```

と設定すれば動く。

お好みのバーチャルホスト設定をするならそこに書けばいいし、デフォルト設定でよければ`httpd.conf`の最後にこのように書く。

```apache:httpd.conf
<VirtualHost *:80>
    ServerName localhost
    DocumentRoot "/usr/local/var/www/htdocs"

    DirectoryIndex index.php index.html

    <FilesMatch \.php$>
        SetHandler "proxy:fcgi://127.0.0.1:9000"
    </FilesMatch>
</VirtualHost>
```

ファイル名が`.php`で終わる場合、`127.0.0.1:9000`で起動するFastCGI（=PHP-FPM）に処理を任せる、となる。

`ProxyPassMatch`を使う方法もあるが、様々な問題があるので推奨されていない（[ApacheでPHP-FPMを動かすなら、ProxyPassMatchではなくSetHandlerを使うのがいいらしい - Qiita](http://qiita.com/shimoju/items/8e9c2a7bddd64e878799)）

設定したら、

```
apachectl configtest
```

で設定ファイルをチェックし、`Syntax OK`と出れば問題なし。

（なんかメッセージが出るがこれは無視してよい。気持ち悪ければ、`ServerName localhost`とhttpd.confの上の方に書いてきちんとServerNameを設定しておく）

終わったらApacheを再起動する

```
sudo launchctl unload /Library/LaunchDaemons/homebrew.mxcl.httpd24.plist && sudo launchctl load /Library/LaunchDaemons/homebrew.mxcl.httpd24.plist
```

## 設定確認

`/usr/local/var/www/htdocs/`に`index.php`を作成し、

```php:index.php
<?php
phpinfo();
```

と書いて、[localhost](http://localhost/)にアクセスし、phpinfoの画面が表示されれば無事設定完了となる。

あとはきちんとバーチャルホストを作ったり、MySQLをインストールするなりしていく。