EC2でnginxを使おうと思っている過去の自分へ

# 0. はじめに
どうも、絶賛インフラ勉強中の筆者です。
苦戦した**EC2へのnginxの導入**を未来の自分がここに残すので、過去の自分はこれを見てスムーズに構築してください。
# 1. 筆者の環境
EC2
プラットフォーム：Linux/UNIX
AMI：Amazon Linux 2 Kernel 5.10 AMI 2.0.20250305.0 x86_64 HVM gp2
# 2. 導入方法
## 2-1. install
```
sudo yum update
sudo amazon-linux-extras install nginx1 -y
```
## 2-2. confファイルの設定
```
sudo nano /etc/nginx/nginx.conf
```
参考程度に筆者が使用しているconfファイル
```
# nginxの設定ファイル
user nginx;
worker_processes auto;
pid /run/nginx.pid;

# ログ設定
error_log ログを置いておきたい場所/error.log warn;

# 動的モジュールの読み込み
include /usr/share/nginx/modules/*.conf;

# イベント設定
events {
    worker_connections 1024;
}

# HTTPセクション
http {
    # ログフォーマット
    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                   '$status $body_bytes_sent "$http_referer" '
                   '"$http_user_agent" "$http_x_forwarded_for"';

    # 基本設定
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 4096;

    include /etc/nginx/mime.types;  # MIMEタイプの設定
    default_type application/octet-stream;
    

    # サーバーブロック
    server {
        listen 80;
        listen [::]:80;
        server_name [ここにあなたのpublicIP or ALBのURI];
        root /home/ec2-user/〇〇〇;  # ドキュメントルート

        # エラーページ設定
        error_page 404 /404.html;
        location = /404.html {
        }

        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
        }

        # SPAのためのルーティング設定
        location / {
            index index.html;
            try_files $uri $uri/ /index.html;
        }

        location /signin {
            proxy_pass $backendのURI;
        }
    }
}
```
### グローバル設定
```
user nginx;
worker_processes auto;
pid /run/nginx.pid;
```
**user**：nginxが動作するユーザーを指定
**worker_process**：同時に処理できるワーカープロセスの数を指定。autoはCPUコア数に基づいて自動的に設定される
**pid**：nginxプロセスのPIDを保存するファイルパスを指定する
### ログ設定
```
error_log ログを置いておきたい場所/error.log warn;
access_log ログを置いておきたい場所/access.log main;
```
**error_log**：エラーログの出力先とログレベルを指定する。warnがついているため、ここでは警告レベル以上のエラーが記録される
**access_log**：アクセスログの出力先とフォーマットを指定する。mainというログフォーマットが使用される。
例）
error_log /var/log/nginx/error.log warn;
### 動的モジュールの読み込み
```
include /usr/share/nginx/modules/*.conf;
```
nginxの動的モジュール設定ファイルを読み込む。追加機能や設定を別ファイルとして保存して読み込みたいときはここに記載したパスに.confファイルを置くといい。
### イベント設定
```
events {
    worker_connections 1024;
}
```
**woker_connections**：各ワーカープロセスが同時に処理できる接続数を指定。
### HTTPセクション
```
http {
    ...
}
```
この中でHTTP関連の設定を書き込む。
### ログフォーマット
```
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
               '$status $body_bytes_sent "$http_referer" '
               '"$http_user_agent" "$http_x_forwarded_for"';
```
アクセスログのフォーマットを定義している。
### 基本設定
```
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 4096;
```
**sendfile**：ファイルの送信を最適化
**tcp_nopush**：TCPパケットの送信を最適化する
**tcp_nodelay**：小さなデータパケットをすぐに送信
**keepalive_timeout**：クライアントとの接続を維持する時間を設定する
**types_hash_max_size**：MIMEタイプのハッシュサイズを設定
### MIMEタイプ
```
include /etc/nginx/mime.types;  # MIMEタイプの設定
default_type application/octet-stream;
```
MiMEタイプの設定ファイルを読み込む。
**MIMEタイプ**：インターネット上でデータの種類を示す方法。
例）
text/html: html文書
image/png
application/json
### サーバーブロック
```
server {
    ...
}
```
サーバーに関しての設定をこの中に記載する
### リッスンポート
```
listen 80;
listen [::]:80;
```
**IPv4**：listen 80;
**IPv6**：listen [::]:80;
### サーバー名とドキュメントルート
```
server_name [ここにあなたのpublicIP or ALBのURI];
root /home/ec2-user/〇〇〇;  # ドキュメントルート
```
**server_name**：このサーバーブロックが応答するドメインを指定。
PublicIP(ElasticIP推奨)アドレスか、アプリケーションロードバランサー(ALB)のURIを記載。
**root**：ウェブコンテンツのドキュメントルートを指定。
### エラーページ設定
```
error_page 404 /404.html;
location = /404.html { }

error_page 500 502 503 504 /50x.html;
location = /50x.html { }
```
特定のエラーコードに対するカスタムエラーページを指定。
### シングルアプリケーション（SPA）とプロキシの設定
```
location / {
    index index.html
    try_files $uri $uri/ /index.html;
}
location /signin {
    proxy_pass $backendのURL;
}
```
ルートパスへのリクエストを処理。リクエストされたURIが存在しない場合は、index.htmlを返す。
**location**：特定のパスに対するリクエストをバックエンドサーバーに転送する。proxy_passで指定されたURLにリクエストを転送する。
## 2-3. nginxの起動
confファイルのテスト
```
sudo nginx -t
```
起動
```
sudo systemctl start nginx
```
ステータスの確認
```
sudo systemctl status nginx
```
## 3. 躓いたエラー
nginxを起動したにもかかわらず、画面が表示されなかったため、エラーログを確認。
`~/index.html" failed (13: Permission denied),~`
なんだか、権限がないとのこと..
### 3-1. 権限の確認
```
ls -ld /home/ec2-user/権限がないと思われるファイルのパス
```
>[ec2-user@ip-〇〇〇 ~]$ ls -ld /home/ec2-user
drwx------ 8 ec2-user ec2-user 241 Mar 11 01:12 /home/ec2-user

そもそも所有者はec2-user（当たり前）
今回描画したいファイルが含まれているディレクトリに権限がないと思われる。また、親ディレクトリにも権限が付与されていないようなので、ディレクトリ全体の権限を変更。（皆様は適切な対応をお願いします。）
### 3-2. 所有者を変更して権限を付与
```
sudo chown -R nginx:nginx /home/ec2-user
sudo chmod -R 755 /home/ec2-user
```