ローカル開発環境構築

# ローカル開発環境とは
「ローカル」とは、自分の PC 、個人のコンピューターを指します。
「開発環境」とは、システムを開発するために必要な環境のことです。
つまり「ローカル開発環境」とは、個人のコンピューター内にあるシステムを開発するために必要な環境のことを表します。

# なぜローカル開発環境構築を行うのか
開発した Web アプリケーションをインターネット上で公開するためにはサーバーが必要です。
サーバーも自分達が使っている PC と同じコンピューターなので、 OS の元に動いています。

個人の使う PC の多くは、 Windows や macOS といった OS が使われていることがほとんどです。
一方、サーバーの OS として広く使われているのは Linux です。

ここで一つの懸念が生じます。
手元の Windows や Mac の PC で開発したアプリケーションが、Linux のサーバーで正しく動作するかどうか、ということです。
OS の差異によってプログラムが正しく動かない、ということは珍しくありません。

そのため、サーバー上で動作するプログラムを作るためには、ローカル環境の中に Linux と同じ環境を作る必要があります。

そのときに用いられる技術が「仮想化」です。

# 仮想化とは
物理コンピューター上に仮想的にコンピューターを作成する技術のことを仮想化と呼びます。
これにより、Windows 上で、Linux を動かしたり、 Mac 上で Linux を動かすことができるようになります。
ローカル開発環境構築においては、仮想化を用いて、自分の PC 上に仮想的な Linux の環境を作成し、その中に、開発に必要なソフトウェアなどをインストールしていきます。

また、仮想化によって作成される環境のことを「仮想環境」や「仮想マシン（VM: Virtual Machine）」と呼びます。
仮想化は仮想化ソフトウェアを用いて実現します。
仮想化ソフトウェアはいくつかありますが、今回はその中でも「VirtualBox」を使用します。

# VirtualBox とは
自分のパソコンの中に、仮想マシンを作ることができる仮想化ソフトウェアです。
仮想マシンは 1 つだけではなく、複数作ることもできます。
自分の PC 上にこのような仮想化ソフトウェアをインストールし、その上で仮想マシンを立ち上げます。
※ちなみに、仮想化ソフトウェアをインストールしたパソコン本体の OS を「ホスト OS」、仮想マシン上で動作する OS を「ゲスト OS」と呼びます。

VirtualBox は仮想マシンを立ち上げることができます。
しかし、環境構築において VirtualBox で立ち上げた仮想マシンに、 1 から OS をインストールしたり、その他諸々の設定を施していくのは大変です。
そこで、 Vagrant というツールを使います。

# Vagrant とは
Vagrant をシンプルに表すと、「仮想環境の構築を簡単にしてくれるソフトウェア」です。
通常、 VirtualBox のような仮想化ソフトだけでも仮想環境を構築することはできますが、それはかなり手間のかかる作業になります。
そこで Vagrant を用いることにより、仮想化ソフトを管理・操作し、シンプルなコマンドを用いて手間をかけずに仮想環境を構築することができます。

Vagrant はそれ単体では機能しないので、VirtualBox などの仮想化ソフトウェアと併せて使用します。
「環境そのものを提供」してくれるのが「VirtualBox」で、
「どんな環境にするか」の構成を決めるのが「Vagrant」
のようなイメージです。

また、Vagrant で環境構築を行う際、「どの OS の環境にするか」のベースになるものとして「Box」の存在があります。
Vagrant Box は、仮想マシンのテンプレート（雛形）となるファイルです。
この Box を利用し、使用したい OS の環境を構築します。

# ローカル開発環境構築の手順
前置きが長くなりましたが、ここから実際に環境構築を行なっていきたいと思います。

# 環境
macOS Monterey 12.1（21C52）

# 仮想化を行うためのツールのインストール
仮想化を行うために、以下の VirtualBox と Vagrant をインストールします。

## VirtualBox のインストール
以下の URL から 公式の VirtualBox のダウンロードページにアクセスし、自身の OS に合った VirtualBox のインストーラーをダウンロードします。
https://www.virtualbox.org/wiki/Downloads
￼![VirtualBox.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/760991/902b605a-f3de-6fdd-6635-506f168acdbd.jpeg)

**VirtualBox [バージョン番号] platform packages** の表記の下に

* Windows hosts
* OS X hosts
* ...

と、各 OS 毎のインストーラーが用意されているので、該当する OS のものを選択しダウンロードします。
今回は macOS なので「OS X hosts」のリンクをクリック。
その後はダウンロードしたインストーラーを起動させ、手順通りに進めます。
インストールが完了したら念の為、ターミナルを起動させ、以下のコマンドで確認してみます。

```:ターミナル
% VBoxManage -v
6.1.30r148432
```
このようにバージョンが表示されたらインストールが完了しています。

## Vagrant のインストール
以下の Vagrant 公式サイトから、OS に合わせたインストーラーを選択し、ダウンロードします。
https://www.vagrantup.com/downloads
![Download Vagrant.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/760991/00b9a730-ea7c-df8e-5cf5-d7b59346cb1a.png)
brew コマンドでもインストーラーをダウンロードできますが、今回はそれを使わずに、右側の「64-bit」のリンクを選択し、ダウンロードします。
ダウンロードが完了したら、インストーラーを起動し、それに従って進めていけば、 Vagrant がインストールされます。
ターミナルを起動させ以下のコマンドで Vagrant が正しくインストールされたかを確認します。

```:ターミナル
% vagrant -v
Vagrant 2.2.18
```

バージョンが表示されたら無事インストールは完了してます。



# Vagrant を使って CentOS の仮想環境を構築する
CentOS とは Linux の種類の一つです。
ここからは Vagrant の機能を利用しながら、仮想マシンを立ち上げます。

## Vagrant を実行するためのディレクトリを作成
Vagrant を使って VirtualBox を操作し、仮想環境を構築していきますが、Vagrant を利用する為には、それを管理するディレクトリが必要になります。以下、「どの OS の環境を構築するか」を意識し、Vagrant を管理するディレクトリを作成します。

今回はまず、 Vagrant を管理するディレクトリとして、ホームディレクトリ直下に「Vagrant」という名前のディレクトリを作成します。

```:ターミナル
% mkdir Vagrant
```

仮想環境は 1 つ作るのに 1 ディレクトリ が必要になります。
「1 ディレクトリに 1 つ Vagrantfile という設定ファイルを作成し、そのディレクトリ上で Vagrant を実行することで、 1 つの仮想環境が出来上がる」という仕組みです。
例えば、 CentOS7 、CentOS8 、Ubuntu の仮想環境をそれぞれ作ろうと思ったら 3 つのディレクトリが必要になります。

先ほど作った Vagrant ディレクトリを Vagrant プロジェクトを包括するディレクトリとし、その下に、OS 毎のディレクトリを作成して、それぞれのディレクトリで Vagrant を実行する、というようなディレクトリ構成にします。
（どんな風に Vagrant 用のディレクトリを作成するかは任意です。）

今回は CentOS8 の環境を作りたいので、Vagrant ディレクトリに、 CentOS8 用のディレクトリを作成します。

```:ターミナル
% cd Vagrant  // 先ほど作ったVagrantディレクトリに移動
% mkdir centos8
% cd centos8  // centos8ディレクトリに移動しておく
```

`pwd`コマンドで確認すると、以下のようなディレクトリパスになります。
`/Users/[ユーザー名]/Vagrant/centos8`

## Vagrantfile の作成
Vagrantfile は仮想環境を構築するための設定などを記述するファイルです。
Vagrant は、この Vagrantfile の内容を基に、仮想環境を構築します。

先ほど作成した centos8 のディレクトリ上で、
`vagrant init`コマンドで Vagrantfile の作成（＝ Vagrant の初期化）を行います。
その際、`vagrant init` に続けて、構築したい環境の OS の Box を指定します。
今回は web サーバーの OS に CentOS8 を使用したいので、
 [Vagrant Cloud](https://app.vagrantup.com/generic/boxes/centos8) から、`generic/centos8`を選択します。


```:ターミナル
% vagrant init generic/centos8
```

これで CentOS8 用の Vagrantfile が作成されました。
ディレクトリパスは以下のようになっています。
`/Users/[ユーザー名]/Vagrant/centos8/Vagrantfile`

## Vagrantfile の編集
作成した Vagrantfile の記述の一部を以下のように編集します。

```Ruby:ターミナル
  # 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" ← この記述を変更
  config.vm.network "private_network", ip: "192.168.56.12"
```
この記述は仮想サーバーに設定する IP アドレスを示しています。
今回は "192.168.56.12" というアドレスにしましたが、 VirtualBox が指定する範囲内のものであれば、任意で設定できます。
後に、この仮想サーバーにアクセスする際に、 この IP アドレスを用いることになります。

## 仮想マシンの起動

以下のコマンドで仮想マシンを起動させます。

```:ターミナル
% vagrant up
```

このコマンドにより、Vagrant Cloud  から generic/centos8 がダウンロードされ[^1]、
CentOS8 仕様の 仮想環境が構築されます。

[^1]: ダウンロードは初回のみです。vagrant up をする際、 Box ファイルがローカル（自分の PC 上）になければ、Boxファイルをダウンロードします。一度 vagrant up の実行に使用した Box は、 Mac の場合、~/.vagrant.d/boxes/ に保存されます。以降、その Box を利用した vagrant up では、~/.vagrant.d/boxes/ にあるファイルを読み込みます。

vagrant status コマンドで仮想マシンの状態を確認します。

```:ターミナル
% vagrant status
Current machine states:

default                   running (virtualbox)

The VM is running. To stop this VM, you can run `vagrant halt` to
shut it down forcefully, or you can run `vagrant suspend` to simply
suspend the virtual machine. In either case, to restart it again,
simply run `vagrant up`.
```

`running`と出力されれば、無事に仮想マシンが起動しています。

## 仮想マシンにアクセス
以下のコマンドで、起動した仮想マシンにログインします。

```:ターミナル
% vagrant ssh
```

以下のような表示が出れば、ログインに成功しています。

```:ターミナル
Last login: Thu Jan 13 20:36:10 2022 from 10.0.2.2
[vagrant@centos8 ~]$
```

redhat-release ファイルに CentOS のバージョン情報が載ってあるので、`cat`コマンドで`/etc/redhat-release`ファイルを確認してみます。

```:ターミナル
$ cat /etc/redhat-release
CentOS Linux release 8.5.2111
```
CentOS の 8 系がインストールされていることが確認できました。


# Web サーバーの構築

続いて、起動させた仮想環境上に Web サーバーを構築します。
そのために、nginx という Web サーバー用のソフトウェアを利用します。

また、 nginx をインストールするために dnf コマンドを使います。
dnf コマンドは、CentOS などの Linux 系 OS のためのパッケージ管理コマンドです。
y オプションを付けると、インストール時の問い合わせに対して、全て「yes」と答えます。

```:ターミナル
$ sudo dnf install -y nginx
```

nginx のインストールが完了したら、バージョンをチェックしてみます。

```:ターミナル
$ nginx -v
nginx version: nginx/1.14.1
```

バージョンが表示されればインストールは成功です。

それでは、以下のコマンドで nginx を起動させてみます。

```:ターミナル
$ sudo systemctl start nginx
```

状態を確認してみます。

```:ターミナル
$ sudo systemctl status nginx
● nginx.service - The nginx HTTP and reverse proxy server
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; vendor preset: disabled)
   Active: active (running) since Thu 2022-01-13 22:37:30 UTC; 2s ago
  Process: 2295 ExecStart=/usr/sbin/nginx (code=exited, status=0/SUCCESS)
  Process: 2294 ExecStartPre=/usr/sbin/nginx -t (code=exited, status=0/SUCCESS)
  Process: 2292 ExecStartPre=/usr/bin/rm -f /run/nginx.pid (code=exited, status=0/SUCCESS)
 Main PID: 2297 (nginx)
    Tasks: 3 (limit: 11402)
   Memory: 15.3M
   CGroup: /system.slice/nginx.service
           ├─2297 nginx: master process /usr/sbin/nginx
           ├─2298 nginx: worker process
           └─2299 nginx: worker process
```

`Active: active (running)`の表示が出たら nginx が上手く起動しています。



この状態で、IP アドレスを通してサーバーにアクセスし、nginx にデフォルトで用意されてあるウェルカムページを表示してみます。
先ほど、Vagrantfile の編集の際に設定した IP アドレスをブラウザにに入力します。
`http://192.168.56.12`

以下のようなウェルカムページが表示されれば成功です！
![スクリーンショット 2022-01-14 8.20.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/760991/f8b26ac5-a501-c4e2-899c-753e60f327b1.png)


最後に、仮想マシン起動時に自動的に Nginx が起動するように設定します。

```:ターミナル
$ sudo systemctl enable nginx
```