AWS EC2 サーバー構築(nginx, PHP, Composer編)

## 概要
EC2にてよく使うアプリケーションサーバーの構築手順を紹介します。(未来の私のためにw)
各種設定は、Laravelを動かすイメージです。
不定期ですが、更新します。

## 環境
- Amazon Linux 2023
- nginx 1.24.0
- PHP 8.2.18
- Composer 2.7.7
- Laravel 11系

## 手順

### 1. システム設定
[EC2 サーバー構築(基本設定)](https://qiita.com/A-Kira/items/0d371bbb293c87dddbda)に詳細手順を記載しています。

### 2. Nginx
#### インストール

インストール可能なパッケージの一覧を表示

```bash
$ sudo dnf list --available nginx
メタデータの期限切れの最終確認: 0:15:49 時間前の 2024年06月14日 10時45分23秒 に実施しました。
利用可能なパッケージ
nginx.x86_64               1:1.24.0-1.amzn2023.0.2               amazonlinux
```

インストール

```bash
$ sudo dnf -y install nginx
```

バージョン確認

```bash
$ nginx -v
nginx version: nginx/1.24.0
```

#### 起動設定
```bash
#起動
$ sudo systemctl start nginx.service

#自動起動
$ sudo systemctl enable nginx.service
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /usr/lib/systemd/system/nginx.service.

#自動起動確認
$ sudo systemctl is-enabled nginx.service
enabled

#状態確認
$ sudo systemctl status nginx.service
Active: active (running)

# 権限付与
$ sudo chmod 777 -R /var/log/nginx
```

#### conf設定

```bash
sudo vi /etc/nginx/conf.d/app.conf
```

```nginx:app.conf
server {
    listen 80;
    listen [::]:80;
    server_name example.com;
    root /srv/example.com/public;

    server_tokens off;
    etag off;
    add_header X-Content-Type-Options "nosniff";
    add_header X-XSS-Protection "1; mode=block";

    index index.php;

    charset utf-8;

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

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    error_page 404 /index.php;

    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php-fpm/www.sock;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
        fastcgi_hide_header X-Powered-By;
    }

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

`server_name`:
サーバ名は、server_name ディレクティブで定義することができ、指定されたリクエストにどのserverブロックが使われるかを決定する。
- ドメインを設定する場合: `develop.test.com`
- IPアドレスを設定する場合: `XX.XXX.XXX.XX`
- 複数指定する場合： `www.test.com test.com`

`server_tokens: off;`:
nginxのバージョンを表示しないようにする。

`add_header X-XSS-Protection "1; mode=block";`
クロスサイト・スクリプティングの潜在的な脆弱性対策として有効なブラウザの機能を有効にするレスポンスヘッダを返す。

#### チェックと再起動
```bash
$ sudo nginx -t
$ sudo systemctl restart nginx.service
```

#### 確認

```bash
$ curl 127.0.0.1
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>
```

### 3. PHP
#### インストール

```bash
$ sudo dnf install -y php-fpm php-mysqli php-json php php-devel
```

#### バージョン確認

```bash
$ php -v
PHP 8.2.18 (cli) (built: Apr  9 2024 18:46:23) (NTS gcc aarch64)
Copyright (c) The PHP Group
Zend Engine v4.2.18, Copyright (c) Zend Technologies
    with Zend OPcache v8.2.18, Copyright (c), by Zend Technologies

$ php-fpm -v
PHP 8.2.18 (fpm-fcgi) (built: Apr  9 2024 18:46:23)
Copyright (c) The PHP Group
Zend Engine v4.2.18, Copyright (c) Zend Technologies
    with Zend OPcache v8.2.18, Copyright (c), by Zend Technologies
```

#### php設定
##### php.ini
この辺はお好みでどうぞ(笑)

```bash
$ sudo vi /etc/php.ini
````

```php.ini:/etc/php.ini
expose_php = Off
memory_limit = 256M
date.timezone = Asia/Tokyo
mbstring.language = Japanese
```

##### userとgroupの値をnginxに変更
```bash
sudo vi /etc/php-fpm.d/www.conf
```

```:/etc/php-fpm.d/www.conf
user = apache
group = apache
↓
user = nginx
group = nginx
```

##### PHP拡張インストール
この辺もお好みでどうぞ~

```bash
$ sudo dnf -y install php-gd php-zip
```

###### PHP Intlを入れる場合
ICUを先に入れる必要があります。

```bash
$ sudo dnf -y install icu
```

```bash
$ sudo dnf -y install php-intl
```


##### php-fpmとnginxを再起動
```
$ sudo systemctl restart php-fpm.service
$ sudo systemctl restart nginx.service
```

### 4. composer インストール
composerも入れておきまーす。

```bash
$ cd /home/ec2-user
$ sudo curl -sS https://getcomposer.org/installer | php
$ sudo mv composer.phar /usr/local/bin/composer
$ composer -v
   ______
  / ____/___  ____ ___  ____  ____  ________  _____
 / /   / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
                    /_/
Composer version 2.7.7 2024-06-10 22:11:12
```

## 参考
- [チュートリアル: AL2023 に LAMP サーバーをインストールする](https://docs.aws.amazon.com/ja_jp/linux/al2023/ug/ec2-lamp-amazon-linux-2023.html)
- [Laravel 11.x Server Configuration nginx](https://laravel.com/docs/11.x/deployment#nginx)