手元の環境構築手順（macOS Sierra）

2017/05/31
Chrome 58 からこの方法のSSL環境は証明書エラーになってしまいます(´д｀)
[こちらの記事](http://qiita.com/tanakachang/items/c4cf9d55c8e36ac46610)を参考に証明書を作ることで回避できます。

いつもは最初から入っているApacheとbrewのphpとmysqlって組み合わせにしていたけど、MacBookを初期化したタイミングでnginxとphp-fpmとmariadbにしてみたので、備忘録として残す。（2017年1月16日）

Dockerとかお勉強中だけど、やっぱ手元でぶん回せる環境は欲しいよなぁ。

# Homebrew

これが無いとはじまらない。

```bash
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

以降、ざっと必要な物をインストール

## dnsmasq

いちいち、hostsファイルをいじりたくないからね。

```bash
$ brew install dnsmasq
$ cp /usr/local/opt/dnsmasq/dnsmasq.conf.example /usr/local/etc/dnsmasq.conf
$ echo 'address=/dev/127.0.0.1' >> /usr/local/etc/dnsmasq.conf
$ sudo brew services start dnsmasq
$ sudo mkdir /etc/resolver
$ echo 'nameserver 127.0.0.1' | sudo tee /etc/resolver/dev
```

参考: [osxでプロダクションに限りなく近い開発環境を準備する](http://qiita.com/geta6/items/8faacf8efcf70e74875a)

## nginx

SSLの設定もするので、http2付けてみた。

```bash
$ brew install nginx --with-http2
$ sudo brew services start nginx
```

起動時は80番ポートを使うので、sudoで。
この状態で http://localhost:8080 で nginx の Hello! みたいなのが見られるはず。

細かい設定は後ほど。

## php

バージョンはとりあえず最新で。`php56`でも`php70`でも同じかな。

```bash
$ brew tap homebrew/php
$ brew install php71
$ brew services start php71
```

いつもは、Apache用に`--with-httpd24`ってつけていたけど、もう要らないね。

手元の環境でパーミッションとか面倒なので、phpの実行ユーザーを自分にしておく。

```ini:/usr/local/etc/php/7.1/php-fpm.d/www.conf
user = nemooon
group = staff
```

設定変えたら、再起動。

```bash
$ brew services restart php71
```

## mariadb

特に変わったことはなし。

```bash
$ brew install mariadb
$ brew services start mariadb
```

初期状態は`root`でパスワード無し。

この辺もMySQLと変わらないのね。

```bash
$ mysql_secure_installation
```

Sequel Pro で適当にユーザー作る。

## yarn

最近は「にゃーん」ですね。

```bash
$ brew install yarn
```

これで`node`も勝手に入る。

# 諸々の設定

インストールは終わったところで、Laravelが動くくらいまでの設定をば。
なお、`~/Workspace/`に色々と溜め込む方向。

## nginxの設定

まずはディレクトリを作っておく。

```bash
$ mkdir -p ~/Workspace/nginx
$ cd ~/Workspace/nginx
$ mkdir logs servers ssl
```

`nginx.conf`をいじって、`Workspace`の設定を読ませる。
serverディレクティブを全部コメントアウトして、
最後にある`include servers/*;`の後に以下を追記。

```nginx:/usr/local/etc/nginx/nginx.conf
include /Users/nemooon/Workspace/nginx/servers/*
```

http://localhost 用のVirtualHost設定を作る。

```nginx:~/Workspace/nginx/localhost.conf
server {
    listen 80 default_server;
    server_name localhost;
    root /Users/nemooon/Workspace/localhost;

    index index.html index.htm index.php;

    charset utf-8;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    access_log  off;
    error_log  /Users/nemooon/Workspace/nginx/logs/localhost-error.log error;

    error_page 404 /index.php;

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        include fastcgi_params;
    }

    location ~ /\.ht {
       deny  all;
    }
}
```

`fastcgi_params`の最後に以下を追記。

```nginx:/usr/local/etc/nginx/fastcgi_params
fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
fastcgi_param  PATH_INFO          $fastcgi_path_info;
fastcgi_param  PATH_TRANSLATED    $document_root$fastcgi_script_name;
```


設定を確認して、nginxをリロードする。

```bash
$ sudo nginx -t
$ sudo nginx -s reload
```

ドキュメントルートに適当に`index.html`とか`phpinfo();`書いたPHPファイルを置いて確認する。

## SSLの設定

ついでに https://localhost を表示出来るようにする。

まずは、`ssl_dhparam`用のDH交換鍵とやらを作る。

```bash
$ cd ~/Workspace/nginx/ssl
$ openssl dhparam 2048 -out dhparams.pem
```

お次は、localhost用の鍵を作る。

```bash
$ cd ~/Workspace/nginx/ssl
$ openssl genrsa -out localhost.key 2048
$ openssl req -new -x509 -key localhost.key -out localhost.crt -days 3650 -subj /CN=localhost
$ sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain localhost.crt
```

別のホスト用の鍵を作るときは`localhost`の部分を`hoge.dev`とかに置換でOK。

`localhost.conf`に`listen 443 ssl http2;`と、出来上がった鍵の記述を追加。

```nginx:~/Workspace/nginx/localhost.conf
server {
    listen 80 default_server;
    listen 443 ssl http2;
    server_name localhost;
    root /Users/nemooon/Workspace/localhost;

    ssl_certificate     /Users/nemooon/Workspace/nginx/ssl/localhost.crt;
    ssl_certificate_key /Users/nemooon/Workspace/nginx/ssl/localhost.key;

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
    ssl_prefer_server_ciphers on;
    ssl_dhparam /Users/nemooon/Workspace/nginx/ssl/dhparams.pem;

    index index.html index.htm index.php;

    charset utf-8;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    access_log  off;
    error_log  /Users/nemooon/Workspace/nginx/logs/localhost-error.log error;

    error_page 404 /index.php;

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        include fastcgi_params;
    }

    location ~ /\.ht {
       deny  all;
    }
}
```

保存した、nginxを再起動。

```bash
$ sudo nginx -t
$ sudo nginx -s reload
```

これで、 https://localhost が動く。
キーチェーンに登録したから、アドレスバーのところが緑色になって気分がイイネ。


# でも、Apache環境も欲しい

でもさー、やっぱり Apache 案件が絶対あるよねー
ということで、8080番ポートで動かして nginx からプロキシしてみる。

## httpd24 + mod_rpaf

`mod_rpaf`でリバースプロキシ時に上手く SSL やってくれるモノがある。
ので、ここでも最初から入っている Apache には手を出さず、homebrew から入れる。

```bash
$ brew install httpd24
$ brew install mod_rpaf --with-homebrew-httpd24
$ brew services start httpd24
```

今回は8080番ポートなんで、起動時にsudo要らないです。

## php56

どうせなら、phpも別バージョンを入れましょう。

```bash
$ brew install php56 --with-httpd24
```

今回は、Apache 用なので、`--with-httpd24`を付けましょう。
別に同じバージョンでもいいけど、この記事どおりなら、`php71 --with-httpd24`でインストールし直しです。

## Apacheの設定

まずは、Apache を8080番ポートで動かす。
Apache も nginx 同様、Workspace にディレクトリを作る。

```bash
$ mkdir -p ~/Workspace/apache
$ cd ~/Workspace/apache
$ mkdir logs vhosts
```

`rewrite_module`のLoadModuleのコメントアウトを外して、
`php5_module`と`rpaf_module`の記述を追加。

```apache:/usr/local/etc/apache2/2.4/httpd.conf
LoadModule rewrite_module libexec/mod_rewrite.so
LoadModule php5_module /usr/local/opt/php56/libexec/apache2/libphp5.so
LoadModule rpaf_module /usr/local/opt/mod_rpaf/libexec/mod_rpaf.so
```

あと、例のごとくパーミッションとか面倒なのでユーザー変える。

```apache:/usr/local/etc/apache2/2.4/httpd.conf
User nemooon
Group staff
```

末尾まで来たら、`php5_module`と`rpaf_module`の設定を追加。
ついでに、Workspace ディレクトリ以下の設定をまとめて。

```apache:/usr/local/etc/apache2/2.4/httpd.conf
<IfModule php5_module>
	AddType application/x-httpd-php .php
	AddType application/x-httpd-php-source .phps
	<IfModule dir_module>
		DirectoryIndex index.php index.html
	</IfModule>
</IfModule>

<IfModule mod_rpaf.c>
	RPAF_Enable      On
	RPAF_Header      X-Real-Ip
	RPAF_ProxyIPs    127.0.0.1
	RPAF_SetHostName On
	RPAF_SetHTTPS    On
	RPAF_SetPort     On
</IfModule>

<Directory /Users/nemooon/Workspace>
	Options All
	AllowOverride All
	Order allow,deny
	Allow from all
	Require all granted
</Directory>
```

まずは http://localhost:8080 の VirtualHost の設定を追加。

```apache:~/Workspace/apache/vhosts/localhost.conf
<VirtualHost _default_:8080>
	ServerName localhost
	DocumentRoot /Users/nemooon/Workspace/localhost
	CustomLog /dev/null common env=0
	ErrorLog /Users/nemooon/Workspace/apache/logs/localhost-error_log
</VirtualHost>
```

と、Apache 環境用 http://legacy.dev:8080 の VirtualHost も追加。

```apache:~/Workspace/apache/vhosts/legacy.dev.conf
<VirtualHost _default_:8080>
	ServerName legacy.dev
	DocumentRoot /Users/nemooon/Workspace/legacy.dev
	CustomLog /dev/null common env=0
	ErrorLog /Users/nemooon/Workspace/apache/logs/legacy.dev-error_log
</VirtualHost>
```

必要な設定ができたら、保存して、Apache を再起動。

```bash
$ apachectl -t
$ apachectl restart
```

`phpinfo();`あたりを設置して、 http://localhost:8080 と http://legacy.dev:8080 をチェック。

## nginxの設定

Apache 側はもう受ける準備が整っているので、次は nginx 側の設定を追加します。

いや、8080番ポートで問題ないなら、別にこの先不要なんですよね。
せっかく nginx がいるのなら、80番とか443番みたく、見せたいじゃあないですか。

まずは、80番ポート用のプロキシ設定。
`server_name`はスペース区切りで複数 Apache 用環境のホスト名を記述すれば設定はこれだけでOK。

```nginx:~/Workspace/nginx/servers/apache_proxy.conf
server {
    listen 80;
    server_name legacy.dev;

    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host               $host;
        proxy_set_header X-Real-IP          $remote_addr;
        proxy_set_header X-Forwarded-For    $remote_addr;
        proxy_set_header X-Forwarded-Proto  $scheme;
    }
}
```

保存して、nginx をリロードする。

```bash
$ sudo nginx -t
$ sudo nginx -s reload
```

これで、 http://legacy.dev が http://legacy.dev:8080 にプロキシされます。

次は443番ポート用の設定です。
今回はホスト名毎に鍵の設定を追記しないといけませんので、ホスト名毎に用意しましょう。
＃鍵の生成は、前述のやり方と同じです。

```nginx:~/Workspace/nginx/servers/apache_proxy.conf
server {
    listen 443 ssl http2;
    server_name legacy.dev;

    ssl_certificate     /Users/nemooon/Workspace/nginx/ssl/legacy.dev.crt;
    ssl_certificate_key /Users/nemooon/Workspace/nginx/ssl/legacy.dev.key;

    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host               $host;
        proxy_set_header X-Real-IP          $remote_addr;
        proxy_set_header X-Forwarded-For    $remote_addr;
        proxy_set_header X-Forwarded-Proto  $scheme;
    }
}
```

保存して、nginx をリロードする。

```bash
$ sudo nginx -t
$ sudo nginx -s reload
```

これで、 https://legacy.dev が、SSL接続で http://legacy.dev:8080 にプロキシされます。


以上で、Apache 環境も設定できたことですし、メデタシメデタシ。


※ 検証しながらやりましたが、記事は継ぎ接ぎなのでどっかしら間違っているかもネー。