vagrant + shellを使用したwindows上でのLAMP環境構築(php5.4 mysql5.6)

# 何、これは？
phpのローカル開発環境の構築手順です。windows向けでvirtualboxとvagrantを使用しています。
php5.4、mysql5.6を対象にし、リモートデバッグできるように設定を追加してます。
また、apacheは特にバージョンを気にしてません。
基本、centos6.4の最小構成のイメージにシェルで必要な設定を足していく感じです。
chefとかは使いません。


# virtualboxとvagrantのインストール
VirtualBox(4.2.24) / https://www.virtualbox.org/
vagrant   (1.7.1)  / https://www.vagrantup.com/
動作確認したのは↑の組み合わせ。
両方とも最新ではないので、それぞれ過去バージョンからダウンロードしてインストール。
自分のときだと、バージョンによってはまともに動作せず、windows再起動とか必要になった
ケースがあったので、いつもこのバージョンを使用しています。

# ファイル構成
Cドライブ配下にlocaldevフォルダを作成。

```text:ファイル構成

C:\localdev
    │  Vagrantfile
    │
    ├───box
    │ 　　　CentOS-6.4-x86_64-v20131103.box
    │
    ├───provision
    │ 　　　apache.sh
    │ 　　　base.sh
    │ 　　　etc.sh
    │ 　　　mysql.sh
    │ 　　　php.sh
    │ 　　　proxy.sh
    │
    ├───setting
    │ 　　　vhost.conf
    │ 　　　xdebug.ini
    │
    └───src
            index.html
```

# Boxをvagrantへ登録
http://www.vagrantbox.es/
CentOS-6.4-x86_64-v20131103.box

面倒ですが、boxを一度ローカルにダウンロードし、その配置先を
vagrantのbox追加コマンドのurlにしてます。
通常のやり方でboxを追加しようとした時に特定のproxy下で失敗した経験からです。

```shell-session:windowsコマンドプロンプト
vagrant box add centos64 C:\localdev\box\CentOS-6.4-x86_64-v20131103.box
```

# vagrant up
```shell-session:windowsコマンドプロンプト
vagrant up
```
以下はVagrantfileとプロビジョニングシェル。
vagrant up時に、Vagrantfileで指定したシェルが順番に実行される

```shell-session:Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :

# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|

  config.vm.box = "centos64"
  
  config.vm.network :private_network, ip: "192.168.33.10"
  config.vm.provision :shell, :path => "provision/base.sh"
  #config.vm.provision :shell, :path => "provision/proxy.sh"
  config.vm.provision :shell, :path => "provision/apache.sh"
  config.vm.provision :shell, :path => "provision/mysql.sh"
  config.vm.provision :shell, :path => "provision/php.sh"
  config.vm.provision :shell, :path => "provision/etc.sh"
  
end
```

```shell-session:base.sh
#!/bin/sh

# fastestmirror
echo "prefer=ftp.jaist.ac.jp" >> /etc/yum/pluginconf.d/fastestmirror.conf

# Firewall、SELinux OFF
/etc/rc.d/init.d/iptables stop
chkconfig iptables off
chkconfig ip6tables off
cp -p /etc/selinux/config /etc/selinux/config.orig
sed -i -e "s|^SELINUX=.*|SELINUX=disabled|" /etc/selinux/config
```

```shell-session:apache.sh
#!/bin/sh

yum -y install httpd
yum -y install mod_ssl
```

```shell-session:mysql.sh
#!/bin/sh

yum -y install http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm
yum -y install mysql-community-server

chkconfig mysqld on
service mysqld start

mysql -u root -e "UPDATE mysql.user SET Password=PASSWORD('') WHERE User='root';"
mysql -u root -e "GRANT ALL PRIVILEGES ON *.* to user@\"%\" IDENTIFIED BY 'password' WITH GRANT OPTION;"
mysql -u root -e "FLUSH PRIVILEGES;"
```

```shell-session:php.sh
#!/bin/sh

rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm

sed -i -e "s/#baseurl=http/baseurl=http/g" /etc/yum.repos.d/epel.repo
sed -i -e "s/mirrorlist/#mirrorlist/g" /etc/yum.repos.d/epel.repo
sed -i -e "s/enabled=1/enabled=0/g" /etc/yum.repos.d/epel.repo

yum install -y --enablerepo=epel,remi,remi-php54 php php-cli php-common php-devel php-gd \
php-intl php-mbstring php-pdo php-mysqlnd php-pear.noarch php-xml php-mcrypt

pecl install xdebug
```

```shell-session:etc.sh
#!/bin/sh

\cp -f /vagrant/setting/xdebug.ini /etc/php.d/xdebug.ini
\cp -f /vagrant/setting/vhost.conf /etc/httpd/conf.d/vhost.conf

sed -i -e "/AddType text\/html \.php/i\AddType application\/x-httpd-php \.php \.html" /etc/httpd/conf.d/php.conf

rm -rf /var/www/html
ln -fs /vagrant/src /var/www/html

service httpd start
```

以下はシェルの中で仮想環境のcentosへコピーする設定ファイル

```shell-session:vhost.conf
EnableSendfile Off
EnableMMAP Off
```

```shell-session:xdebug.ini
zend_extension="/usr/lib64/php/modules/xdebug.so"
xdebug.remote_enable=1
xdebug.remote_connect_back = on
xdebug.remote_handler=dbgp
xdebug.remote_mode=req
xdebug.remote_port=9000
xdebug.collect_params = On
xdebug.dump.GET = *
xdebug.dump.POST = *
```

C:\localdev\srcが 192.168.33.10のドキュメントルート
になっているはず

使い終わったらvagrant destroyでイメージを削除する