Vagrant で CentOS の仮想環境を構築し，LAMP環境，rbenv，phpenvを導入

リモートと同じ開発環境を作るために Vagrant を使いました．OSなどのバージョンは少し古いです．
この記事でやっていることをまとめると，以下のようになります．

1. Vagrant の導入と CentOS の導入
2. LAMP (Linux + Apache + MySQL + PHP)  環境の構築
3. rbenv での ruby のバージョン管理
4. phpenv での PHP のバージョン管理


バージョン一覧（`-v` or `--version` オプションで確認）
- Vagrant: 1.8.1
- CentOS: CentOS release 6.5 (Final)
- Apache: Server version: Apache/2.2.15 (Unix)
- MySQL: Ver 14.14 Distrib 5.1.73, for redhat-linux-gnu (x86_64) using readline 5.1
- rbenv: 1.0.0-18-gad7dfa6

# 1. Vagrant の導入と CentOS の導入

## 1.1 VirtualBox と Vagrant のインストール
以下のリンクよりインストールしてください

VirtualBoxのインストール
[Oracle VM VirtualBox - Downloads | Oracle Technology Network | Oracle](http://www.oracle.com/technetwork/server-storage/virtualbox/downloads/index.html?ssSourceSiteId=otnjp)
Vagrantのインストール
[This page lists all the available downloads for Vagrant.](view-source:https://www.vagrantup.com/downloads.html)


Vagrant のバージョンを確認

```
$ vagrant version
Installed Version: 1.8.1
Latest Version: 1.8.1

You're running an up-to-date version of Vagrant!
```

## 1.2 Vagrant へ CentOS を
ここからの手順は公式のドキュメントを参考にしています．
[Getting Started - Vagrant by HashiCorp](https://www.vagrantup.com/docs/getting-started/)

任意のディレクトリに移動して，Vagrant 用のディレクトリを作成し，Vagrant の初期化を行う（今回は `~/` 直下に作成している）．`vagrant init` が初期化コマンド．

```
$ mkdir vagrant
$ cd vagrant
$ vagrant init
```

初期化をすると Vagrantfile という Vagrant の設定ファイルが作成される．

```
$ ls
Vagrantfile
```

Vagrant を起動する．その後，CentOS の box イメージを追加する．

```
$ vagrant up
$ vagrant box add centos65 nrel/CentOS-6.5-x86_64
```

起動時に CentOS の box イメージを読み込むように変更する．

```
$ cd ~/vagrant
$ vi Vagrantfile
```

```
Vagrant.configure(2) do |config|
  # 略
  
  # Every Vagrant development environment requires a box. You can search for
  # boxes at https://atlas.hashicorp.com/search.
  # config.vm.box = "base"
  config.vm.box = "centos65"

  # 略
end
```

Vagrant を起動し，ssh でログインする．

```
$ vagrant up
$ vagrant ssh
```

## 1.3 EPEL と Remi

yum 単体ではインストールできないパッケージもあるので，EPEL と Remi を追加します．
ここからは管理者権限での作業になるので，管理者で作業をします．

```
$ sudo su
```

### EPEL のインストール
こちらの記事を参考にしています．
[CentOS6.7 64bitのyumリポジトリにEPELを追加](http://www.kakiro-web.com/linux/centos6-epel-install.html)

epel-release をインストールすることで EPEL が使えるようになります．

```
# yum install epel-release
```

EPEL の設定ファイルを変更して，明示的に EPEL を使用するように変更します．`enable` が `1` のときに EPEL が常時使われ， `0` のときに明示しないと EPEL が使用できない設定になります．

```
# vi /etc/yum.repos.d/epel.repo
```

``` /etc/yum.repos.d/epel.repo
enabled=0
```

### Remi のインストール
こちらの記事を参考にしています．
[CentOS6.7 64bitのyumリポジトリにRemiを追加](http://www.kakiro-web.com/linux/centos6-remi-install.html)

Remi は yum からインストールできないため，RPM パッケージをダウンロードし，インストールします．

```
# wget http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
# rpm -Uvh remi-release-6.rpm
```

初期設定で Remi は 明示的に使用する設定になっています．
一応，そのようになっているか確認．

```
# vi /etc/yum.repos.d/remi.repo
```

```/etc/yum.repos.d/remi.repo
[remi]
enable=0
```

remi-safe というファイルでは Remi を常時使う設定になっているため，明示的に使用するように変更します．

```
# vi /etc/yum.repos.d/remi-safe.repo
```

```/etc/yum.repos.d/remi-safe.repo
[remi-safe]
enabled=0
```

## 1.4 Git のインストール

Git を使用する場面もあるので，先にインストールしておきます．

```
# yum install git
# git --version
git version 1.7.1
```

私は git flow も使うので，こちらもインストールしました．

```
# yum install --enablerepo=epel gitflow
# git flow version
init: Need to be root
0.4.2-pre
```

# 2. LAMP (Linux + Apache + MySQL + PHP)  環境の構築
LAMP 環境の構築をします．PHP の導入に関しては長くなるので，後述します．

## 2.1 Apacheを入れる
Apach をインストール

```
# yum install httpd httpd-devel httpd-tools
```

Apache を起動し，自動的に起動するように設定します．

```
# service httpd start
# chkconfig httpd on
```

PHP ブラウザからアクセスできるように，ポート80番を開放します．
ログアウトし（管理者になっているため2度ログアウト），Vagrantfile を編集します．Vagrant ファイル内にデフォルトで設定が書き込まれていて，コメントアウトされています．コメントアウトを解除して，設定を変更します．

```
# exit
$ exit
$ vi Vagrantfile
```

```Vagrantfile
# Create a forwarded port mapping which allows access to a specific port
# within the machine from a port on the host machine. In the example below
# accessing "localhost:8080" will access port 80 on the guest machine.
config.vm.network "forwarded_port", guest: 80, host: 8080

# Create a private network, which allows host-only access to the machine
# using a specific IP.
config.vm.network "private_network", ip: "192.168.33.10"
```

Vagrant の再起動

```
$ vagrant reload
```

再び Vagrant に ssh 接続します．

```
$ vagrant ssh
$ sudo su
```

IP テーブルを編集して，80番ポートが使えるように編集します．

```
# vi /etc/sysconfig/iptables
```

```iptalbes
# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
```

IPテーブルを再起動します．

```
# service iptables restart
iptables: Setting chains to policy ACCEPT: filter          [  OK  ]
iptables: Flushing firewall rules:                         [  OK  ]
iptables: Unloading modules:                               [  OK  ]
iptables: Applying firewall rules:                         [  OK  ]
```

## 2.2 MySQL のインストール
MySQLをインストールします．PHP 用のパッケージもインストールします．

```
# yum install mysql mysql-libs mysql-server
# yum install --enablerepo=remi php-mysqlnd
```

MySQLの起動し，自動的に起動できるように設定します．

```
# /etc/rc.d/init.d/mysqld start
# chkconfig mysqld on
```

# 3. rbenv を使って ruby のバージョン管理
rbenv は ruby のバージョンをディレクトリごとに管理できるツールです．今夏は rbenv を使用して ruby をインストールします．

こちらの記事を参考にしました．
[rbenv と ruby-build で Ruby をインストールして管理 〜 CentOS6](http://easyramble.com/install-ruby-with-rbenv.html)

rbenv を GitHub からクローンし，グループ設定を行います．

```
# cd /usr/local
# git clone git://github.com/sstephenson/rbenv.git rbenv
# groupadd rbenv
# chgrp -R rbenv rbenv
# chmod -R g+rwxXs rbenv
```

プラグインとして ruby-build が必要なので，GitHub からクローンし，こちらもグループ設定をします．

```
# mkdir rbenv/plugins
# cd rbenv/plugins/
# git clone git://github.com/sstephenson/ruby-build.git ruby-build
# chgrp -R rbenv ruby-build
# chmod -R g+rwxs ruby-build
```

rbenv の環境変数を記述したファイルを追加します．

```
# vi /etc/profile.d/rbenv.sh
```

```/etc/profile.d/rbenv.sh
# rbenv
export RBENV_ROOT="/usr/local/rbenv"
export PATH="$RBENV_ROOT/bin:$PATH"
eval "$(rbenv init -)"
```

環境変数を適用します．

```
# source /etc/profile.d/rbenv.sh
```

rbenv のバージョンを確認します．

```
# rbenv -v
rbenv 1.0.0-18-gad7dfa6
```

インストールできる Ruby のバージョンの一覧を表示します．

```
# rbenv install -l
Available versions:
  1.8.6-p383
  1.8.6-p420
  1.8.7-p249
  1.8.7-p302
  ...
```

今回は 2.1.0 をインストールします．

```
# rbenv install 2.1.0
# rbenv rehash
# rbenv versions
  system
* 2.1.0 (set by /usr/local/rbenv/version)
```

`rbenv global` で全体に適用させます．

```
# rbenv global 2.1.0
# rbenv rehash
```

ruby のバージョンを確認

```
# ruby -v
ruby 2.1.0p0 (2013-12-25 revision 44422) [x86_64-linux]
```

# 4. phpenv を使って PHP のバージョン管理
phpenv は PHP のバージョンをディレクトリごとに管理できるツールです．phpenv は rbenv の派生系で，PHP のバージョン管理ができるようにスクリプトを当てたものらしいです．そのため，rbenv よりも手間が掛かります．今回は phpenv を使用して PHP をインストールします．

こちらの記事を参考にしました．
[phpenv と php-build で PHP をインストールして管理 〜 CentOS6](http://easyramble.com/install-php-with-phpenv.html)

後々エラーを図れるので，今のうちに必要なパッケージをインストールしておきます．

```
# yum install libxml2 libxml2-devel libcurl libcurl-devel libjpeg-devel libpng-devel libtidy libtidy-devel libxslt libxslt-devel
# yum --enablerepo=epel install libmcrypt libmcrypt-devel
```

phpenv を GitHub からクローンします．

```
# cd /usr/local/src
# git clone https://github.com/CHH/phpenv.git phpenv
```

phpenv のインストールスクリプトが，デフォルトで，~/ 直下になっているので変更します．

```
# vi phpenv/bin/phpenv-install.sh
```

```/usr/local/src/phpenv/bin/phpenv-install.sh
if [ -z "$PHPENV_ROOT" ]; then
    # PHPENV_ROOT="$HOME/.phpenv"
    PHPENV_ROOT="/etc/profile.d/rbenv.sh"
```

phpenv の環境変数を先ほどの rbenv のファイルに追加します．

```
# vi /etc/profile.d/rbenv.sh
```

```/etc/profile.d/rbenv.sh
# phpenv
export PHPENV_ROOT="/usr/local/phpenv"
export PATH="$PHPENV_ROOT/bin:$PATH"
#eval "$(phpenv init -)"
 
# rbenv
export RBENV_ROOT="/usr/local/rbenv"
export PATH="$RBENV_ROOT/bin:$PATH"
eval "$(rbenv init -)"
```

環境変数を適用します．

```
# source /etc/profile.d/rbenv.sh
```

phpenv をインストールします．

```
# cd /usr/local/src/phpenv/bin
# sh phpenv-install.sh
```

先ほど，コメントアウトしていた部分のコメントアウトを外します．

```
# vi /etc/profile.d/rbenv.sh
```

```/etc/profile.d/rbenv.sh
# phpenv
export PHPENV_ROOT="/usr/local/phpenv"
export PATH="$PHPENV_ROOT/bin:$PATH"
eval "$(phpenv init -)" # 有効にする。

# rbenv
export RBENV_ROOT="/usr/local/rbenv"
export PATH="$RBENV_ROOT/bin:$PATH"
eval "$(rbenv init -)"
```

再度，環境変数を適用します．

```
# source /etc/profile.d/rbenv.sh
```

グループ設定をします．

```
# cd /usr/local
# chgrp -R rbenv phpenv
# chmod -R g+rwxXs phpenv
```

プラグインとして php-build が必要なので，GitHub からクローンします．こちらもグループ設定をします．

```
# mkdir phpenv/plugins
# cd phpenv/plugins
# git clone https://github.com/CHH/php-build.git php-build
# chmod 755 php-build/bin/rbenv-install
# chgrp -R rbenv php-build
# chmod -R g+rwxs php-build
```

PHP ファイルをブラウザからアクセス，Apache で有効にするためには，libphp.so というファイルが必要になります．そのファイルを phpenv で PHP をインストールするときに吐き出すために設定を変更する必要があります．

default_configure_options というファイルに `--with-apxs2=/usr/sbin/apxs` を追加

```
# vi php-build/share/php-build/default_configure_options
```

```/usr/local/phpenv/plugins/php-build/share/php-build/default_configure_options
--with-apxs2=/usr/sbin/apxs
```

php-build/share/php-build/definitions の中に各バージョンのインストールに関することが書かれたファイルがある．自分のインストールしたいバージョンのファイルに，`configure_option "--with-apxs2" "/usr/sbin/apxs"` を追加する．今回は 5.6.12 をインストールするため，5.6.12 ファイルに追加．

```
# vi php-build/share/php-build/definitions/5.6.12
```

```/usr/local/phpenv/plugins/php-build/share/php-build/definitions/5.6.12
install_package "https://secure.php.net/distributions/php-5.6.12.tar.bz2"
install_xdebug "2.3.3"
enable_builtin_opcache
configure_option "--with-apxs2" "/usr/sbin/apxs"
```

PHP のインストールをする．

```
# phpenv install 5.6.12
```

インストールが完了したら，/etc/httpd/modules ディレクトリの下に libphp5.so というファイルが生成されているので移動しておく．他のバージョンをインストールしたときに，このファイルは上書きされないようにするためです．

```
# mv /etc/httpd/modules/libphp5.so /usr/local/phpenv/versions/5.6.12/
```

PHP 5.6.12 を全体に適用する．

```
# phpenv versions
* system
  5.6.12 (set by /usr/local/phpenv/version)
# phpenv global 5.6.12
# phpenv rehash
```

PHP のバージョン確認

```
# php -v
PHP 5.6.12 (cli) (built: Feb 17 2016 03:38:02)
Copyright (c) 1997-2015 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2015 Zend Technologies
    with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2015, by Zend Technologies
    with Xdebug v2.3.3, Copyright (c) 2002-2015, by Derick Rethans
```

Apache から PHP が扱えるようにファイルを追加する．`LoadModule ・・・` のところの `versions` の後のディレクトリ名は，インストールした PHP のバージョンのディレクトリ（先ほど libphp5.so を移動したディレクトリ）にする．

```
# vi /etc/httpd/conf.d/php.conf
```

```/etc/httpd/conf.d/php.conf
# phpenv で管理しているためphpのバージョンにより切り替える
LoadModule php5_module /usr/local/phpenv/versions/5.6.12/libphp5.so
 
# php5_module
<IfModule php5_module>
  AddType application/x-httpd-php .php .php5 .phtml
  AddType application/x-httpd-php-source .phps
  <IfModule dir_module>
    DirectoryIndex index.html index.php
  </IfModule>
</IfModule>
```

Apache の設定ファイルの以下をコメントアウトする．

```
# vi /etc/httpd/conf/httpd.conf
```

```/etc/httpd/conf/httpd.conf
#LoadModule php5_module        /usr/lib/httpd/modules/libphp5.so
```

Apache を再起動

```
# httpd -t
Syntax OK
# service httpd restart
```

ブラウザからは 192.168.33.10 でアクセスできる．このとき /var/www/html/ の下にアクセスする．index.php というファイルで PHP のコードを書いて，ブラウザで確認．PHP の情報が表示されたらok．

```
# vi /var/www/html/index.php
```

```/var/www/html/index.php
<?php
  phpinfo();
?>
```