（Amazon Linux 2023）AWS EC2にデプロイする③　Nginxをインストールする〜php-fpmとNginxを連携する

# はじめに
前回からの続きです。

https://qiita.com/shunport/items/16e1cc14ff4eb6d04a2f

# 前提
- インスタンス作成時にAmazon マシンイメージ (AMI)でAmazon Linux 2023を選択された方向けです
- Amazon Linux2を選択された方も手順は同じですが、Linuxコマンドが異なります
- AMIの調べ方は、EC2サーバーにSSH接続をし、下記のコマンドを入力すると確認できます

``` sh:ターミナル
cat /etc/os-release
```

### 環境
- PHP 8.2
- Laravel 11
- mariaDB 10.5.23
- Nginx 1.24.0
- GitHub

# おおまかな流れについて
おおまかな流れは下記のとおりです。

1. ~~AWSでEC2のインスタンスを起動する~~（①で説明済）
1. ~~起動したインスタンスにElastic IP（固定IP）を関連付ける~~（①で説明済）
1. ~~EC2サーバの初期設定を行う~~（②で説明済）
1. ~~PHPと拡張モジュールをインストールする~~（②で説明済）
1. ~~Composerをインストールする~~（②で説明済）
1. ~~mariaDBをインストールする~~（②で説明済）
1. Nginxをインストールする
1. php-fpmとNginxを連携する
1. GitHubとSSH接続する
1. GitHubからmainブランチのコードをクローンする
1. Laravelの初期設定を行う
1. RDSと連携する
1. 独自ドメインを設定する
1. 独自ドメインのSSL認証を行う
1. 2回目以降のデプロイについて

# Nginxをインストールする

下記のコマンドでインストール可能なパッケージを確認できます。

``` sh: ターミナル
sudo dnf list --available nginx
```

下記のコマンドを実行することで、最新バージョンがインストールされます。

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

:::note info
バージョンを指定してインストールしたい場合
バージョン1.20.2をインストールする
``` sh: ターミナル
sudo dnf install nginx-1.20.2
```
:::

インストールが完了したら、インストールされたNginxのバージョンを確認します。
``` sh: ターミナル
nginx -v
```

Nginxを起動します。
``` sh: ターミナル
sudo systemctl status nginx.service
```

起動されているか確認します。
``` sh: ターミナル
sudo systemctl status nginx.service
```

Nginxが自動で起動されるよう設定します。
``` sh: ターミナル
sudo systemctl enable nginx.service
```

自動起動設定がされているか確認します。
``` sh: ターミナル
sudo systemctl is-enabled nginx.service
```

最後に動作確認を行います。
まずは、curlコマンドで確認します。
``` sh: ターミナル
curl -s http://localhost | grep title
```

次に、ブラウザで確認します。
パブリック IPv4アドレスに記載されているアドレスをコピーして、ブラウザのアドレスバーで検索します。

![01_A22-16_01_GML.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828050/c003c446-755f-275e-7a2e-e24e86a703eb.png)

Nginx のトップページが表示されブラウザから正常に表示されていることが確認できれば、完了です。

# php-fpmとNginxを連携する
### php-fpmの設定を行う

まずは、php-fpmを起動します。
``` sh: ターミナル
sudo systemctl start php-fpm.service
```

起動確認を行います。
``` sh: ターミナル
sudo systemctl status php-fpm.service
```

php-fpmの自動起動を有効にします。
``` sh: ターミナル
sudo systemctl enable php-fpm.service
```

自動起動設定が有効になっているか確認します。
``` sh:ターミナル
sudo systemctl is-enabled php-fpm.service
```

続いて、php-fpmの設定ファイルであるwww.confファイルを修正します。

まずは、修正権限のあるルートユーザーにスイッチします。

``` sh:ターミナル
sudo su -
```

修正前に念の為バックアップを作成します。www.confファイルのあるディレクトリに移動します。
``` sh:ターミナル
cd /etc/php-fpm.d/
```

コピーを作成します。
``` sh: ターミナル
sudo cp www.conf www.conf_bk_yyyyMMdd
```

コピー作成後、vimを使って、編集します。
``` sh: ターミナル
vim www.conf
```

下記のとおり変更します。
``` vim: www.conf
# 24行目あたり

# 変更前
user = apache
# 変更後
user = nginx

# 26行目あたり

# 変更前
group = apache
# 変更後
group = nginx

# 48行目あたり

# 変更前
;listen.owner = nobody
# 変更後
listen.owner = nginx

# 49行目あたり

# 変更前
;listen.group = nobody
# 変更後
listen.group = nginx

# 50行目あたり

# 変更前
;listen.mode = 0660
# 変更後
listen.mode = 0660
```

::: note info
vimエディターの操作方法がわからない場合は、下記の記事が参考になります。
https://zenn.dev/masatotezuka/articles/vim_command_220225
:::

変更後、php-fpmを再起動します。
``` sh: ターミナル
sudo systemctl restart php-fpm.service
```

起動確認を行います。
``` sh:ターミナル
sudo systemctl status php-fpm.service
```

これで、php-fpmの設定は終了です。

### Nginxの設定を行う

まずは、Nginxが起動されているか確認します。
``` sh:ターミナル
sudo systemctl status nginx.service
```

Nginxの設定ファイルであるnginx.confを修正する前に念の為、バックアップ作成します。

nginx.confファイルがあるディレクトリに移動します。
``` sh:ターミナル
cd /etc/nginx/
```

コピーを作成します。
``` sh:ターミナル
sudo cp nginx.conf nginx.conf_bk_yyyyMMdd
```

コピー作成後、vimを使って、編集します。
``` sh:ターミナル
sudo vim nginx.conf
```

http配列の中のserver配列の中身を変更します。
your_project_nameの部分は、GitHubのディレクトリ構成に応じて変更が必要です。
私の構成では、/var/www/app/laravel/public;となります。

``` vim:nginx.conf
server {
    listen       80;
    listen       [::]:80;
    server_name  _;
    root         /var/www/your_project_name/public;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-Content-Type-Options "nosniff";

    index index.php;

    charset utf-8;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        fastcgi_pass   unix:/run/php-fpm/www.sock;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }

    # Load configuration files for the default server block.
    include /etc/nginx/default.d/*.conf;
}
```

保存後、構文チェックを行います。

``` sh: ターミナル
sudo nginx -t
```

結果が下記のとおりであれば問題ないです。
```
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok

nginx: configuration file /etc/nginx/nginx.conf test is successful
```

次に、Nginxを再起動します。
``` sh: ターミナル
sudo systemctl restart nginx
```

起動確認を行います。
``` sh: ターミナル
sudo systemctl status nginx.service
```

設定が有効か確認するため、nginx.conf変更時に指定したドキュメントルートを作成し、htmlファイルを作成し、表示できることを確認します。

``` sh: ターミナル
sudo mkdir -p /var/www/your_project_name/public
cd /var/www/your_project_name/public
sudo touch index.html
sudo vim index.html
```

ブラウザで表示確認を行います。
パブリック IPv4アドレスに記載されているアドレスをコピーして、ブラウザのアドレスバーで検索します。

![01_A22-16_01_GML.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828050/c003c446-755f-275e-7a2e-e24e86a703eb.png)

最後に、表示確認用に作成したファイルとディレクトリを削除します。
``` sh: ターミナル
sudo rm -rf /var/www/your_project_name/
```

これで、php-fpmとNginxの連携設定は完了です。

# おわりに
今回は、Nginxをインストールするところからphp-fpmとNginxを連携するところまで記事化しました。次回は、GitHubとSSH接続するところから記事化したいと思います。

間違っている点や補足情報等ありましたら、ご教授いただけますと幸いです！