[AWS EC2]nginxに対応したPHP環境を作成 ~備忘録~

## はじめに
この記事はプログラミング初学者による備忘録用の記事であり、また、少しでも他の初学者のお役に立てればと思い書いています。

今回は、EC2上でnginxを使いPHPを動かす設定の流れを学びましたので、すぐに復習できるよう記事にまとめておきたいと思います。

間違いなどがございましたら、ご指摘のほどよろしくお願い致します。

## EC2でPHPを起動させる準備

### 1.PHPのインストール
まず初めに、EC2上でPHPのインストールを行います。
ターミナルでEC2にログイン後、下記のコマンドを入力して利用可能なバージョンを確認した後にインストールを実行します。

```
$ amazon-linux-extras 
//利用可能なトピックのリストが一覧で表示される

0  ansible2                available    \
        [ =2.4.2  =2.4.6  =2.8  =stable ]
# 略
42  php7.4       available    [ =stable ]
//42番目にphp7.4が利用可能であることがわかる(7.3なども利用可能)

$ sudo amazon-linux-extras install php7.4 -y
//実行することでphp7.4がインストールされる

完了しました！
# 略
42  php7.4=latest  enabled    [ =stable ]
//上記のように表示されている場合、インストールが成功
```
上記のように、``$ amazon-linux-extras``コマンドを実行して利用可能なトピックのリストを確認した後に、今回の場合だとphp7.4をインストールするために、``$ sudo amazon-linux-extras install php7.4 -y``コマンドを実行しています。
実行結果として``php7.4=latest enabled [ =stable ]``の表示があればインストールが成功しています。

### 2.PHP-FPMの起動
nginxを利用してPHPを動かすために、**PHP-FPM**と呼ばれるプログラムを起動させる必要があります。

PHPをインストールした段階では、PHP-FPMは起動していません。

まずはnginxとPHP-FPMのプロセスを確認するため、下記のコマンドを実行します。

```
$ ps -o user,group,cmd -e | grep -v grep | grep -e nginx -e php-fpm
//起動中のプロセスをnginxとphp-fpmという語句が含まれるものに絞って表示する

//実行結果
root     root     nginx: master process /usr/sbin/nginx
nginx    nginx    nginx: worker process

//1行目は、nginxのマスタープロセスでrootユーザー権限で動いています。

//2行目は、nginxのワーカープロセスでnginxユーザー権限で動いています。
```
上記の実行結果から、**PHP-FPMのプロセスは起動していない**ことがわかります。

``~コマンドとコマンドオプションの補足~``

**・psコマンド** : 起動中のプロセスを表示する

**・grepコマンドの「-v」オプション** : 指定した検索文字列やパターンと一致しないデータを表示する

**・grep コマンドの「-e」オプション** : 指定した検索文字列やパターンのテキストを検索して一致したデータを表示する
<br>
次に、PHP-FPMを起動させるために下記コマンドを実行し、もう一度起動中のプロセスを表示するコマンドを実行してPHP-FPMが起動していることを確認します。

```
$ sudo systemctl start php-fpm
//PHP-FPMを起動させます

$ sudo systemctl restart nginx
//nginxにPHP-FPMを認識させるため、nginxを再起動します

$ ps -o user,group,cmd -e | grep -v grep | grep -e nginx -e php-fpm

//実行結果
root     root     php-fpm: master process (/etc/php-fpm.conf)
apache   apache   php-fpm: pool www
apache   apache   php-fpm: pool www
apache   apache   php-fpm: pool www
apache   apache   php-fpm: pool www
apache   apache   php-fpm: pool www
root     root     nginx: master process /usr/sbin/nginx
nginx    nginx    nginx: worker process
```
上記の実行結果から、nginxとPHP-FPMが起動していることがわかります。

``~実行結果の補足~``

**php-fpm: pool www** : PHP-FPMのプールと呼ばれるもので、PHPの処理を行うものです。

※PHP-FPMのプールのユーザーとグループがapacheになっているので変更する必要があります。

上記の手順を踏むことで、EC2インスタンスにExtras LibraryからPHPをインストール後、PHP-FPMを起動させることでPHPプログラムを動かすことが可能になります。

今回は、PHP-FPMの起動までしか行っていませんが、PHP-FPMを起動させたら、PHPのプログラムが正常に動くかを確認しておくと良いと思います。

何かを表示するPHPプログラムをviにて作成後、ブラウザでEC2インスタンスのパブリックIPアドレスにアクセスして表示されることを確認してください。


## PHPアプリケーションを動かすための準備
PHPアプリケーションを動かすために、PHP関連のパッケージをインストールする必要があります。

### 1.Composerのインストール
**ComposerはPHP用の依存関係マネージャです。**
Composerを使用して、ライブラリのインストールやアプリケーションの依存関係の追跡、PHPフレームワーク用のプロジェクトの作成を行うことができます。

EC2にはデフォルトでcomposer本体がインストールされていないので、Composerのインストールを実行します。
Composer本体のインストールはroot権限で実施する必要があるので、``$ sudo``を扱える``ec2-user``ユーザーで下記のコマンドを実行します。

```
$ cd ~
$ sudo curl -sS https://getcomposer.org/installer | php

//実行結果
All settings correct for using Composer
Downloading...

Composer (version 2.1.8) successfully installed to: /home/ec2-user/composer.phar
Use it: php composer.phar
```
上記のように、Composerをインストールするために、``getcomposer.org``のPHP スクリプトを使用します。
インストーラによって現在のディレクトリにPHARファイルが生成され、このファイルを環境 PATH内に移動することで、実行可能ファイルとして使用できます。

### 2. composer.pharの所有者とグループを変更、PATHを通す
ダウンロードした``composer.phar``の所有者とグループを``root``に変更して、composer.pharを利用するためにPATHを通す設定を行います。

下記のコマンドを実行してください。

```
$ sudo chown root:root composer.phar
$ sudo mv composer.phar /usr/bin/composer
```
1行目の``chownコマンド``に関しては補足でまとめていますので参考にしてください。

2行目では、インストーラによって現在のディレクトリに``composer.phar``ファイルが生成されるので、このファイルを環境 PATH 内に移動させることで、実行可能ファイルとして使用できるようにしています。

### 3.Composerが実行できるかを確認する
``ec2-userユーザー``で、下記のコマンドを実行してインストールしたComposerのバージョンを確認してください。

```
$ composer -v

//実行結果
Composer version 2.1.8 2021-09-15 13:55:14
```
上記のようにバージョンが表示された場合は問題ありません。

Composerのバージョンを1系にする必要がある場合は、下記のコマンドを実行してバージョンを変更してください。

```
$ sudo composer self-update --1

Warning: You forced the install of 1.10.22 via --1, but 2.1.8 is the latest stable version. Updating to it via composer self-update --stable is recommended.
Upgrading to version 1.10.22 (1.x channel).

Use composer self-update --rollback to return to version 2.1.8
```
上記のように警告文が表示されますが問題ありません。
バージョンを変更後、再度``$ composer -v``を実行してバージョンを確認してください。
Composerのバージョンが1.x.xとなっていれば大丈夫です。

### 4.php-mbstringとphp-xmlのインストール
次に、``php-mbstring``と``php-xml``をインストールします。
これらを事前にインストールしておくことで、PHP関連パッケージ(Laravelフレームワーク本体など)のインストールが行えます。

下記のコマンドを、``ec2-user``ユーザーで実行します。

```
$ sudo yum install php-mbstring php-xml -y

//実行結果
完了しました! と表示されていればインストールは成功です
```

## PHP関連パッケージのインストール
``ec2-user``とは別で追加したユーザー(例:webapp)に切り替えて、``/home/webapp/ディレクトリ名``にてインストールを行います。
ユーザーの作成方法は[リンク先](https://qiita.com/susuz/items/03af2e488e687778c028)をご覧ください。

※``/home/webapp/ディレクトリ名``は、GitHub上にあるPHPアプリケーションを``git clone``でインストールした際に作成され、何も指定しない場合は``git clone``の対象となるリポジトリ名がそのままディレクトリ名になります。

``/home/webapp/ディレクトリ名``配下で作成や更新を行う場合は、webappユーザーで実施します。

下記のコマンドを実行して、PHP関連パッケージをインストールします。

```
$ sudo su - webapp //webappユーザーに切り替える

$ cd ディレクトリ名 //指定したディレクトリに移動する

$ composer install --no-dev --prefer-dist 

//実行結果
# 略
Package manifest generated successfully.
```

``~コマンドの補足~``
**--no-devオプション** : 開発時のみ必要であり本番環境では必要のないものをインストールしないようにするオプションです。
インストール対象外となるものは、``/composer.jsonのrequire-dev``に記載されているものです。

**--prefer-distオプション** : バージョン管理を含めないでプロジェクト作成するオプションです。


## 補足
### ・PHP-FPMとは
``特徴``
>FPM (FastCGI Process Manager) は PHP の FastCGI 実装のひとつで、 主に高負荷のサイトで有用な追加機能を用意しています。
``引用:``[FastCGI Process Manager (FPM)](https://www.php.net/manual/ja/install.fpm.php)

Extras Library経由でPHPをインストールした場合、同時にインストールされています。

``役割``
PHP-FPMはnginxと密接に関係しており、簡単に説明すると、リクエストをnginxが受け取りPHPの処理を行う場合にPHP-FPMが処理を担当しています。

nginxとPHP-FPMの仕組みについては下記リンク先の記事が非常にわかりやすかったのでご覧ください。
[[nginx と PHP-FPM の仕組みをちゃんと理解しながら PHP の実行環境を構築する]](https://qiita.com/kotarella1110/items/634f6fafeb33ae0f51dc)

### ・chownコマンド
**chownコマンド**は、ファイルやディレクトリの所有者と所属グループを変更することが可能です。これらの変更を行えるのは、そのファイルの所有者または管理者(スーパーユーザー)のみです。
``書式``

```
$ chown [オプション] [ユーザー]:[グループ] ファイル名orディレクトリ名
```

``例``

```
$ sudo chown root:root file01

//「file01」ファイルの所有者を「root」に、所属グループを「root」に変更します
```
以上で、AWS EC2でのnginxを利用したPHP環境の作成は終了です。
## まとめ
今回の手順を踏むことで、nginxに対応したPHP本番環境のセットアップを行うことができます。
しかし、.envの設定やnginxとphp-fpmの設定をEC2上に存在するアプリケーション向けの設定に変更していないので、別途編集を行う必要があります。
その設定に関する内容はリンク先の記事でまとめているので是非ご覧ください。

・[.envの設定]()
・[nginxの設定]()
・[php-fpmの設定]()

## 参考文献
[FastCGI Process Manager (FPM)](https://www.php.net/manual/ja/install.fpm.php)
[Amazon Linux 2 を実行している EC2 インスタンスに Extras Library からソフトウェアパッケージをインストールする方法を教えてください。
](https://aws.amazon.com/jp/premiumsupport/knowledge-center/ec2-install-extras-library-software/)
[PHP 開発環境のセットアップ](https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/php-development-environment.html#php-development-environment-libraries)