PHP7.3+VirtualBox+Vagrantの開発環境構築

# 内容
- VirtualBox+Vagrantを使用した仮想環境を構築する
- CentOS7にPHP7.3をインストール
- 転送ツールCyberduckを使用してGUIで直感的にファイル操作

※今回の実行環境は後述の通りであり、SSHクライアント標準搭載を想定しているため、別途Putty等は使用致しません。

# 環境
- Windows10 / macOS Mojave 10.14.6
- VirtualBox 6.0.10
- Vagrant 2.2.5
- centos/7 (virtualbox, 1905.1)
- PHP 7.3.8 (cli)
- Cyberduck 7.0.2.30998


# 各種インストール
まず初めに、今回は必要なものを一式ダウンロードインストール

- **VirtualBox**
    - 仮想環境を作るためのツールのひとつ
    - ダウンロードをするとインストーラーが開くので指示通りにインストールを進める    
    - https://www.virtualbox.org/wiki/Downloads

- **Vagrant**
    - 該当するOSを選択してダウンロードインストール
    - https://www.vagrantup.com/downloads.html

- **Cyberduck**
    - 仮想マシン上のファイルをGUIで簡単に扱えるようにするためのファイル転送ツール
    - https://cyberduck.io/download/


# 環境構築

## boxの作成
下記コマンドを実行する

```sh
# boxの作成
$ vagrant box add centos/7
box: Successfully added box 'centos/7' (v1905.1) for 'virtualbox'!

# 現在あるboxのリストの確認
$ vagrant box list
centos/7 (virtualbox, 1905.1)
```

## 仮想マシンを設置するディレクトリの作成
Vagrantでは１つの仮想マシンに対して1つのディレクトリが必要であるため、今回は**home**ディレクトリに**MyVagrant**というディレクトリを作り、その中に**CentOS7**というディレクトリを作ってそこに環境を作ることとする

- **Windows：C:\Users\{user名}\MyVagrant\CentOS7**
- **mac：/Users/{user名}/MyVagrant/CentOS7**

```sh:~/MyVagrant/CentOS7
# homeディレクトリにディレクトリを作成
$ mkdir MyVagrant
$ cd MyVagrant
$ mkdir CentOS7
$ cd CentOS7
```

## Vagrantfileの作成
**Vagrantfile**は環境を作るための設定ファイルであり、IPアドレスなど様々な情報を管理している。
今回環境を作るCentOS7に対する設定ファイルを作成するため、作成した**CentOS7**のディレクトリで作成コマンドを実行する
コマンド実行後Vagrantfileが生成される

```sh:~/MyVagrant/CentOS7/
# Vagrantfile作成コマンド実行
$ vagrant init 
```

## Vagrantfileの編集
生成された**Vagrantfile**にはすでに様々な情報が書かれているが、デフォルトではIPアドレスに関する情報がコメントアウトされ、無効になっているため有効にする必要がある（デフォルトのままだと外部からアクセスできないため）
また、複数の仮想マシンを立ち上げる場合はデフォルトで記載されているIPアドレスを変更してかぶらないように対応する必要があるので注意する

```sh:~/MyVagrant/MyCentOS/Vagrantfile
# 次のコマンドでテキストが開くので"i"を押して下記の通り変更し、"Esc"でInsert終了し":wq"で保存して閉じる
$ vi Vagrantfile


# 変更前(下記の通りコメントアウトされている)
# config.vm.network "private_network", ip: "192.168.33.10"

# 変更後(コメントアウト解除)
$ config.vm.network "private_network", ip: "192.168.33.10"

# 設定変更後リロードする
$ vagrant reload
```

# 仮想マシンの起動
コマンドライン上で仮想マシンのディレクトリ(Vagrantfileのある階層)まで移動し、下記コマンドを実行することで起動できる

```sh:~/MyVagrant/CentOS7/
# 仮想マシン起動コマンド
$ vagrant up

# 立ち上がっているか、仮想マシンの状態を確認する
$ vagrant status
# 次のように出力されればOK(running)
Current machine states
default          running (virtualbox)
```


# 仮想マシンへSSHで接続
`vagrant ssh`コマンドを使った接続
通常、SSHでの接続ではサーバアドレスやユーザID、パスワードなどを必要とするが、vagrantによって立ち上げられた仮想マシンへは`vagrant ssh`コマンドで簡易的にSSH接続が可能

```sh:~/MyVagrant/CentOS7/
$ vagrant ssh
# 表示が次のようになればログインできている状態
[vagrant@localhost~]$
```


## 必要なアプリケーションのインストール
現段階ではOSのみインストールした状態でPHPなどのアプリケーションがインストールされていないためインストールする

```sh:/home/vagrant
# OSを最新の状態にアップデート
$ sudo yum -y update


# PHP7.3をインストール 7.3.8(cli)
    # すでにPHP５．4などをインストールしている場合は削除する必要がある
    # 入っているか確認
    $ php -v
    # 入っていれば(バージョン情報が出力されれば)削除
    $ yum remove php php-*

# EPELをインストール
$ sudo yum install epel-release
# Remiをインストール
$ sudo yum -y install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
# yumを更新
$ sudo yum update
# リポジトリリストの確認。上記が加わっていればOK
$ sudo　yum repolist
# remi-php73と依存するパッケージを併せてインストール
  # 73の個所を必要に応じて変更すれば7.2などもインストール可能
$ sudo yum -y install --enablerepo=remi,remi-php73 php php-devel php-mbstring php-pdo php-gd php-xml php-mcrypt

```

きちんとインストールできたか確認

```sh:/home/vagrant
# phpの確認
$ php -v
PHP 7.3.8 (cli) (built: Jul 30 2019 09:26:16) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.8, Copyright (c) 1998-2018 Zend Technologies

# 依存するパッケージの確認
$ rpm -qa | grep php
php-cli-7.3.8-1.el7.remi.x86_64
php-mbstring-7.3.8-1.el7.remi.x86_64
php-json-7.3.8-1.el7.remi.x86_64
php-pecl-mcrypt-1.0.2-2.el7.remi.7.3.x86_64
php-gd-7.3.8-1.el7.remi.x86_64
php-7.3.8-1.el7.remi.x86_64
php-xml-7.3.8-1.el7.remi.x86_64
php-common-7.3.8-1.el7.remi.x86_64
php-devel-7.3.8-1.el7.remi.x86_64
php-pdo-7.3.8-1.el7.remi.x86_64

```

# Cyberduckの利用
## 環境設定
- Cyberduckの設定の前に確認しておきたいこと
    - 隠しフォルダーを表示するようにする
    - 拡張子を表示するようにする
- Cyberduckを開いて**編集**タブの**環境設定**から設定を行う
    - ブラウザタブ
        - 「'.'で始まるファイルを表示」を選択
        - 「ダブルクリックしたファイルを外部エディタで開く」を選択
        ![スクリーンショット 2019-08-27 6.29.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449626/8c493836-efb6-4b39-905e-9444f0764def.png)

    - 外部エディタタブ
        - 使用する外部エディタを選択する
        ![スクリーンショット 2019-08-27 6.30.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449626/e5dd911c-bb44-f359-0a22-7a33f7ed2d4d.png)


## Cyberduckを使って仮想マシンへの接続
### 接続の設定をする前に設定値の確認をする
SSH接続している場合は`exit`と入力してCentOS7のディレクトリに戻り、下記コマンドを実行する

```sh:~/MyVagrant/CentOS7
$ vagrant ssh-config
Host default
  HostName 127.0.0.1
  User vagrant
  Port 2222
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile C:/Users/{user名}/MyVagrant/CentOS7/.vagrant/machines/default/virtualbox/private_key
  IdentitiesOnly yes
  LogLevel FATAL
```
こちらの設定値に基づき、Cyberduckで新規接続設定をする

### Cyberduckを起動し、新規接続から設定をする
- **プロトコル**：SFTPを選択
- **サーバ**：127.0.0.1
- **ポート**：2222
- **ユーザ名**：vagrant
- **パスワード**：vagrant
- **SSH Private Key**：C:/Users/{user名}/MyVagrant/CentOS7/.vagrant/machines/default/virtualbox/private_key
    - `vagrant ssh-config`で確認した**IdentityFile**の内容を選択


![スクリーンショット 2019-08-27 5.06.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449626/b4004c2c-384c-21df-ecd8-555b44cf2204.png)

接続されると**/home/vagrant**が開かれる。これは**vagrant**ユーザーの**home**フォルダと言う。
ブックマーク登録しておけばユーザーログイン情報とその接続先のディレクトリをブックマークすると、次回より簡易的に接続できるようになる


# プロジェクトの作成とウェブサーバーの立ち上げ
## 表示させるファイルの作成
プロジェクト作成する場合は**vagrant**ユーザーの**home**ディレクトリ配下に作成する。
今回は**index.php**を作成して簡単に検証。
表示検証のため**h1**タグで**hello**とだけ書いておく。

```sh:/home/vagrant/
$ touch index.php
$ vi index.php
# テキストエディタが開くので"i"でinsertし次の内容を書き込む、"esc"でinsert終了し、":wq"で保存して閉じる
$ <h1>hello</h1>
```

![スクリーンショット 2019-08-27 7.02.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449626/fbf8002e-20d6-3650-8a70-41e8462d2dfc.png)

## ウェブサーバーの立ち上げ
ウェブサーバーの立ち上げは**Vagrantfile**で編集したときのIPアドレスを入力し、ポート番号を設定する

```sh:/home/vagrant
$ php -S 192.168.33.10:8080

PHP 7.3.8 Development Server started at Mon Aug 26 21:44:16 2019
Listening on http://192.168.33.10:8080
Document root is /home/vagrant
Press Ctrl-C to quit.
```
以上で完了
Cyberduckで新規ファイル作成で**index.php**を作成し、http://192.168.33.10:8080 へアクセスすれば表示される
![スクリーンショット 2019-08-27 7.35.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449626/b245b062-c8bf-f53a-37f1-ffa4194ba897.png)


## [おまけ] URLの設定
- ウェブサーバーを立ち上げたOS上でURLを変更することができる(サーバーを立ち上げたOS上のみであり、公開されるわけではない)
- ウェブサーバーを立ち上げると**http://192.168.33.10:8080**でアクセスできるようになるが、このポート番号までのIPアドレスの部分を任意の文字列に変更できるようになる
- **hosts**ファイルを編集する
    - Macの場合
        - **/private/etc/hosts**
    - Windowsの場合
        - **C:\windows\system32\drivers\etc\hosts

```sh:hosts
# 一番下に　IP (スペース) 任意の文字列 で追記する
192.168.33.10 development.com
```
http://192.168.33.10:8080 でアクセスできていたものが http://development.com:8080 でアクセスできるようになる


# [最後に]開発終了手順
## Cyberduck終了
Cyberduckはそのまま閉じてよい

## ウェブサーバーの停止とログアウト

```sh:/home/vagrant/
# ウェブサーバー停止
$ Ctrl + C

# ログアウトして終了
$ exit
```
## 仮想マシン停止
Vagrantより仮想マシンを停止させる

```sh:~/MyVagrant/CentOS7/
# 起動している仮想マシンのディレクトリで実行
# 仮想マシンを一時停止
$ vagrant suspend
# もしくは仮想マシンを停止
$ vagrant halt
```