macOS High Sierra に Homebrew、phpbrew を使って Nginx + PHP をインストールするメモ

自分のパターンに全て合致する記事がなかったのでまとめました。

主にこのへんを参考にしています。

- [phpbrewでphpをインストールするときに詰まったこと](https://qiita.com/da-sugi/items/60b3c7a6ba1634f3341c)
- [Macにphpbrewをインストールしてphpをバージョン管理](https://qiita.com/wisteria3221/items/4aa5ed1a9d106c3f7990)


# インストール

## xcode をインストール

AppStore からインストール。

## HomeBrew をインストール

```:shell
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```
これにより `/usr/local/bin` が作成され、その中に実行ファイル `brew` が作成される。

## 依存ライブラリのインストール

PHPBrew で必要になるライブラリをインストール。`/usr/local/bin/` に色々インストールされる。
`brew link` によって `/usr/local/Cellar/` からもシンボリックリンクが張られる。

```:shell
$ brew install bzip2 curl intltool icu4c libxml2 mcrypt openssl readline zlib
$ brew link bzip2 --force
$ brew link curl --force
$ brew link icu4c --force
$ brew link libxml2 --force
$ brew link mcrypt --force
$ brew link zlib --force
```

以前のやり方では openssl も link していましたが、現在はエラーになるので行いません。


## PHPBrew をインストール

HomeBrew を使ってインストールする方法は使わず、 curl を使ってインストール。

```:shell
$ curl -L -O https://github.com/phpbrew/phpbrew/raw/master/phpbrew

# 実行属性を付けて、 /usr/local/bin/ に移動
$ chmod +x phpbrew
$ mv phpbrew /usr/local/bin/phpbrew

# phpbrew を初期化
$ phpbrew init
```

`phpbrew init` によって　`/Users/{ユーザー}/.phpbrew/` が作成される。

## PHPBrew を使って PHP をインストール

ここでは 7.2.10 をインストールしている。
`+defaults` によってよく使うオプションをインストールし、さらに Nginx で使うために mysql、php-fpm などのオプションも指定。

openssl の場所は HomeBrew によってインストールされたものを指定。

```:shell
$ phpbrew install 7.2.10 +default +mysql +fpm +openssl +curl +openssl=/usr/local/Cellar/openssl/1.0.2p 
```

インストールが終わったら bash 用の設定をします。

```:shell
$ echo "[[ -e ~/.phpbrew/bashrc ]] && source ~/.phpbrew/bashrc" >> ~/.bashrc
$ source ~/.phpbrew/bashrc
```

PHP のバージョンを切り替えます。

```:shell
# インストール前
$ which php
/usr/bin/php
$ php -v
PHP 7.1.16 (cli) (built: Apr  1 2018 14:10:37) ( NTS )

# PHPBrew でインストールしたものに切り替える
$ phpbrew use php-7.2.10
$ phpbrew switch php-7.2.10

# 切り替わったかを確認
$ which php
/Users/{ユーザー}/.phpbrew/php/php-7.2.10/bin/php
$ php -v
PHP 7.2.10 (cli) (built: Sep 14 2018 03:40:44) ( NTS )
```

## Nginx をインストール

```:shell
$ brew install nginx
```

デフォルトでは下記のような設定になっています。

- ポート： 8080
- ドキュメントルート： /usr/local/var/www

`/usr/local/etc/nginx/nginx.conf` を編集します。
`fastcgi_pass` に phpbrew のものを設定するのがキモです。

```:/usr/local/etc/nginx/nginx.conf
server {
    listen       8080;
    server_name  localhost;

    location / {
        root   /usr/local/var/www;
        index  index.html index.htm;
    }
    〜中略〜
    location ~ \.php$ {
        root           /usr/local/var/www;
        fastcgi_pass   unix:/Users/{ユーザー}/.phpbrew/php/php-7.2.10/var/run/php-fpm.sock;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
    〜中略〜

```

## Nginx の動作確認

PHP の対応はまだですが、ひとまず Nginx が動くか確認します。

```:shell
$ nginx
```

`http://localhost:8080/` にアクセスし、「Welcome to nginx!」という画面が出れば成功です。

## Nginx をサービスとして自動起動させる

```:shell
# 一度止める
$ nginx -s stop

# サービス登録
$ brew services start nginx
```

## PHP-FPM で PHP を使えるようにする

確認用の適当なファイルを `/usr/local/var/www/a.php` として作成します。

```:/usr/local/var/www/a.php
<?php phpinfo(); ?>
```

現在の状態で `http://localhost:8080/a.php` にアクセスしても「An error occurred.」というエラーが表示されるだけです。エラーログを確認してみましょう。

```:/usr/local/var/log/nginx/error.log
2018/09/14 04:18:56 [crit] 97484#0: *5 connect() to unix:/Users/dada/.phpbrew/php/php-7.2.10/var/run/php-fpm.sock failed (2: No such file or directory) while connecting to upstream, client: 127.0.0.1, server: localhost, request: "GET /a.php HTTP/1.1", upstream: "fastcgi://unix:/Users/{ユーザー}/.phpbrew/php/php-7.2.10/var/run/php-fpm.sock:", host: "localhost:8080"
```

ちなみに下記のようなエラーが出ている場合は `nginx.conf` の `fastcgi_pass` が間違えている可能性が大きいです。  

```:/usr/local/var/log/nginx/error.log
2018/09/14 00:54:04 [error] 48285#0: *37 kevent() reported that connect() failed (61: Connection refused) while connecting to upstream, client: 127.0.0.1, server: localhost, request: "GET /a.php HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "localhost:8080"
```

### PHP-FPM の起動

```:shell
$ phpbrew fpm start

```

これにより `/Users/{ユーザー}/.phpbrew/php/php-7.2.10/var/run/php-fpm.sock` が作成されます。

`http://localhost:8080/a.php` にアクセスして、PHP の情報が表示されれば成功です。

### PHP-FPM の自動起動

PHP が使えるようになりましたが、再起動すると PHP は使えなくなります。自動起動するようにしましょう。

`~/Library/LaunchAgents/` に `localhost.php.7.2.10.php-fpm.plist` を作成します。

参考：[launchdで複数バージョンのPHP-FPMを自動起動する](https://hnw.hatenablog.com/entry/20130628)

```:~/Library/LaunchAgents/localhost.php.7.2.10.php-fpm.plist
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>Label</key>
    <string>localhost.php.7.2.10.php-fpm</string>
    <key>RunAtLoad</key>
    <true/>
    <key>KeepAlive</key>
    <false/>
    <key>ProgramArguments</key>
    <array>
        <string>/Users/{ユーザー}/.phpbrew/php/php-7.2.10/sbin/php-fpm</string>
        <string>--nodaemonize</string>
    </array>
  </dict>
</plist>
```

再起動すると `http://localhost:8080/a.php` が見えるようになります。