VagrantでローカルWebアプリ開発


## 前提
* Mac OSX
* 「brew cask」インストール済み

## VagrantでVMを起動する

#### 1. brewで、virtualboxとvagrantをインストールします。

```bash
brew cask install virtualbox
brew cask install vagrant
```

#### 2. boxを追加する
以下から、開発環境にあったOSを選択して、boxとして追加します。
http://www.vagrantbox.es/

```bash
vagrant box add centos70 https://github.com/tommy-muehle/puppet-vagrant-boxes/releases/download/1.1.0/centos-7.0-x86_64.box
```

#### 3. Vagrantディレクトリの初期化

コマンドを実行したカレントディレクトリに
`Vagrantfile`が作成されます。

```bash
vagrant init centos70
```

#### 4. VMの起動

手順3で初期化したディレクトリで、VMを起動します。

```bash
vagrant up
```

## 固定IPを割り振る

#### 1. `Vagrantfile`を編集して、IPを固定化します。

```bash
vim Vagrantfile
------
# 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"
------
```

#### 2. 再起動して設定を反映する

```bash
vagrant reload
```
## VMにSSHで接続する

```bash
vagrant ssh
```

## ファイアウォールを無効化する

CentOS7からデフォルトでonになっているようなので、stopします。

```bash
# VM側
sudo systemctl stop firewalld
```

## Webサーバーを起動する

#### 1. httpd24+PHP56をインストールする

```bash
# VM側
sudo yum install epel-release
wget http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
sudo rpm -Uvh remi-release-7.rpm
sudo yum install httpd
sudo chkconfig httpd on # 自動起動設定
sudo yum install -y --enablerepo=remi --enablerepo=remi-php56 php php-opcache php-devel php-mbstring php-mcrypt php-mysqlnd php-phpunit-PHPUnit php-pecl-xdebug php-pecl-xhprof
```

#### 2. httpdを起動する

```bash
# VM側
sudo service httpd start
```

#### 3. Webサイトにアクセスする
以下のURLで、Apacheのテストページにアクセスできると思います。

```bash
http://192.168.33.10
```

## ホストとVM間で、ディレクトリ共有

ホストとVMでディレクトリ共有を行うことで、
ホスト側で編集したファイルをVM側のWebサーバーでホスティングさせることができます。

Vagrantの場合、特別な設定は不要です。
`vagrant init :box名`で初期化したディレクトリが共有ディレクトリになります。

```bash
#VM側の共有フォルダ
/vagrant
```

VM側でドキュメントルートとなる場所にシンボリックリンクを貼れば、VM側でホスティングできます。

```bash
vagrant ssh
#VM側
ln -s /vagrant/sampleapp /var/www/sampleapp
```

### ホストOS側の任意のパスを共有したい

vagrantの共有ディレクトリに、ホストOS側のパスに対してシンボリックリンクを貼っても
VM側からホストOS側のパスを参照できないため、リンク切れの状態になります。

そのため、以下の方法でVM側とホスト側で同期を取ります。

#### 1. Vagrantfileに共有設定を追加する

config.vm.synced_folderの第一引数に「ホスト側のパス」、第二引数に「VM側のパス」を指定します。

```bash
# ホスト側
vim Vagrantfile
------
config.vm.synced_folder "ホスト側のパス", "/var/www/sampleapp", type: "rsync"
------
```

#### 2. 再起動する

```bash
# ホスト側
vagrant reload
```

#### 3. 同期自動監視する

自動で同期が行われないため、以下のコマンドで監視します。

```bash
# ホスト側
vagrant rsync-auto
```

## Virtual Hostの設定
複数アプリケーションの運用を想定して、vhostの設定を行います。

#### 1. vhostを設定する

```bash
# ホスト側
vagrant ssh

# VM側
sudo vi /etc/httpd/conf.d/vhost.conf
------
NameVirtualHost *:80

<VirtualHost *:80>
    DocumentRoot "/var/www/sampleapp"
    ServerName vm.sampleapp.co.jp
    <Directory /var/www/sampleapp>
        Options -Indexes +FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>
------
```

#### 2. httpdを再起動する

```bash
# VM側
sudo httpd -k restart
```

## hostsを設定して、vhostで起動したアプリにアクセスする
今の状態で、`http://vm.sampleapp.co.jp`にアクセスしても
ページが見つからずエラーとなります。

hostsを設定することで、`vm.sampleapp.co.jp`のドメインで
VM側のWebサーバーにアクセスすることができます。

```bash
# ホスト側
sudo vim /etc/hosts
------
192.168.33.10     vm.sampleapp.co.jp
------
```

`http://vm.sampleapp.co.jp`で、アプリケーションにアクセスできると思います。