Vagrant+VirtualBoxでPHP開発環境構築

Windowsで。


## なにがやりたいの？
VirtualBox等の仮想化ソフトウェアで仮想マシンを動かし、その中に開発環境も全て入れてしまおうというコンセプトで、これによって本番環境と開発環境をそろえることが簡単にできるようになることと、グループでの開発の際に開発環境を揃えやすいことが主なメリット。

グループでの開発環境を揃える方法については、Chefなどの設定管理ツールを使うのが一般的だと思う。が、他にもやり方はいろいろあるみたい（PuppetとかVMクローン？とか・・・）。

今回は、VagrantというVirtualBoxのフロントエンドのようなものを使ってコマンドラインで開発環境管理を行えるようにするまでを目的とします。

## Vagrantの使い方

インストールについてはhttp://dev.classmethod.jp/tool/vagrant/ の通りにやれば一発で行けました。

* boxをインストールするコマンド

```sh
$ vagrant box add [box-name] [box-url]
```
boxとは、OSのディスクイメージファイルなどが入ったもの。

* boxがちゃんとインストールされているか確認

```sh
$ vagrant box list
```
* VMの起動

```sh
$ vagrant up
```
（例）vagrantでcentosを立ち上げる場合（初期設定含む）

```sh
$ mkdir centos
$ cd centos
$ vagrant box add centos https://dl.dropbox.com/u/7225008/Vagrant/CentOS-6.3-x86_64-minimal.box
$ vagrant init centos
$ vagrant up
```

Vagrant up時に、

```
There was an error while executing `VBoxManage`, a CLI used by Vagrant
for controlling VirtualBox. The command and stderr is shown below.
```
みたいなエラーが出ることがあるようです。僕の場合はVirtualBoxのバージョンを4.1.12にすることでエラーが消えました。

vagrant upできないエラーが出た時は[これ](http://shibayu36.hatenablog.com/entry/2013/03/17/175405)が参考になると思います。

* VMにssh接続する

```sh
$ vagrant ssh
```
逐一状態を抜き出しておきたいので、スナップショット（開発中のプログラムのソースファイルや稼働中のデータベースファイルなどを特定のタイミングで
抜き出したもの）を作成しておくとよいっぽい。

 
なので、まずはスナップショット用のプラグインであるsaharaをインストールしておく。

 ```sh
$ vagrant plugin install sahara
```
一応、インストールできていることを確認。

```sh
$ vagrant plugin list
```
サブコマンドsandboxの操作方法一覧。

* sandboxモード開始

```sh
$ vagrant sandbox on
```
* 変更を決定する

```sh
$ vagrant sandbox commit
```
* 変更を破棄し、ロールバックする

```sh
$ vagrant sandbox rollback
```
* sandboxモード終了（commitしていないものは破棄される）

```sh
$ vagrant sandbox off
```
* 現在sandboxモードかどうかの確認

```sh
$ vagrant sandbox status
```
onとcommitとoffは割と時間がかかったので、一度下のようにしてVagrantを停止させてから行うとよいかも。

```sh
$ vagrant halt
$ vagrant sandbox commit
```
## centosへapacheとPHPをインストール
なお、以下ではsudoしてるんですけど、不要な人はもちろん外してください。わからない人はとりあえずつけておけば良いと思う。

```sh
$ sudo yum install httpd
$ sudo yum install php php-cli php-common php-gd php-in tl php-mbstring php-mysql php-pdo
```
ここで、phpがインストールできていない（見かけ上は出来ているようにみえる）という問題が生じることがあるようです。まだ理由はわかっていないのですが、その場合はインストールされるpackage数が15個になっているはず（正しくインストールされていれば16個。これは、上記コマンドを実行した時にy/Nを求められるのですが、その上にインストールされるものが出ていてpackage数も表示されているはずなのでそこで確認して下さい）。また、インストールされたかどうかは

```
$ yum list installed 
```
で確認できます。


以下、設定です。

apacheの設定ファイルに変更を加えます。

```
$ sudo vi /etc/httpd/conf/httpd.conf
```

して、

```
<VirtualHost *:80>

</VirtualHost>
```

内の設定を適当に書いてください。最低限DocumentRootとServerNameの部分が書いてあれば普通は大丈夫だと思う。

あとは

```
<Directory />
    Options FollowSymLinks
    # AllowOverride None
    AllowOverride All
    Order deny,allow
    # Deny from all
</Directory>
```
あたり。とりあえずこれだけ書き換えます。

この時点で文法上のエラーについては、

```sh
$ httpdctl configtest
```
で確認することも出来ます。

ここまでやって、

```sh
$ sudo /etc/init.d/httpd start
```
でapacheを起動。OKと表示されれば成功です。

ちなみに、

```sh
$ sudo service httpd start
```
でも起動できます。再起動は

```sh
$ sudo service httpd restart
```
です。 

```sh
$ sudo service httpd status
```
で状態を確認することも出来ます。

なお、この時点でDocumentRootが存在しない、みたいなエラーが出るかもしれません。それでもOKと出ていれば後でDocumentRootにあたるディレクトリを作ればよいので問題ないのですけど、DocumentRoot must be a directoryとエラーが出てapacheを起動できないことが考えられます（このHow toで指定している順番にやれば出ないような気がしますが、先にシンボリックリンク（後述）を貼っていた場合など）。その場合もまずはディレクトリが存在しているかを確認してみてください。一度シンボリックリンクを切ってみて、エラーが消えるようなら先に進めばいいと思います。
 
一応、apacheがcentos起動時に同時に立ち上がるようにしておきました。

```
$ chkconfig httpd on 
```

chkconfigはOS起動時（この場合はCentOS）に参照され、

```
$ chkconfig --list
```
で現在の状況を確認できます。httpdのところが1~6まで全部offになってたら起動設定されていません。ちなみにこの数字はランレベルというもので、詳しく知りたい場合は[ここ](http://vinelinux.org/docs/vine5/manuals/run-level.html)が参考になると思います。

一応、[chkconfigについて](http://vinelinux.org/docs/vine5/manuals/chkconfig.html)もおいておきます。


次にiptablesの設定へ。

```
$ sudo vi /etc/sysconfig/iptables
```
で見てみると、デフォルトの設定ではhttpポート（80番）が開放されていない。

```sh
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
```
を追加したあと

```sh
$ /etc/init.d/iptables restart
```
で反映させる。viの操作方法は[これ](http://www.envinfo.uee.kyoto-u.ac.jp/user/susaki/command/vi.html)。

さらに、iptablesが設定されたことで外部からの通信が遮断されるので、VirtualBoxを起動しているPCから通信が行えるようにファイアウォールの設定をします。

```sh
$ sudo service iptables stop
```
OKと出れば成功。

再起動したときのために、

```
$ sudo chkconfig iptables off
```
としておく。


ここまでできればapacheを起動して、HTMLファイルを

```sh
$ echo 'It works!' > /var/www/html/index.html
```
みたいな感じに書いてIPアドレスを入力してやればIt　works!って出るはずです。

出ない人は、

・apacheが起動しているか->``` sudo service httpd restart ```

・DocumentRootが読み込み不可になっていないか（apacheは擬似ユーザーとして各ディレクトリにあるファイルを読み込んでいる）->``` chmod -R 755 DocumentRoot ```

・複数VMが走っていないか（別で設定していなければ、複数VMが走っていればよくわからない挙動になります）->VirtualBoxタスクマネージャで確認


を試してみてください。
 

一応、ファイルの書き換え時には、iptablesの場合であれば

```sh
$ cp /etc/sysconfig/iptables /etc/sysconfig/iptables.org
```
のようにしてコピーなどとっておくといろいろ安心だし、

```sh
$ diff /etc/sysconfig/iptables.org /etc/sysconfig/iptables
```
でちゃんと書き換わってるか確認できるので良いかと。


次はローカルで自由にエディタを選んでソースを書き、VMと同期させ、ブラウザで確認できるようにすることができれば良いかなという感じ。


vagrantfileで、

```sh
$ config.vm.synced_folder "../data", "/vagrant_data"
```
を有効にすれば内容が同期される（ちなみに第一引数がホスト、第二引数がゲスト）ようなので有効にしてみる。

 ```sh
$ config.vm.network :private_network, ip: "192.168.33.10"
```
これも有効にしておく必要がある。

 

ここまでの作業は一応オリジナルのコピーを取って行うことを推奨。

さらに、vagrantでssh接続した先のルート/vagrantとローカルでのvagrantfileがあるディレクトリをリンクさせておけば目標は達成できるはず。

 
## シンボリックリンク作成

追記:デフォルトで\vagrantと作業ディレクトリがリンクしてる・・・？virtualboxから共有フォルダを調べてやってください。既にリンクが貼れてる場合は以下の操作は不要です。もしくは、\vagrantでls -laしてやればリンクが貼ってあるかは確認できます。）

 
まず、

```sh
$ sudo rm -rf /var/www/html
```
コマンドについて

rm：ファイルまたはディレクトリの削除

オプションについて

-r：ディレクトリの中身を再帰的に削除

-f：対象が存在しなくても実行

によって/var/www/htmlをあけておき、

```sh
$ sudo ln -fs /vagrant /var/www/html
```
コマンドについて

ln：ln (option) [file / directory name] [linkfile / linkdirectory name]でリンクを貼る

オプションについて

-f：警告なしで上書きを行う

-s：シンボリックリンクの作成

すれば/vagrantにシンボリックリンクを貼ることができる。

次に、http://192.168.33.10にアクセスした際にデフォルトで表示するindex.htmlを適当に準備しておく。

ちなみに、これは

```sh
$ cd /vagrant 
$ touch [ファイル名]
```
で簡単に作れる（ローカルと同期しているので）。

 
あとはhttp://192.168.33.10/test.phpなどとすればvagrantfileと同じディレクトリにあるファイルを適当に呼び出せる。


が、

ここまで出来た状態で、vagrantfileを作業ディレクトリに置いてvagrant upし.vagrantを生成して、作業ディレクトリ内のファイルを192.168.33.10から見れるか試してみたところ失敗・・・

vagrantfileでのsynced_foldの設定が適切に行われているか、apache側の設定ができているかなどいろいろ確認して一つずつ解決。

結局、今回の場合は以下三点が問題だったよう。

* 1.vagrantを逐一停止させること

* 2.chmod755してやる 

* 3.virtualhostの設定

この辺りはおそらく個別でググるなどして対処してもらったほうが早いかと。

 

Macでやるならこことか

http://box406.hatenablog.com/entry/2013/06/01/010715


vagrant upの際にエラーでbootstrap.sh（Vagrant upのたびに走る）がないといわれることがある（つまり、vagrantfileでbootstrapを有効にしている（デフォルトでは無効です））ので、その時は

```sh
#!/usr/bin/env bash
sudo yum update
sudo rm -rf /var/www
sudo ln -fs /vagrant /var/www
```
を作っておく。

DL is deprecated, please use Fiddleというメッセージがvagrant upする度に出るので、さっさと移行したほうが良さそう・・・