apacheとnginxを共存させapacheから特定のドメインをnginxに転送させるようにしてみた

MACでPHPをapacheとnginxを共存させてapacheよりproxyで転送させて動かしてみました。
お客さんの環境により、apacheかnginxか異なる場合がありどちらでも対応可能にするために作業しました。
まぁvagrantでサーバ作っちゃえば？ってのもあったけど、結局サーバ作るには知らなきゃできないってことと、あと仮想マシン上げると遅くなるなーってのも気になったってので作業してみました。

そのうちtomcatも連携できるようにしようと考えています。

apacheで https://xxxx1.localhost を表示、xxxx2.localhostのドメインできた場合、10443に転送しnginxで https://xxxx2.localhost で表示させる。apacheでSSLは複合させることにしました。
またDBはMysqlを使用し同一のサーバにおくことにしました。


- データベースのインストール

データベースをインストールする。homebrew及びXcodeは先にインストールしておくこと。これでローカルにMysqlがインストールされます。

・XCodeのライセンスを読みましょう。最後にagreeでOK。

```
sudo xcodebuild -license
```

・mysqlを入れる。5.7が今は入るっぽい。

```
brew install mysql
```

・grantの仕方。以下のは全権限あげるので注意して使うこと。

```
mysql -u root
mysql>GRANT ALL PRIVILEGES ON *.* TO 'ユーザ名'@'サーバ名orIP' IDENTIFIED BY パスワード;
```

あとコンフィグを修正。いろいろ設定ありますが以下最低限いれときました。

```
$ cat /etc/my.cnf 
[client]
default-character-set=utf8mb4

[mysqld]
character-set-server=utf8mb4
skip-character-set-client-handshake
default-storage-engine=InnoDB

[mysqldump]
default-character-set=utf8mb4

[mysql]
default-character-set=utf8mb4
```

- アパッチ及びPHPの設定

デフォルトで入っているのでインストール作業は特にいらないです。但しPHPは最初動かないかもしれないので以下の定義が有効になっているか確認すること。

```
sudo vi /private/etc/apache2/httpd.conf
#LoadModule php5_module libexec/apache2/libphp5.so
```

※ここが#でコメントアウトされているようであれば解除すること。


PHPのバージョンが古い！って方は自分で新しいの入れてください。
以下のコマンドでいまあるPHPのレポジトリを検索し

```
brew search php
```

ほしいのを入れれば良い。

```
brew install php56
```

レポジトリがなければ追加する。

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

コンフィグ周りは以下最低限で設定。他は必要な都度入れる。

```shell:/etc/php.ini

date.timezone = Asia/Tokyo
default_charset = "UTF-8"
mbstring.language = Japanese
mbstring.internal_encoding = UTF-8
```

とりあえずhostsの合わせ技でドメインをhostsに登録しながらやる感じで行きます。

```shell:/etc/hosts
127.0.0.1 localhost xxx1.localhost xxx2.locahost #この後ろに追加していきます
```

次はバーチャルホストの定義

MACの場合 /etc/apache2/extra/ 配下に書きます。
以下はSSLがある場合の設定です。SSLは自前で作ってください。
ワイルドカードで作っておくと便利かもです。

```
Listen 443

SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5
SSLPassPhraseDialog  builtin
SSLSessionCache        "shmcb:/private/var/run/ssl_scache(512000)"
SSLSessionCacheTimeout  300

<virtualHost xxx1.localhost:443>
    SSLEngine on
    SSLProtocol all -SSLv2 -SSLv3
    SSLCertificateFile /private/etc/apache2/server.crt
    SSLCertificateKeyFile /private/etc/apache2/server.key
    ServerName xxx1.localhost
    DocumentRoot ドキュメントルート
    AllowEncodedSlashes On
    CustomLog      /private/var/log/apache2/ssl_localhost.log combined
    ErrorLog       /private/var/log/apache2/ssl_error.log
    TransferLog    /private/var/log/apache2/ssl_access.log
    <Directory ドキュメントルート>
        AllowOverride All
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>

```

- nginxのインストール

インストールします。

```
brew install nginx
```

以下がコンフィグファイルです。

```
/usr/local/etc/nginx/nginx.conf
```

中みると./servers/*をインクルードしているので
バーチャルホストを設定する場合は以下フォルダの配下にファイルを作成していきます。

```
/usr/local/etc/nginx/servers/
```

またコンフィグを作成したあとは以下でテストします。
以下のようにログがでれば問題なしです。

```
$ sudo nginx -t
nginx: the configuration file /usr/local/etc/nginx/nginx.conf syntax is ok
nginx: configuration file /usr/local/etc/nginx/nginx.conf test is successful
```

コンフィグは以下の通り。FPMも入れてみてます。

```
server {
        listen       10443;
        server_name  xxx2.localhost;
       root   ドキュメントフォルダ;

        location / {
            fastcgi_index  index.php;
            fastcgi_pass   unix:/usr/local/var/run/php-fpm.sock;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            index  index.html index.php;
        }
    }
```

FPMの設定も入れたので忘れずに設定

```
$ sudo vim /usr/local/etc/php/5.6/php-fpm.conf

listen = /usr/local/var/run/php-fpm.sock
listen.mode = 0664
listen.allowed_clients = 127.0.0.1
pm = static
pm.max_children = 1
catch_workers_output = yes
```

デーモンを起動するようにする。（なんか自分の環境だと~/Library/LaunchAgents/に入れても動かないのでデーモンに入れる。）

sudo ln -sfv /usr/local/opt/php56/*.plist /Library/LaunchDaemons/

デーモンを開始する。
sudo launchctl load -w /Library/LaunchDaemons/homebrew.mxcl.php56.plist

なお、FPMのログはここにあります。（homebrew.mxcl.php56.plistの中身見るとかいてあります）
cat /usr/local/opt/php56/var/log/php-fpm.log 

- Proxyの設定

これでnginxが起動できたので転送設定をします。

以下の設定を行いSSLをapacheで複合して転送させます。あとは追加していけば複数テストサイトが作成できます。

```
$ sudo vim /etc/apache2/extra/httpd-ssl.conf

以下追加する

<virtualHost xxx2.localhost:443>
    SSLEngine on
    SSLProtocol all -SSLv2 -SSLv3
    SSLCertificateFile /private/etc/apache2/server.crt
    SSLCertificateKeyFile /private/etc/apache2/server.key

    ServerName xxx2.localhost
    ProxyPreserveHost On
    ProxyPass / http://xxx2.localhost:10443
    ProxyPassReverse / http://xxx2.localhost:10443/
</VirtualHost>

```

これで各種ドキュメントフォルダに何かファイルを配置して
https://xxx1.localhost
https://xxx2.localhost
で見れればOK。

- 以下コマンド集


・アパッチの起動

```
sudo apachectl start
```

・アパッチの停止

```
sudo apachectl stop
```

・アパッチの再起動

```
sudo apachectl restart
```

・mysqlの起動

```
sudo mysql.server start
```

・mysqlの再起動

```
sudo mysql.server restart
```

・mysqlの停止

```
sudo mysql.server stop
```

・nginxの起動

```
nginx
```

・nginxの停止

```
nginx -s stop
```

・fpmの開始

```
launchctl load -w /Library/LaunchDaemons/homebrew.mxcl.php56.plist
```

・fpmの停止

```
launchctl unload -w /Library/LaunchDaemons/homebrew.mxcl.php56.plist
```