EC2 (Amazon Linux 2 ) にPHP7.2 をインストールし、php.ini を設定するまでのまとめ

Amazon Linux は2020/12/31 でサポートが終了してしまうため、
後継のOS であるAmazon Linux 2 への移行が必要になりました。

単純にOS アップデートできないようだったので、
新たにAmazon Linux 2 のインスタンスを作ってミドルウェアを入れ直しました。

後々同じことをやる方のググる手間を省ければと思い、まとめました。
「とりあえずEC2でPHPを動かしたいぞ！！！」というあなたのお役に立てれば幸いです:pray:

# 前提
■ 先にVPCやサブネットの用意を終わらせておくとスムーズです。
　 （ECインスタンス作成時に紐付けられるため）

　 もしよろしければ、以下の記事を参考になさってみてください！
　 ・[VPC作成 〜 パブリック・プライベートサブネットを作るまでの手順①](https://qiita.com/kanadeee/items/527e7ea4daed36b396fe)
　 ・[VPC作成 〜 パブリック・プライベートサブネットを作るまでの手順②](https://qiita.com/kanadeee/items/daba7a84ac89eb89556c)

■ CloudFormation を使った構築手順については今回触れません。

# ざっくりの流れ
1. EC2 インスタンスを作成
2. タイムゾーンを日本に設定する
3. 言語を日本語に設定する
4. ホスト名を設定する ①
5. ホスト名を設定する ②
6. LAMP環境をインストールする
7. `mb`モジュールをインストールする
8. `php-xml`モジュールをインストールする
9. `php.ini` を設定する

# 1. EC2 インスタンスを作成

**▼ 参考：
　[AWSコンソールからEC2インスタンスを作成する手順](https://qiita.com/kanadeee/items/cfdcffea3e47a0a71c98)**

LAMP環境をインストールする際、EC2インスタンスにssh接続する必要があります。
EC2インスタンス作成時には`既存のキーペアの選択` or `新しいキーペアの作成`を選ぶようにしてください。

**▼ EC2インスタンスにssh接続するコマンド：**

```
ssh -i [キーペアのパス] ec2-user@[パブリック IPv4 アドレス]
```
# 2. タイムゾーンを日本に設定する
```
sudo cp /usr/share/zoneinfo/Japan /etc/localtime
```
```
sudo vi /etc/sysconfig/clock
```
```ruby:/etc/sysconfig/clock
#ZONE="UTC"
ZONE="Asia/Tokyo"
UTC=true
```
# 3. 言語を日本語に設定する
```
sudo vi /etc/sysconfig/i18n
```
```ruby:/etc/sysconfig/i18n
LANG=ja_JP.UTF-8
```
# 4. ホスト名を設定する ①
![Screenshot 2020-12-23 17.44.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156147/a1c9856f-5881-dc79-076f-c8cfbaa5b2ce.png)

```
sudo hostnamectl set-hostname <ホスト名>
```
**▼ 参考：
　[Amazon Linux インスタンスのホスト名を変更する - Amazon Elastic Compute Cloud](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/set-hostname.html)**

デフォルトのままだとわかりづらいため、わかりやすいホスト名に変更するのがおすすめです。
# 5. ホスト名を設定する ② ※ 不要な場合は飛ばしてOK
```
sudo vi /etc/cloud/cloud.cfg
```
末尾に`preserve_hostname: true` を追記する

**▼ 参考：
　[Amazon Linux 2でカスタムAMIからの起動時にホスト名を固定する方法 | Developers.IO](https://dev.classmethod.jp/articles/amazon-linux-2-change-and-fix-hostname-when-launch-from-custom-ami/)**

カスタムAMI を取得 → カスタムAMI から新しいインスタンスを起動してみたらホスト名の設定が無効になっていたので、有効にし続けるための設定です。
# 6. LAMP環境をインストールする
**▼ 参考：
　[チュートリアル: Amazon Linux 2 に LAMP ウェブサーバーをインストールする - Amazon Elastic Compute Cloud](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-lamp-amazon-linux-2.html)**

# 7. `mb`モジュールをインストールする
**▼ 参考：
　[Amazon Linuxでphpでmbstringを使う - Qiita](https://qiita.com/osada/items/885510dae4e8ec4c88f4)**

PHPにはマルチバイト文字列を扱うための関数がいろいろあります。(例：`mb_substr`)

`mb`モジュールをインストールしておかないと、PHPを実行した際に`Fatal error` が出てしまいます。
# 8. `php-xml`モジュールをインストールする
```
sudo yum install --enablerepo=remi,remi-php70 php-xml
```
```
sudo systemctl restart httpd
```
問題なくインストールされていることの確認は以下のコマンドでできます。

```
[ec2-user@XXXXXX ~]$ yum list installed | grep php-xml
php-xml.x86_64                        7.2.34-1.amzn2                 @amzn2extra-php7.2
[ec2-user@XXXXXX ~]$ 
```

`php-xml`モジュールをインストールしていなかったために、PHPのエラー `Fatal error: Class 'DOMDocument' not found` が出てしまいました:japanese_goblin:

# 9. `php.ini` を設定する
**▼ 参考：
　[【PHP】PHPをインストールしたらやっておきたい設定 - Qiita](https://qiita.com/knife0125/items/0e1af52255e9879f9332)**
 
初期状態の`/etc/php.ini` をコピーしてバックアップを取っておいてから設定を変更するようにすれば、何かあったときに戻せるので安心です。

上記の記事で「セキュリティに関する設定」として記載されている`session.hash_function` などは`PHP 7.1.0` から削除されているので設定不要です。

# 参考
- [Amazon Linux インスタンスのホスト名を変更する - Amazon Elastic Compute Cloud](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/set-hostname.html)
- [Amazon Linux 2でカスタムAMIからの起動時にホスト名を固定する方法 | Developers.IO](https://dev.classmethod.jp/articles/amazon-linux-2-change-and-fix-hostname-when-launch-from-custom-ami/)
- [チュートリアル: Amazon Linux 2 に LAMP ウェブサーバーをインストールする - Amazon Elastic Compute Cloud](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-lamp-amazon-linux-2.html)
- [Amazon Linuxでphpでmbstringを使う - Qiita](https://qiita.com/osada/items/885510dae4e8ec4c88f4)
- [【PHP】PHPをインストールしたらやっておきたい設定 - Qiita](https://qiita.com/knife0125/items/0e1af52255e9879f9332)
- [PHP: 実行時設定 - Manual](https://www.php.net/manual/ja/session.configuration.php)