[LAMP]VagrantでCentOS7+Apache2.4+PHP7.1+MySQL5.7&Phalcon3.1.2環境を構築する

#はじめに
この記事はmacOS Sierra (10.12.1)環境にて実施した内容をメモとして残しているものです。
上記環境以外の方は適宜置き換えて解釈していただけると幸いです。
また、導入しているパッケージ等は投稿者の好みによるものです。
*最終更新：2017.06.06*

#0.Vagrant環境構築
Vagrantで構築しない場合はこの手順は不要

## 各種ツールDL&インストール

**VirtualBox**
http://www.oracle.com/technetwork/server-storage/virtualbox/downloads/index.html?ssSourceSiteId=otnjp

**Vagrant**
https://www.vagrantup.com/downloads.html


## Vagrant準備

### BOX追加
```bash:コマンド
vagrant box add CentOS7 https://github.com/holms/vagrant-centos7-box/releases/download/7.1.1503.001/CentOS-7.1.1503-x86_64-netboot.box
```

### 初期化
```bash:コマンド
mkdir /vagrant/CentOS7 && cd $_
vagrant init CentOS7
```

### 設定
お好みでVagrantfileを編集する

```rb:Vagrantfile
# ホスト名
config.vm.hostname = "centos7.vm"
# ネットワーク
config.vm.network "private_network", ip: "192.168.33.10"
# ドキュメントルートを同期フォルダにする ※この設定はhttpdのインストールが終わってからやる
config.vm.synced_folder "/var/www", "/var/www", owner: "apache", group: "apache", mount_options: ["dmode=777", "fmode=777"]
```

### 起動
*※上記で作成したディレクトリ内で実行*

```bash:コマンド
vagrant up
```



#1.CentOS7初期設定

## rootユーザーになっておく
```bash:コマンド
sudo su -
```

## アップデート
```bash:コマンド
yum -y update
```

### 一応バージョン確認しておく
*※ 2017.06.06時点では、ここでバージョンが7.3.1611になります*

```bash:コマンド
cat /etc/redhat-release
```
```bash:結果
CentOS Linux release 7.3.1611 (Core)
```

## Vimを入れる
### インストール
```bash:コマンド
yum -y install vim-enhanced
```

### エイリアス設定
```bash:コマンド
echo alias vi='vim' >> /etc/profile
source /etc/profile
```

## 時刻同期設定

### chronyインストール
```bash:コマンド
yum install -y chrony
```

### chronyサービス登録
```bash:コマンド
systemctl enable chronyd
```
####サービス登録されたか確認
```bash:コマンド
systemctl list-unit-files -t service | grep chronyd
```
```text:結果
chronyd.service                             enabled
```

### 同期サーバーを日本のサーバーにする
```bash:コマンド
vim /etc/chrony.conf
```
```text:/etc/chrony.conf
server ntp.nict.jp iburst
server ntp1.jst.mfeed.ad.jp iburst
server ntp2.jst.mfeed.ad.jp iburst
server ntp3.jst.mfeed.ad.jp iburst
```
### タイムゾーンをAsia/Tokyoに設定
```bash:コマンド
timedatectl set-timezone Asia/Tokyo
```

### chronyを再起動
```bash:コマンド
systemctl start chronyd
```

## Firewall設定

### Firewallを止める
```bash:コマンド
systemctl stop firewalld
```
### サービスを無効にする
```bash:コマンド
systemctl disable firewalld
```
####無効になったか確認
```bash:コマンド
systemctl list-unit-files -t service | grep firewalld
```
```text:結果
firewalld.service                           disabled
```


※何かと邪魔になりそうなのでローカルと割り切って止めますが、公開サーバーの場合はオススメしません。


## 日本語対応にする
### NKFのインストール
```bash:コマンド
cd /tmp
wget "http://sourceforge.jp/frs/redir.php?m=jaist&f=%2Fnkf%2F59912%2Fnkf-2.1.3.tar.gz" -O nkf-2.1.3.tar.gz
tar zxvf nkf-2.1.3.tar.gz
cd nkf-2.1.3
make && make install
rm -rf nkf-2.1.3*
ln -s /usr/local/bin/nkf /usr/bin/nkf
```

### 日本語関連パッケージのインストール
```bash:コマンド
yum -y install ibus-kkc vlgothic-*
```

### システム文字セット変更
```bash:コマンド
localectl set-locale LANG=ja_JP.UTF-8
source /etc/locale.conf 
```

## 各種リポジトリ登録

### リポジトリ優先度プラグイン
```bash:コマンド
yum -y install yum-plugin-priorities
```
*これは使用する場合のみでOK*

### EPEL
```bash:コマンド
yum -y install epel-release
```
####デフォルトでは無効にする
```bash:コマンド
sed -i -e "s/enabled=1/enabled=0/g" /etc/yum.repos.d/epel.repo
```

### Remi
```bash:コマンド
yum -y install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
```
*失敗する場合は以下で…*

```bash:コマンド
cd /tmp && wget http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
yum -y install /tmp/remi-release-7.rpm
rm -f remi-release-7.rpm
```


### MySQL5.7
```bash:コマンド
yum -y install http://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpm
```

### Nginx
```bash:コマンド
yum -y install http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
```

## 再起動
```bash:コマンド
reboot
```

#2.LAMP+いろいろ環境構築

## httpd
### インストール
```bash:コマンド
yum -y install httpd
```

### 初期設定
```bash:コマンド
vim /etc/httpd/conf/httpd.conf
```

ネットワークマウントやNFSマウントされたドキュメントルートでは、
静的ファイルへの変更が反映されなかったりするので以下の設定をしておく

```apache:/etc/httpd/httpd.conf
EnableMMAP off
EnableSendfile off
```

### 起動
```bash:コマンド
systemctl start httpd
```

### サービス登録
```bash:コマンド
systemctl enable httpd
```
#### サービス登録されたか確認
```bash:コマンド
systemctl list-unit-files -t service | grep httpd
```
```text:結果
httpd.service                               enabled
```

## MySQL 5.7
### インストール
```bash:コマンド
yum -y install mysql-community-server
```

### サービス登録
```bash:コマンド
systemctl enable mysqld
```
#### サービス登録されたか確認
```bash:コマンド
systemctl list-unit-files -t service | grep mysqld
```
```text:結果
mysqld.service                              enabled
```

### お好みに応じて設定を変更
#### my.cnfバックアップ
```bash:コマンド
mv /etc/my.cnf /etc/my.cnf.bk
```

#### my.cnfの内容を書き換える
```bash:コマンド
cat <<EOF > /etc/my.cnf
[mysqld]
skip-character-set-client-handshake
character-set-server = utf8
collation-server = utf8_general_ci
init-connect = SET NAMES utf8
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
EOF
```

rootパスワードを無効化しちゃう
（おすすめはしません！）

```text:/etc/my.cnf
[mysqld]
skip-grant-tables
```

### 起動
```bash:コマンド
systemctl start mysqld
```

### パスワードの確認
MySQL5.7から初期パスワードが自動生成される為、確認する必要があるらしい。
#### 一度ログインを試みる
```bash:コマンド
mysql -uroot -p
```

#### ログファイルにて確認
```bash:コマンド
cat /var/log/mysqld.log | grep "temporary password"
```
```text:/var/log/mysqld.log
2016-11-08T06:13:33.695967Z 1 [Note] A temporary password is generated for root@localhost: {ここにパスワード}
```

### 初期セットアップ
```bash:コマンド
mysql_secure_installation
```
```text:mysql_secure_installation
# パスワード要求
> Enter current password for root (enter for none):
  {上記にて調べた初期パスワードを入力}

# パスワードの変更を求められる
> The existing password for the user account root has expired. Please set a new password.
> New password:
  {新しいパスワードを入力}
> Re-enter new password:
  {パスワードを再入力}

※この時、ポリシーに反しているとやり直しさせられる。
ポリシーの初期値はMEDIUMで、長さは8字以上で英字大小/数字/特殊文字(英数以外の記号)を1つ以上ずつ含む必要があるらしい。
例：P@ssword#123

# root ユーザーのパスワードを変更するか？
> Change the password for root ? ((Press y|Y for Yes, any other key for No) :
  {先程変更してるので空Enter}

# 匿名ユーザーを削除するか？
> Remove anonymous users? (Press y|Y for Yes, any other key for No) :
  {'y'を入力してEnter}

# リモートから root ユーザーのログインを禁止するか？
> Disallow root login remotely? (Press y|Y for Yes, any other key for No) :
  {'y'を入力してEnter}

# test データベースを削除するか？
> Remove test database and access to it? (Press y|Y for Yes, any other key for No) :
  {'y'を入力してEnter}

# 権限テーブルをリロードするか？
> Reload privilege tables now? (Press y|Y for Yes, any other key for No) :
  {'y'を入力してEnter}
```



## KVS

### memcached
#### インストール
```bash:コマンド
yum -y install --enablerepo=remi memcached
```
#### 起動
```bash:コマンド
systemctl start memcached
```
#### サービス登録
```bash:コマンド
systemctl enable memcached
```
##### サービス登録されたか確認
```bash:コマンド
systemctl list-unit-files -t service | grep memcached
```
```text:結果
memcached.service                           enabled
```

### Redis
#### インストール
```bash:コマンド
yum -y install --enablerepo=remi,epel redis
```
#### 起動
```bash:コマンド
systemctl start redis
```
#### サービス登録
```bash:コマンド
systemctl enable redis
```
##### サービス登録されたか確認
```bash:コマンド
systemctl list-unit-files -t service | grep redis
```
```text:結果
redis.service                               enabled
```

## 画像処理関連
### ImageMagick
#### インストール
```bash:コマンド
yum -y install ImageMagick
```


## PHP 7.1

### 本体インストール
```bash:コマンド
yum -y install --enablerepo=remi-php71 php
```

### 関連モジュールインストール
*必要に応じてお好みで*

```bash:コマンド
# 基本的なやつ
yum -y install --enablerepo=remi-php71 php-devel php-pear
yum -y install --enablerepo=remi-php71 php-mysqlnd php-mbstring

# Nginxで使う場合はphp-fpm
yum -y install --enablerepo=remi-php71 php-fpm

# mcrypt
yum -y install --enablerepo=epel libmcrypt
yum -y install --enablerepo=remi-php71 php-mcrypt

# 画像関連
yum -y install ftp://mirror.switch.ch/pool/4/mirror/centos/7.3.1611/cloud/x86_64/openstack-ocata/common/openjpeg2-2.1.2-1.el7.x86_64.rpm
yum -y install http://dl.fedoraproject.org/pub/epel/7/x86_64/l/libraqm-0.1.1-1.el7.x86_64.rpm
yum -y install --enablerepo=remi-php71 php-gd php-pecl-imagick

# KVS関連
yum -y install --enablerepo=remi-php71 php-pecl-memcache php-pecl-redis
```

### デフォルトでremi-php71を有効化しておくと楽かも 
```bash:コマンド
yum-config-manager --enable remi-php71
```
```bash:コマンド
#まとめて入れちゃう
yum -y install --enablerepo=epel libmcrypt
yum -y install ftp://mirror.switch.ch/pool/4/mirror/centos/7.3.1611/cloud/x86_64/openstack-ocata/common/openjpeg2-2.1.2-1.el7.x86_64.rpm
yum -y install http://dl.fedoraproject.org/pub/epel/7/x86_64/l/libraqm-0.1.1-1.el7.x86_64.rpm
yum -y install php php-devel php-pear php-mysqlnd php-mbstring php-fpm php-mcrypt php-gd php-pecl-imagick php-pecl-memcache php-pecl-redis php-pecl-apcu php-pecl-zendopcache
```


#### 初期設定
```bash:コマンド
# タイムゾーン設定
sed -i "s/;date.timezone =/date.timezone = 'Asia\/Tokyo'/" /etc/php.ini

# mbstring系の設定
sed -i "s/;mbstring.language = Japanese/mbstring.language = Japanese/" /etc/php.ini
sed -i "s/;mbstring.internal_encoding =/mbstring.internal_encoding = UTF-8/" /etc/php.ini
sed -i "s/;mbstring.http_input =/mbstring.http_input = UTF-8/" /etc/php.ini
```

### Composer
#### インストール
```bash:コマンド
cd /tmp && curl -s http://getcomposer.org/installer | php
```
#### コマンド化
```bash:コマンド
mv /tmp/composer.phar /usr/local/bin/composer
```

### phpMyAdmin
2017.06.06現在はバージョン4.7.1
最新版は[こちら](https://www.phpmyadmin.net/downloads/)で確認
#### インストール

```bash:コマンド
# ダウンロード
cd /usr/local/src/ && wget https://files.phpmyadmin.net/phpMyAdmin/4.7.1/phpMyAdmin-4.7.1-all-languages.tar.gz

# 解凍
tar zxvf phpMyAdmin-4.7.1-all-languages.tar.gz

# ディレクトリをリネーム
mv phpMyAdmin-4.7.1-all-languages phpMyAdmin

# 元ファイルを削除
rm -f phpMyAdmin-4.7.1-all-languages.tar.gz
```

#### VirtualHost設定
```bash:コマンド
vim /etc/httpd/conf.d/phpMyAdmin.conf
```
```apache:/etc/httpd/conf.d/phpMyAdmin.conf設定内容
<VirtualHost *:80>
    ServerName mysql.vm
    DocumentRoot /usr/local/src/phpMyAdmin
    # phpMyAdmin専用のログを出力するようにする
    ErrorLog /var/log/httpd/phpMyAdmin/error_log
    CustomLog /var/log/httpd/phpMyAdmin/access_log combined env=!no_log
    <Directory "/usr/local/src/phpMyAdmin">
        Options All
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>
```

##### ログディレクトリ作成
作っておかないとApacheの再起動でコケる

```bash:コマンド
mkdir /var/log/httpd/phpMyAdmin
```

##### Apache再起動
```bash:コマンド
apachectl restart
```

#### ホストOSのブラウザから使えるようにする
**※この項目はゲストOSではなくホストOS側での操作**
##### hosts設定

```bash:コマンド
sudo vim /etc/hosts
```

以下の設定を追記

```text:/etc/hosts
192.168.33.10 mysql.vm
```

ブラウザから http://mysql.vm にアクセスするとphpMyAdminのログイン画面が表示されるはず。

#3.Phalcon3環境構築

## Zephir
### インストール
```bash:コマンド
yum -y install --enablerepo=remi-php71 zephir
```

### インストール確認
```bash:コマンド
zephir
```

```text:結果

 _____              __    _
/__  /  ___  ____  / /_  (_)____
  / /  / _ \/ __ \/ __ \/ / ___/
 / /__/  __/ /_/ / / / / / /
/____/\___/ .___/_/ /_/_/_/
         /_/

Zephir version 0.9.3a-dev

...

```

## Phalcon

### インストール
```bash:コマンド
yum -y install --enablerepo=remi-php71 php-phalcon3
```

### インストール確認
```bash:コマンド
php -i | grep phalcon
```

```text:結果
phalcon => enabled
```


## Phalcon Devtools

### インストール
```bash:コマンド
git clone https://github.com/phalcon/phalcon-devtools.git /usr/local/src/phalcon-devtools
```

### コマンド化
```bash:コマンド
ln -s /usr/local/src/phalcon-devtools/phalcon.php /usr/bin/phalcon
chmod ugo+x /usr/bin/phalcon
```

### インストール確認
```bash:コマンド
phalcon
```


```text:結果

Phalcon DevTools (3.0.1)

Available commands:
  commands         (alias of: list, enumerate)
  controller       (alias of: create-controller)
  module           (alias of: create-module)
  model            (alias of: create-model)
  all-models       (alias of: create-all-models)
  project          (alias of: create-project)
  scaffold         (alias of: create-scaffold)
  migration        (alias of: create-migration)
  webtools         (alias of: create-webtools)

```

#4.Phalconを動かしてみる

## Phalcon用にApacheの設定ファイルを作成
```bash:コマンド
vim /etc/httpd/conf.d/phalcon.conf
```

```apache:/etc/httpd/conf.d/phalcon.conf
<VirtualHost *:80>
    DocumentRoot "/var/www/phalcon/public"
    DirectoryIndex index.php
    ServerName phalcon.vm
    <Directory "/var/www/phalcon/public">
        Options All
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>
```

## Phalcon Devtoolsを使ってプロジェクトを生成
```bash:コマンド
# ドキュメントルートに移動して作成
cd /var/www/ && phalcon create-project phalcon
```

## ホストOSのブラウザから見れるようにする
**※この項目はゲストOSではなくホストOS側での操作**
### hosts設定

```bash:コマンド
sudo vim /etc/hosts
```

以下の設定を追記

```text:/etc/hosts
192.168.33.10 phalcon.vm
```

ブラウザから http://phalcon.vm にアクセスして、以下のような画面が表示されればOK。
![スクリーンショット 2016-11-09 18.42.06.png](https://qiita-image-store.s3.amazonaws.com/0/32608/37bceae3-0700-8289-9545-a86ccac31633.png)


#おまけ

## Vagrant BOXのパッケージ化
せっかく環境構築したので、BOXをパッケージ化する

### 軽量化する
```bash:コマンド
yum clean all
dd if=/dev/zero of=/EMPTY bs=1M
rm -f /EMPTY
```

### BOXをパッケージ化する
```bash:コマンド
vagrant package --output CentOS7.box
# この例では[/vagrant/CentOS7/]内に[CentOS7.box]のファイル名で出力される
# vagrant haltをしなくても勝手に止めてくれる
```

### BOXを復元する
```bash:コマンド
vagrant box add {BOX名} {ファイルパス}
# BOX名は初期構築時と変えて新しいBOXとして追加出来る
```

### Phalcon用のBOXとして復元する
```bash:コマンド
vagrant box add Phalcon /vagrant/CentOS7/CentOS7.box
mkdir Phalcon && cd $_
vagrant init Phalcon
```