【全コマンド掲載】CentOS 7 で LAMP の環境構築【MySQLリポジトリ問題解消済】

<br>
2020年11月時点で、下記環境でLAMP環境構築を行いましたので、記録として残しておきます。

免責：環境構築はやり方を間違えると、最悪の場合は修復不可となることもありますが、当方は一切の責任を負いません。そのため、参考にされる方は *万が一* に備えられるよう、自己責任の範疇で試される事をオススメします。
<br>
<br>

## バージョン情報など

### ハードウェア
Mac OS Catalina 10.15.7
MacBook pro 16-inch 2019

### ソフトウェア
VirtualBox 6.1.16

### 構築バージョン
CentOS 7
Apache 2.4
MySQL 5.7
PHP 7

### 環境構築フロー
<ol>
  <li>VirtualBoxインストール</li>
  <li>CentOSインストール</li>
  <li>yumインストール</li>
  <li>Apacheインストール</li>
  <li>PHPインストール</li>
  <li>MySQLインストール</li>
</ol>
<br>
<br>
<br>

## 用語説明
### 仮想環境
1台のPCで複数のOSを動かす際に使用する環境。
### VirtualBox
仮想環境を構築するためのアプリケーション、
### CentOS
Linux から派生したRedHut系のオープンソースOS。
### yum
パッケージ管理ソフトの１つで、正常に動作するバージョンの組み合わせを提示してくれる。
### Apach
Nginxと並び、利用されることの多いWebサーバーの１つ。
### PHP
ワードプレスなどでも使用されている、バックエンドプログラミング言語。
### MySQL
オープンソースで最も利用されている、データベースエンジン。
<br>
<br>
<br>

## VirtualBox

### インストール
まず`VirtualBox`をインストールします。

ダウンロードURL
https://www.virtualbox.org/wiki/Downloads

Windows版、Mac版それぞれのリンクがありますので、そちらからダウンロードが完了したら、早速「新規」から環境の新規作成を行います。
<br>
<br>

### 仮想環境の作成
「新規」を押すとダイアログが出てきますので、下記のように入力。

名前：CentOS 7(ここは任意の名前で大丈夫です)
マシンフォルダー：VirtualBox VMs
タイプ：Linux
バージョン：Red Hat (64-bit)

<br>

「続き」を押して以下の手順。

①`メモリーサイズ`を聞かれるので、デフォルトのまま次へ。
②`ハードディスクの割り当て`を聞かれるので、デフォルトのまま次へ。
③`ハードディスクのファイルタイプ`を聞かれるので、デフォルトの *VDI* で次へ。
④`ストレージサイズ`を聞かれるので、デフォルトの *可変サイズ* で次へ。
⑤`ファイルの場所とサイズ`を聞かれるので、デフォルトのまま作成。

正常に動作していれば、これで仮想環境の作成が完了です。
<br>
<br>

### VirtualBoxの設定
次に作成された仮想環境を選択し、設定をクリックした所から以下の手順。

①`ネットワーク`の割り当ては *ブリッジアダプター* へ変更。(ネットワーク接続の並列化)
②次に`ディスプレイ`の割り当ては *VBoxVGA* に変更。(ポインタ消失の防止)

これでVirtualBoxの設定は完了です。
<br>
<br>
<br>

## CentOS 7

### CentOSダウンロード
公式サイトより、OSのダウンロードを行います。

公式サイト
https://www.centos.org/

<br>

公式サイトを表示した所から以下の手順。

① *CentOS Linux* を選択し次へ。
②バージョンを選択できる画面に移りますので、今回は *7(2009)* タブで *X86_64* を選択し次へ。
③表示される画面にて、ftp接続でOSがダウンロードできるページ一覧(URL)が出てきます。どのURLからでもインストールできるので、どれか一つを選択し次へ。
④するとさらにOSの詳細が選べるので、今回は *CentOS-7-x86_64-DVD-2009.iso* を選択してダウンロード。(保存場所はわかりやすいように、デスクトップなどにしておけば大丈夫です。)

>基本的にはどのページからダウンロードしてもらっても構いませんが、ページによって若干ダウンロード時間の差異があるみたいです。もしダウンロードが終わらない場合は、別のURLからダウンロードを試してみると解決するかもしれません。

以上でダウンロードが完了です。いよいよ先ほど`VirtualBox`で作成した仮想環境に、OSをインストールします。
<br>
<br>

### OSインストール
`VirtualBoxを`開いた所から以下の手順。

①作成した仮想環境を選択し「設定」を選択し次へ。
②`ストレージ`を選択し、 *コントローラ:IDE* の隣にあるディスクのマーク(光学ドライブの追加)を選択し次へ。
③ダイアログ上で、先ほどダウンロードしたCentOSをセットし「選択」。

これでOSのセットが完了しました。

<br>

再び作成した仮想環境を選択し「起動」をクリック。するとデスクトップ上にPCのOSとは別のOS(Linux Red Hut)で、ウィンドウが開きます。これが仮想環境です。

>仮想環境に入るとポインタが外に出せなくなります。元のOS上の操作に戻る時は、Macなら「左command」、Windowsなら「右のCtrl」で仮想環境から抜け出せます。

<br>

仮想環境が立ち上がったら、「CentOSをインストールしますか？」と英語で聞かれるので、デフォルトの表示のまま「Enter」を押すと、CentOSのプリインストールが開始されます。(または一定時間が立つと、自動的にプリインストールが開始。)

無事にプリインストールが完了できれば、このようなCentOSの初期設定の画面になります。

![スクリーンショット 2020-11-26 11.27.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/882660/d04be851-f238-ef68-26f3-64212ebeb5aa.png)


この画面からの手順は以下の通り。

①言語を日本語に選択。
②インストール先で、*ローカルの標準ハードディスク* に設定。
③ネットワークとホスト名で、*Ethernet(enp0s3)* の横のスライドバーをオンに設定。
④インストールを開始。
⑤インストール中に、*ROOTパスワード* を設定。

本来であれば、この時点で *ユーザーの作成* も行うのですが、今回は無しで行きます。あとはインストールが完了するまで待機。

>因みにパスワードを設定した *rootユーザー* とは、管理者権限を持ち、全てのコマンドを実行する事ができるアカウントの事。(スーパーユーザーとも呼ばれる)

<br>

インストールが完了すれば、再起動します。再起動後に下記画像のログイン画面になれば、無事CentOSのインストールが成功です。

![スクリーンショット 2020-11-26 17.22.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/882660/1e80942e-7a32-7717-141e-a8d8b4dfa1fd.png)

<br>
<br>
<br>

## 基本操作

### ログイン
上記画像の画面から以下の手順。

① *root* (管理者権限のユーザー)と入力して「Enter」
②先ほどインストール中に設定したパスワードを入力して「Enter」

[root@localhost]# という表示が出れば、ログイン成功です。
<br>
<br>

### ログアウト
下記コマンドを入力でログアウトし、ログイン画面に戻る。

```html
$ exit
```

>因みに一般ユーザーの場合のプロンプトは $ で、スーパーユーザーの場合のプロンプトは # になります。

<br>
<br>

### シャットダウン
下記コマンドを入力で、仮想環境ごと停止。

```html
$ shutdown -h now
```
<br>
<br>

### スナップショット
ここからどんどんインストールをしますが、もし途中で致命的なエラーなどが発生してしまった場合、1からやり直すのはかなり面倒臭いです。

しかし何かをインストールする前などに、スナップショット(バージョンの保存)を撮っておくことで、エラーが発生しても元の状態に復元をすることができます。

<br>

スナップショットの撮り方は以下の手順。

①`VirtualBox` の画面を表示。
②作成した環境構築を選択し、３本バーをクリック。
③スナップショットをクリック。
④作成をクリック。
⑤名前と説明を記載して保存。

これでスナップショットが撮れました。もし復元する際は、復元したいスナップショットを選択し、復元をクリックすることで可能です。
<br>
<br>
<br>

## yum
yumを使って、アップデートやリポジトリのインストールを行います。

>ここからは基本的にコマンド操作になります。

<br>
<br>

### ソフトウェアアップデート
まずは既ににインストールされているソフトウェアの、アップデートを実施します。コマンドは以下の通り。

```html
$ sudo yum update
```
実行すると、次々にアップデートされていきます。画面が止まっていても、プロンプト($ か #)が表示されない限りは、裏側で動作が続いている状態なので、落ち着いて待ちましょう。

>途中バージョンの確認や鍵認証について聞かれますが、全て y で大丈夫です。

<br>
<br>

### EPELリポジトリ
次にEPELリポジトリのインストールを行います。コマンドは以下の通り。

```html
$ sudo yum install epel-release
```
*Complete!* と表示されれば、EPELリポジトリのインストールが完了です。

>今後、何かをインストールする際に、たまに実行直後にパスワードを求められる事がありますので。その場合はパスワードを入力しましょう。また途中で、バージョンの確認が聞かれますが、y で大丈夫です。

<br>
<br>

### Remiリポジトリ
次にRemiリポジトリのインストールを行います。コマンドは以下の通り。

```html
$ sudo yum install https://rpms.remirepo.net/enterprise/remi-release-7.rpm
```

*Complete!* と表示されれば、Remiリポジトリのインストールが完了です。

>途中バージョンの確認が聞かれますが、y で大丈夫です。

<br>
<br>
<br>

## Apache 2.4
次にWebサーバーとしてApacheをインストール、設定していきます。

### インストールと初期設定
コマンドはこちら。

```html
$ sudo yum install httpd
```

*Complete!* と表示されれば、Apacheのインストールが完了です。

>途中バージョンの確認が聞かれますが、y で大丈夫です。

<br>

次にOSの起動と同時に、Apacheも起動するように設定します。コマンドは以下の通り。

```html
<!-- 設定を変更 -->
$ sudo systemctl enable httpd

<!-- 変更内容を反映するためOSの再起動 -->
$ sudo reboot

<!-- 再度ログインし、Apacheのステータスを確認 -->
$ systemctl status httpd
```

最後のコマンドで *active (running)* と表示されれば成功です。
<br>
<br>

### Firewallの設定
Firewallとは、OSが標準搭載しているセキュリティになります。コマンドはこちら。

```html
<!-- http に使用するポート番号 80 を開放。 -->
$ sudo firewall-cmd --permanent --zone=public --add-service=http

<!-- https に使用するポート番号 443 を開放。 -->
$ sudo firewall-cmd --permanent --zone=public --add-service=https

<!-- Firewall をリロードし、変更した設定を反映させる。 -->
$ sudo firewall-cmd --reload
```

全て実行後に *success* と表示されれば成功です。

>因みに過去に使用したコマンドは上矢印キーで、もう一度表示、実行をする事ができます。今回のように、長いコマンドで重複部分が多い場合などは便利です。

<br>
<br>

### SELinuxの設定
SELinuxとは、サーバへの不正アクセスや情報漏洩を防ぐ為のセキュリティ対策の設定です。少し複雑なのと、今回はローカル開発環境での開発になるので、SELinuxはOFFにします。コマンドはこちら。

```html
<!-- まずSELinuxの状態を確認 -->
$ getenforce

<!-- Enforcingと表示されている事を確認したら、設定ファイルの編集を行う画面に移動 -->
$ sudo vi /etc/selinux/config
```

<br>

編集画面になったら以下の手順。

①SELINUX=enforcing の enforcing ところにカーソルを移動。
②i と入力でインサートモード(編集ができる状態)。
③enforcing を disabled と編集する。
④esc でノーマルモード。
⑤:wq で変更内容を保存しコマンドモードに戻る。

<br>

ここまでできたら以下のコマンドを実行。

```html
<!-- 設定内容を反映するため再起動 -->
$ sudo reboot

<!-- SELinux の状態を確認 -->
$ getenforce
```

*Disabled* と表示されれば成功。
<br>
<br>

### IPアドレスの確認
コマンドはこちら。

```html
$ ip addr
```

*enp0s3* の *inet* に記述されているIPアドレス(000.000.0.00 の形)が、今回のローカル開発環境のIPアドレス。ブラウザでIPアドレスを検索し、Apache のテストページが表示されれば成功。
<br>
<br>
<br>

## PHP 7
まずはyumでインストール可能なPHPのバージョンを調べます。コマンドはこちら。

```html
$ yum list available | grep php71-php-common
```


表示されるバージョンが、正常に動作しインストールできるバージョンです。

<br>

確認が終われば、インストールを行います。コマンドはこちら。

```html
$ yum --enablerepo=remi-php71 install php php-devel php-mysql php-gb php-mbstring
```

*Complete!* と表示されれば成功です。

>途中バージョンの確認や鍵認証について聞かれますが、全て y で大丈夫です。

<br>

Apacheにインストール情報を反映させる為に、Apacheを再起動しておきます。コマンドはこちら。

```html
$ sudo systemctl restart httpd
```
<br>
<br>

## MySQL 5.7

### MariaDBの削除
最後にMySQLをインストールしていくのですが、その前にCentOSにプリインストールされているMariaDBを削除します。コマンドはこちら。

```html
$ sudo yum remove mariadb-libs
```

*Complete!* と表示されれば成功です。

>途中、本当に消しても良いか聞かれますが、y で大丈夫です。

<br>

またMariaDBに関するデータなども不要なので削除します。コマンドはこちら。

```html
$ sudo rm -rf /var/lib/mysql
```

何も表示されなければ成功です。
<br>
<br>

### 公式リポジトリの追加
コマンドはこちら。

```html
$ sudo yum localinstall https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
```

*Complete!* と表示されれば成功です。

>途中バージョンの確認について聞かれますが、 y で大丈夫です。

<br>
<br>

### 有効バージョンの切り替え
さて、ここまで来たらあとはインストールするだけなのですが、実は現時点では問題があります。

>この内容は少し複雑なので、「とりあえず構築ができれば良い」という方は、解説を読み飛ばしてもらっても大丈夫です。

<br>

今回の環境構築でインストールするMySQLのバージョンは、5.7 になります。が、現在(2020年11月時点)MySQLで配布されているリポジトリで、素直にMySQL5.7をインストールできるものは、既に削除されてしまっています。

その為、MySQL5.7をインストールするには、現在配布されているMySQL8.0のリポジトリをインストールし、その中で有効バージョンをMySQL5.7へ、手動で切り替える必要があります。

<br>

さらにここでもう一つ問題があります。

MySQLのリポジトリの有効バージョンを変更するには、CentOS7にデフォルトでは入っていないコマンドを実行しなければなりません。そのため、MySQLのリポジトリの有効バージョンを変更前に、コマンドが実行できるように、yum-utilsというのをインストールします。

<br>

少し長くなりましたので、流れをまとめると以下の通りです。

①まずCentOS7に無いコマンドを実行できるように、yum-utilsをインストール。
②コマンドが使えるようになったら、MySQLリポジトリの有効バージョンを変更。
③有効バージョンがMySQL5.7に変更できたら、MySQLをインストール。

>この内容は初めて環境構築される方には、少し内容が複雑なので、一旦は理解できなくても大丈夫です。

<br>

ということで、まずはyum-utilsのインストールを行います。コマンドはこちらです。

```html
<!-- インストールできるyum-utilsのバージョンを確認 -->
$ yum info yum-utils

<!-- バージョンが確認できたら、yum-utilsのインストール -->
$ yum install yum-utils

<!-- 念のためインストールしたバージョンを確認 -->
$ yum-config-manager --version
```

2つ目のコマンドで *Complete!* と表示されれば成功です。

>途中バージョンの確認について聞かれますが、 y で大丈夫です。

<br>

続けて、MySQLリポジトリの有効バージョンを変更します。コマンドはこちら。

```html
<!-- デフォルトで設定されていたMySQL8.0を無効化 -->
$ yum-config-manager --disable mysql80-community

<!-- 次にMySQL5.7を有効化 -->
$ yum-config-manager --enable mysql57-community

<!-- MySQL8.0がdisabled、MySQL5.7がenabledになっているか確認 -->
$ yum repolist all | grep mysql
```

MySQL8.0が *disabled*、MySQL5.7が *enabled* になっていれば成功です。
<br>
<br>

### インストール
それでは、最後にMySQLのインストールを行います。コマンドはこちら。

```html
$ sudo yum install mysql-community-server
```

*Complete!* と表示されれば成功です。

>途中バージョンの確認や鍵認証について聞かれますが、全て y で大丈夫です。

<br>
<br>

### 初期設定
最後にMySQLの初期設定を行います。コマンドはこちら。

```html
<!-- MySQLを起動 -->
$ sodo systemctl start mysqld

<!-- 初期パスワードの確認 -->
$ sudo cat /var/log/mysqld.log | grep 'temporary password'
```
localhost: 以降の文字列が初期パスワードになります。
<br>

パスワードが確認できたら、こちらのコマンドで初期設定を開始します。

```html
$ mysql_secure_installation
```
<br>

以下はコマンド実行後の手順。

①初期パスワードを入力。
②パスワードを変更。パスワードポリシーは、小文字と大文字と数字と特殊文字の組み合わせ。(パスワードの強度が弱い場合は、再度入力を求められる。)
③匿名ユーザを削除するか確認。(今回は削除するので y)
④ローカルホスト以外からアクセスを無効にするか確認。(今回は無効にするので y)
⑤テスト用のデータベースを削除するか確認。(今回は削除するので y)
⑥設定を反映する為にリロードするか確認。(今回は反映したいので y)

最後に *ALL done* と表示されたら成功。
<br>
<br>

### 文字コードの設定
デフォルトの文字コードでは utf8 になっていないので、設定ファイルを開き、インサートモードで文字コードを編集します。コマンドはこちら。

```html
$ sudo vi /etc/my.cnf
```
<br>

編集画面になったら以下の手順。

①socket=/var/lib/mysql/mysql.sock の下の空白行にカーソルを移動。
②i と入力でインサートモード(編集ができる状態)。
③character-set-server=utf8 と追記編集する。
④esc でノーマルモード。
⑤:wq で変更内容を保存しコマンドモードに戻る。

<br>

設定を反映させる為に、MySQLを再起動します。また再起動が終わったら、ついでにApacheと同じく、OSの起動と同時にMySQLも起動するように設定します。コマンドはこちら。

```html
<!-- MySQLの再起動 -->
$ sudo systemctl restart mysqld

<!-- OSの起動と同時にMySQLも起動するように設定 -->
$ sudo systemctl enable mysqld

<!-- 設定が反映されているかの確認 -->
$ systemctl list-unit-files -t service | grep mysqld
```

*mysqld.service enabled* と表示されていれば成功。

以上でLAMP環境構築が完了です。
<br>
<br>
<br>

## まとめ
今はCentOSも8系が出ており、もしワードプレスなどを構築する際は、そちらの方がオススメです。また、Linuxディストリビューションは、RedHut系オープンソースのCentOS以外に、Debian系オープンソースのUbuntuも使用されたりします。

もし学習の余裕があれば、そちらの構築も経験しておくと、どこかで役に立つかもしれませんので、興味のある方はまたVirtualBoxを使って、試してみてください。

最後まで読んでいただきありがとうございました！
<br>
<br>
<br>

筆者：yuki｜学習10日目で初案件獲得→現在はフルスタックエンジニア転職に向けて学習中
Qiita：https://qiita.com/yuki4839
Twitter：https://twitter.com/yuki35522891