Cakephp3 + CentOS7 + Vagrant + Apache + MySQL 環境セットアップ

# 目次と概要
Cakephpを起動、DBと接続、Cakephpの開発開始できるまでを目標にします。
1.　Vagrantのインストールと初期設定を実施します。
2.　Vagrantの設定ファイル（provision.sh）に各プログラムのインストールと設定を記述していきます。こうすることで、Vagrant初期起動時に必要なプログラムがインストールされ、次の開発環境セットアップも楽になる。（Anaibleはまだ導入できていません(´；ω；`)）
3.　Vagrant起動後にCakephpのインストール、設定を行います。
4.　MySQLの設定を行います。
5.　ハマりポイント解説
6.　結びに
# 本編
## 1. Vagrantのインストールと初期設定
Vagrantのインストールと初期設定は下記サイトを参考に実施しました。
（私はCentOS Linux release 7.3.1611 を使用しました。）
https://qiita.com/Esfahan/items/41c4469f28f6011ab33b
### Vagrantfile設定
Vagrantfile内の以下内容を編集します。

```Vagrantfile
# provision.shファイルの起動設定
config.vm.box = "bento/centos-7.3"

config.vm.provision :shell, :path => "provision.sh" //足す
```

```Vagrantfile
# VMのIPアドレスを設定
config.vm.network "private_network", ip: "192.168.33.111"
```

```Vagrantfile
# パーミッションの設定 <超ハマりポイント>
# パーミッション設定しないと、Cakephp画面が表示されません。”777”ではなく、”755”でもOK。
config.vm.synced_folder "./", "/vagrant", :mount_options => ["dmode=777", "fmode=777"]
```

## 2. "provision.sh"ファイルに、各プログラムのインストール、設定を記述
Vagrantfileと同じフォルダに"provision.sh"を作成。
各プログラムのインストール、設定を"provision.sh"内に記述し、Vagrant起動と合わせて行います。

```
# Apache、git、unzipのインストール
sudo yum -y install httpd unzip git

# PHPのインストール。Epel, Remiリポジトリから行います。
sudo yum -y install epel-release
sudo yum -y install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
sudo yum -y install --enablerepo=remi,remi-php71 php php-devel php-mbstring php-intl php-mysql php-xml

# MySQLのインストール
sudo yum -y install http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm
sudo yum -y install mysql-community-server

# Cakephpコンポーザーのダウンロートとコンポーザーを/bin下に移動
curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer

# ApcheをVagrant起動時に起動するように設定と起動
sudo systemctl enable httpd.service
sudo systemctl start httpd.service

# Vagrantの共有フォルダにパスを設定
sudo rm -rf /var/www/html
sudo ln -fs /vagrant /var/www/html

#MySQLをVagrant起動時に起動するように設定と起動
sudo systemctl enable mysqld.service
sudo systemctl start mysqld.service
```

できましたら、Vagrantを起動してください。

```
vagrant up
```

ssh起動後、各プログラムが正しくインストールされているかは下記コマンドで確認してください。

```
vagrant ssh
php -v
httpd -version
mysql --version
```

## 3. Vagrant起動後に必要な設定を行なっていきます。

```
# ApacheのDocumentRootに移動
cd /var/www/html/
# Composerを用いて展開
composer create-project --prefer-dist cakephp/app myapp　
```

`myapp`フォルダが作成され、Cakephpファイルがインストールされます。
2．にてVagrant共有フォルダにパスを設定しているため、`Vagrantfile`と`provision.sh`と同じフォルダからも確認できます。
それでは、1．にて設定したVMのIPアドレスにブラウザからアクセスしましょう。
→http://192.168.33.111/myapp/

![CakePHP  the rapid development PHP framework.png](https://qiita-image-store.s3.amazonaws.com/0/217439/48ffaf67-66b6-019c-4b34-7537ef87c35d.png)

なんか味気ない画像が表示されるかと思いますが、こちらはCSSファイルが適用されていません。
CSSファイル設定のためにApacheコンフィグの設定を行います。
ssh起動後、下記の設定を行なってください。

```
# コンフィグファイルの設定編集します。
sudo vi /etc/httpd/conf/httpd.conf
```

```
<Directory "/var/www/html">
　　 ~
    Options FollowSymLinks
    ~
    AllowOverride All ←NoneからAllにする
</Directory>
```

```
# 設定を反映させるために、Apcheの再起動を行います。
sudo systemctl restart httpd
```

もう一度アクセスすると、

![CakePHP  the rapid development PHP framework.png](https://qiita-image-store.s3.amazonaws.com/0/217439/5e1a88ef-e24a-77c8-a850-1f96adca527d.png)

このようにいい感じのページが表示されます。
## 4. MySQLの設定を行います。
MySQLのデータベース、ユーザー設定を行なった上で下記設定を行なってください。
~config/app.phpを開き、SQLのユーザー名、パスワード、データベース名を記述します。

```
'Datasources' => [
  'default' => [
     ~
     'username' => 'my_app',  //編集する
     'password' => 'secret',　//編集する
     'database' => 'my_app',　//編集する
     'encoding' => 'utf8',
     'timezone' => 'UTC',
     'flags' => [],
      'cacheMetadata' => true,
      'log' => false,
```

DBへのアクセスが成功すれば、Cakephpのトップ画面がこう変わります。
![CakePHP  the rapid development PHP framework.png](https://qiita-image-store.s3.amazonaws.com/0/217439/fbfc73ff-0e58-4df3-a4d5-5a467646bb93.png)
　　　↓
![CakePHP  the rapid development PHP framework(1).png](https://qiita-image-store.s3.amazonaws.com/0/217439/9f11424e-e451-a96b-ed85-998c11ab177e.png)
## 5. ハマりポイント解説
#### パーミッション設定
この環境の場合、パーミッションの設定は通常のCakephpと同様にはできず、これがハマる原因になります。通常は、パーミッションの設定はCakephpのコンフィグファイル`app.php`で下記のようにできるですが…

```
'Cache' => [
  'default' => [
    'className' => 'File',
    'path' => CACHE,
  ],

  '_cake_core_' => [
    'className' => 'File',
    'prefix' => 'myapp_cake_core_',
    'path' => CACHE . 'persistent/',
    'serialize' => true,
    'duration' => '+2 minutes',
    'mask' => 0666,//666にする or 777
  ],

  '_cake_model_' => [
    'className' => 'File',
    'prefix' => 'myapp_cake_model_',
    'path' => CACHE . 'models/',
    'serialize' => true,
    'duration' => '+2 minutes',
    'mask' => 0666,//666にする or 777
  ],
],
```

今回の環境では、Vagrantのため、この設定はできません。VagrantではVagrant上での設定を優先するため、書き換えたとしても、すぐにVagrantの設定にて自動で書き換えられてしまうようです。
そのため、`Vagrantfile`にてパーミッションの設定を行う必要があります。
#### MySQLの選定
今回はバージョン5.6を採用しています。現在(2018/2)最新版は5.7ですが、こちらはルートパスワードの設定やら、初期設定がめんどいの人つ古いバージョンを使用しています。
## 6. 結びに
全部を書ききれてはないとは思いますが、私はこれだけあれば来月もセットアップできると思います。つまり、大体みんなできるだろうと。そもそもVagrantに手を出すなら、大体わかるんじゃないだろうか。私はVagrantとかは使ってたのに、SQLをほとんど触ったことがなく、SQL周りで苦労しました。この記事が、後から来る者の道を整えることができることを祈ります。