AWS EC2(Amazon Linux)にPHP7.4をインストール

今年からAWSを使う機会が増えてきました。

で、近々PHP 7.4がインストールされたWebサーバーを用意する必要がありそうなので、
事前に検証した内容をまとめておきたいと思います。

> 2021年2月10日 追記
> @yutaro1985様より、EC2へのPHP7.4は以下のコマンドでインストール出来るとご指摘いただきましたので、追記させていただきます。
>
>  ```sudo amazon-linux-extras install php7.4```

<h3>目標</h3>
ブラウザで`phpinfo()`の内容を表示して、PHPのバージョンが7.4であることを確認する

<h3>1.インスタンスの作成</h3>

利用するインスタンスのタイプは「Amazon Linux 2 AMI(HVM), SSD Volume Type」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140849/358f2ae6-4029-aa9c-932a-20ecaa941192.png)

検証なのでインスタンプのタイプは「t2.nano」にしました。

基本的に設定値はデフォルトにして、セキュリティーグループのインバウンドだけ、
SSHとHTTP(HTTPS)での接続を許可させました。(デフォルトはSSHのみ許可)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140849/8f1fcf34-d358-df0f-8f8f-f4bd8294006f.png)

<h3>2.PHPのインストール</h3>

PHPをインストールするためにはSSHでEC2に接続する必要があります。
接続する際は`sudo`コマンドが使えるアカウントでログインします。
※[こちら](https://dev.classmethod.jp/cloud/aws/aws-beginner-ec2-ssh/)の記事が参考になると思います。

ログインして、`php -v`を実行するとコマンドがない旨のメッセージが表示されます。
Amazon Linuxはインスタンスを作成した段階では、
`PHP`が入っていないようです。

```shell
$php -v
-bash: php: command not found
```

Aamazon Linuxは最初の段階では、パッケージが古い可能性があり、
ログイン時のメッセージでも`sudo yum update｀でアップデートするように促されるので、
おとなしく従います。

```shell

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
8 package(s) needed for security, out of 17 available
Run "sudo yum update" to apply all updates.
```

```shell
$ sudo yum update -y
```

`PHP`は`yum`でインストールするんですが、
`sudo yum install php`を素直に実行すると、バージョンが5.4の`PHP`がインストールされていまいます。
これは、Amazon Linuxが持っているリポジトリに、バージョン5.4の`PHP`しか入っていないためです。

```shell
sudo yum install php
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
amzn2-core                                                                                                                                                        | 2.4 kB  00:00:00
Resolving Dependencies
--> Running transaction check
---> Package php.x86_64 0:5.4.16-46.amzn2.0.2 will be installed
--> Processing Dependency: php-cli(x86-64) = 5.4.16-46.amzn2.0.2 for package: php-5.4.16-46.amzn2.0.2.x86_64
--> Processing Dependency: php-common(x86-64) = 5.4.16-46.amzn2.0.2 for package: php-5.4.16-46.amzn2.0.2.x86_64
--> Processing Dependency: httpd-mmn = 20120211x8664 for package: php-5.4.16-46.amzn2.0.2.x86_64
--> Processing Dependency: httpd for package: php-5.4.16-46.amzn2.0.2.x86_64
--> Running transaction check
---> Package httpd.x86_64 0:2.4.41-1.amzn2.0.1 will be installed
--> Processing Dependency: httpd-tools = 2.4.41-1.amzn2.0.1 for package: httpd-2.4.41-1.amzn2.0.1.x86_64
--> Processing Dependency: httpd-filesystem = 2.4.41-1.amzn2.0.1 for package: httpd-2.4.41-1.amzn2.0.1.x86_64
--> Processing Dependency: system-logos-httpd for package: httpd-2.4.41-1.amzn2.0.1.x86_64
--> Processing Dependency: mod_http2 for package: httpd-2.4.41-1.amzn2.0.1.x86_64
--> Processing Dependency: httpd-filesystem for package: httpd-2.4.41-1.amzn2.0.1.x86_64
--> Processing Dependency: /etc/mime.types for package: httpd-2.4.41-1.amzn2.0.1.x86_64
--> Processing Dependency: libaprutil-1.so.0()(64bit) for package: httpd-2.4.41-1.amzn2.0.1.x86_64
--> Processing Dependency: libapr-1.so.0()(64bit) for package: httpd-2.4.41-1.amzn2.0.1.x86_64
---> Package php-cli.x86_64 0:5.4.16-46.amzn2.0.2 will be installed
---> Package php-common.x86_64 0:5.4.16-46.amzn2.0.2 will be installed
--> Processing Dependency: libzip.so.2()(64bit) for package: php-common-5.4.16-46.amzn2.0.2.x86_64
--> Running transaction check
---> Package apr.x86_64 0:1.6.3-5.amzn2.0.2 will be installed
---> Package apr-util.x86_64 0:1.6.1-5.amzn2.0.2 will be installed
--> Processing Dependency: apr-util-bdb(x86-64) = 1.6.1-5.amzn2.0.2 for package: apr-util-1.6.1-5.amzn2.0.2.x86_64
---> Package generic-logos-httpd.noarch 0:18.0.0-4.amzn2 will be installed
---> Package httpd-filesystem.noarch 0:2.4.41-1.amzn2.0.1 will be installed
---> Package httpd-tools.x86_64 0:2.4.41-1.amzn2.0.1 will be installed
---> Package libzip010-compat.x86_64 0:0.10.1-9.amzn2.0.5 will be installed
---> Package mailcap.noarch 0:2.1.41-2.amzn2 will be installed
---> Package mod_http2.x86_64 0:1.15.3-2.amzn2 will be installed
--> Running transaction check
---> Package apr-util-bdb.x86_64 0:1.6.1-5.amzn2.0.2 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

=========================================================================================================================================================================================
 Package                                           Arch                                 Version                                           Repository                                Size
=========================================================================================================================================================================================
Installing:
 php                                               x86_64                               5.4.16-46.amzn2.0.2                               amzn2-core                               1.4 M
Installing for dependencies:
 apr                                               x86_64                               1.6.3-5.amzn2.0.2                                 amzn2-core                               118 k
 apr-util                                          x86_64                               1.6.1-5.amzn2.0.2                                 amzn2-core                                99 k
 apr-util-bdb                                      x86_64                               1.6.1-5.amzn2.0.2                                 amzn2-core                                19 k
 generic-logos-httpd                               noarch                               18.0.0-4.amzn2                                    amzn2-core                                19 k
 httpd                                             x86_64                               2.4.41-1.amzn2.0.1                                amzn2-core                               1.3 M
 httpd-filesystem                                  noarch                               2.4.41-1.amzn2.0.1                                amzn2-core                                23 k
 httpd-tools                                       x86_64                               2.4.41-1.amzn2.0.1                                amzn2-core                                87 k
 libzip010-compat                                  x86_64                               0.10.1-9.amzn2.0.5                                amzn2-core                                30 k
 mailcap                                           noarch                               2.1.41-2.amzn2                                    amzn2-core                                31 k
 mod_http2                                         x86_64                               1.15.3-2.amzn2                                    amzn2-core                               146 k
 php-cli                                           x86_64                               5.4.16-46.amzn2.0.2                               amzn2-core                               2.8 M
 php-common                                        x86_64                               5.4.16-46.amzn2.0.2                               amzn2-core                               563 k

Transaction Summary
=========================================================================================================================================================================================
Install  1 Package (+12 Dependent packages)

Total download size: 6.6 M
Installed size: 22 M
Is this ok [y/d/N]:

```

そのため、`yum`のリポジトリにPHP7.4が入っているremiリポジトリを使えるようにする必要があります。
※remiリポジトリやepel-releaseパッケージに関しては、[こちら](https://akamist.com/blog/archives/648)の記事が参考になります。

```shell
$sudo amazon-linux-extras install epel #Amazon Linux でepel-releaseパッケージをインストール出来るようにする
$sudo yum install epel-release #epel-releaseパッケージをインストール
$sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm #remiリポジトリを使えるようにする
```

あとは`PHP`をインストールするだけです。

```shell
$ sudo yum install -y php74 php74-php php74-php-fpm
$ sudo ln -s /usr/bin/php74 /usr/bin/php
$ php -v
PHP 7.4.1 (cli) (built: Dec 17 2019 16:35:58) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
```

<h3>3.確認</h3>
今回の目的は、ブラウザからPHPのバージョンを確認することなので、
`phpinfo()`を実行するためのPHPファイルを配置していきます。

Webサーバーは`apahce`で、ドキュメントルートは`/var/www/html`となります。

```shell
$ httpd -v
Server version: Apache/2.4.41 ()
Server built:   Oct 22 2019 22:59:04
$ cat /etc/httpd/conf/httpd.conf  |grep ^DocumentRoot
DocumentRoot "/var/www/html"
$sudo service httpd restart # apacheの再起動
```

```shell
$cat /var/www/html/index.php
<?php
phpinfo();
```
あとは、EC2サーバーの「パブリック DNS (IPv4)」を、
ブラウザのアドレスに入力して、`phpinfo()`の結果が表示されることを確認。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140849/0e8aa4d6-1bb5-d7e8-3546-54e500d401cf.png)


<h3>まとめ</h3>

今回はPHP7.4のインストールから、確認まで行なってみましたが、
AWSは構築に失敗しても、直ぐに作りなおせるので気軽に試してみることが出来るのがとてもいいです。
手順に不備など有りました、ご指摘いただけると助かります。