Amazon Linux2023にnginxをインストールする

# 概要
AmazonLinux2からAmazonLinux2023に乗り換えるべく、同じ環境を作ります。

https://qiita.com/tamorieeeen/items/07743216a3662cfca890

# 環境

- AWS EC2
  - OS：Amazon Linux 2023
  - AMI：al2023-ami-2023.5.20240730.0-kernel-6.1-x86_64

# 構築手順
## 1. パッケージの確認
AmazonLinux2023の場合はamazon-linux-extrasを使わずともデフォルトでnginxがあるらしいので確認します。

```console
$ dnf search nginx
Last metadata expiration check: 3 days, 0:23:38 ago on Mon Aug  5 16:21:27 2024.
============================================ Name Exactly Matched: nginx ============================================
nginx.x86_64 : A high performance web server and reverse proxy server
=========================================== Name & Summary Matched: nginx ===========================================
collectd-nginx.x86_64 : Nginx plugin for collectd
nginx-all-modules.noarch : A meta package that installs all available Nginx modules
nginx-core.x86_64 : nginx minimal core
nginx-filesystem.noarch : The basic directory layout for the Nginx server
nginx-mimetypes.noarch : MIME type mappings for nginx
nginx-mod-devel.x86_64 : Nginx module development files
nginx-mod-http-image-filter.x86_64 : Nginx HTTP image filter module
nginx-mod-http-perl.x86_64 : Nginx HTTP perl module
nginx-mod-http-xslt-filter.x86_64 : Nginx XSLT module
nginx-mod-mail.x86_64 : Nginx mail modules
nginx-mod-stream.x86_64 : Nginx stream modules
python3-certbot-nginx.noarch : The nginx plugin for certbot
```

## 2. nginxのインストール
```console
$ sudo dnf -y install nginx

Dependencies resolved.
=====================================================================================================================
 Package                        Architecture      Version                               Repository              Size
=====================================================================================================================
Installing:
 nginx                          x86_64            1:1.24.0-1.amzn2023.0.2               amazonlinux             32 k
Installing dependencies:
 generic-logos-httpd            noarch            18.0.0-12.amzn2023.0.3                amazonlinux             19 k
 gperftools-libs                x86_64            2.9.1-1.amzn2023.0.3                  amazonlinux            308 k
 libunwind                      x86_64            1.4.0-5.amzn2023.0.2                  amazonlinux             66 k
 nginx-core                     x86_64            1:1.24.0-1.amzn2023.0.2               amazonlinux            586 k
 nginx-filesystem               noarch            1:1.24.0-1.amzn2023.0.2               amazonlinux            9.1 k
 nginx-mimetypes                noarch            2.1.49-3.amzn2023.0.3                 amazonlinux             21 k

Transaction Summary
=====================================================================================================================
Install  7 Packages

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

## 3. nginxを起動する

```console
$ sudo systemctl start nginx
$ systemctl status nginx
● nginx.service - The nginx HTTP and reverse proxy server
     Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; preset: disabled)
     Active: active (running) since Thu 2024-08-08 17:01:11 JST; 8s ago
```

EC2のパブリックIPでnginxのデフォルト画面が表示されればOKです。(セキュリティグループで80を開けていれば)

## 4. 自動起動設定を入れる

サーバーを再起動した時に自動で起動するように自動起動の設定を入れます。

```console
$ sudo systemctl enable nginx
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /usr/lib/systemd/system/nginx.service.

$ systemctl is-enabled nginx
enabled
```

## 5. ログローテーションの設定を変更する

nginxのログは `/var/log/nginx/` に出力されるので、権限等を変更します。

```console
$ ls -l /var/log/ | grep nginx
drwx--x--x. 2 root   root                41 Aug  8 17:01 nginx
$ sudo chown -R nginx:root /var/log/nginx/
$ sudo chmod 755 /var/log/nginx/
$ ls -l /var/log/ | grep nginx
drwxr-xr-x. 2 nginx  root                41 Aug  8 17:01 nginx
```

ローテーションの設定を確認して必要に応じて追記します。

```console
$ ls -l /etc/logrotate.d/ | grep nginx
-rw-r--r--. 1 root root 261 Oct 13  2023 nginx
$ sudo vi /etc/logrotate.d/nginx

/var/log/nginx/*.log /var/log/nginx/*/*.log { --(1)
    create 0664 nginx root --(2)
    daily
    dateext --(3)
    rotate 10
    missingok
    notifempty
    compress
    sharedscripts
    postrotate
        /bin/kill -USR1 `cat /run/nginx.pid 2>/dev/null` 2>/dev/null || true
    endscript
}
```

今回追加したのは3か所です。

- (1) `/var/log/nginx/*/*.log`
`/var/log/nginx/` 配下にディレクトリを切ったので、そのログにもローテートの設定を入れるために追加しました。
- (2) `0664`
デフォルトは`0640`です。
`g+w`にしたのはグループが`root`なのでローテートするのに権限が必要なんじゃないかと思ったので。(違ったらすいません。)
`o+r`にしたのはログファイルを見るためにわざわざ`sudo`するのがめんどくさかったので。
- (3) `dateext`
ローテート後のログファイルのファイル名に日時を入れたかったので追加しました。これを追加すると`access.log-yyyyMMdd.gz`のようになります。
- (4) `delaycompress` を削除
1つ前のログの圧縮を1回分遅らせる設定ですが、AL2には入っていない設定かつ今まで必要に感じたことがなかったので削除しました。

### ログがローテートされない

設定した翌日に確認したらログがローテートされておらず、前日のログにどんどん追記されていて焦りましたが調べたら正常な挙動でした。

これは初回(設定した当日の深夜)は `/var/lib/logrotate/logrotate.status` に記録がなく前回の `logrotate` 時刻を認識できないので、まずは `logrotate.status` ファイルに `logrotate` した時刻(設定した当日の深夜)が記録されるからです。

```console
$ ls -l /var/lib/logrotate/logrotate.status
-rw-r-----. 1 root root 482 Aug 13 00:00 /var/lib/logrotate/logrotate.status
$ sudo grep nginx /var/lib/logrotate/logrotate.status
"/var/log/nginx/error.log" 2024-8-10-0:0:13
"/var/log/nginx/*/*.log" 2024-8-9-0:0:0
"/var/log/nginx/access.log" 2024-8-10-0:0:13
```

なので、その次から実際にログのローテートが実施されます。なので設定した翌日の深夜からログがローテートされていれば正常です。

上記の例は8/9に初回の `logrotate` が走って記録され、`access.log` と `error.log` は中身があったので8/10に `logrotate` が実施された状態のstatusファイルです。`/*/*.log` が初回の8/9のままなのは、該当するファイルが存在しなかったからです。

もし初日からログをローテートしたければ `/var/lib/logrotate/logrotate.status` に過去日付を入れれば初回からログがローテートされると思います。

## 6. 設定ファイルを変更する

必要に応じて設定ファイルを変更します。

```console
$ sudo vi /etc/nginx/nginx.conf

// 設定ファイルをいじったら必ずsyntax testをする
$ 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を再起動せずに設定を反映する
$ sudo nginx -s reload
```

# 参考
- [ログローテートソフトウエア logrotate についてまとめ](https://qiita.com/shotets/items/e13e1d1739eaea7b1ff9)
- [新規ログファイルは初日にlogrotateされない？](https://www.khstasaba.com/?p=958)