🍫

入門 - Nginx 設定:nginx.conf

に公開

はじめに 🚀

Nginx の設定ファイルは、Web サーバーの動作を制御するためのテキストファイルです。Web サイトの表示方法、リクエストの処理方法、セキュリティ設定など、様々な設定を記述することができます。

しかし、設定ファイルの構造やディレクトリの管理方法を理解していないと、運用時に困ることも多いです。この記事では、Nginx のディレクトリ構造や設定ファイルの基本、設定を整理する方法について解説します💡

Nginxのディレクトリ構造 📂

Nginx を Red Hat系の Linux (Amazon Linux 2023)にインストールすると、以下のようなディレクトリ構造が自動生成されます。

用途 パス 説明
⚙️ 設定 /etc/nginx/ 設定ファイル一式
📝 ログ /var/log/nginx/ access.log, error.log
📁 コンテンツ /usr/share/nginx/html/ デフォルトのドキュメントルート
🔧 サービス /usr/lib/systemd/system/ systemctl で制御

詳細

# 設定ファイル
/etc/nginx/
├── nginx.conf            # メインの設定ファイル(最初に読み込まれる)
├── conf.d/               # 追加の設定ファイルを格納
├── default.d/            # デフォルトサーバーブロック用の追加設定
├── mime.types            # MIMEタイプの定義
├── fastcgi_params        # FastCGI の設定


# ログ関連
/etc/logrotate.d/nginx    # ログローテーションの設定
/var/log/nginx/
├── access.log            # アクセスログ
├── error.log             # エラーログ

# Webコンテンツ
/usr/share/nginx/html/    # デフォルトのWebコンテンツディレクトリ

# モジュール
/usr/share/nginx/modules/ # 動的モジュール

# サービス管理
/usr/lib/systemd/system/nginx.service

📌 ポイント

  • nginx.confは最初に読み込まれる設定ファイルです。他の Nginx の設定ファイルは、nginx.confから読み込まれる形で使われます。
  • ログファイルは /var/log/nginx/ に保存されます。
    • ログのフォーマットはnginx.confで指定できます。
    • /etc/logrotate.d/nginxの設定で、ログファイルをローテーションし、必要に応じて圧縮などを行います。
  • ドキュメントルート(デフォルト:/usr/share/nginx/html/)はプロジェクトごとに専用ディレクトリを設定することを強く推奨します⚠️
    • 例:/var/www/<プロジェクト名>/public

Nginx の設定ファイルの構造 🛠️

Nginx の設定ファイルは ディレクティブコンテキスト という 2 つの要素で構成されています。

要素 説明
ディレクティブ Nginx に対する命令
コンテキスト {} を使ってディレクティブをグループ化する単位

主要コンテキストの階層構造

# コンテキスト 説明
1 main Nginx 全体の設定 worker_processes, error_log
2 events イベント処理に関する設定 worker_connections
3 http Web サイト全体の設定 access_log, gzip
4 server Web サイトごとの設定 listen, server_name
5 location 特定のパスやディレクトリの設定 root, index

設定ファイルの例

以下は、主要コンテキストをまとめた簡単な Nginx 設定ファイルの例です。

nginx.conf
# 1. mainコンテキスト: Nginx 全体の設定
user nginx;             # Nginx プロセスの実行ユーザーを指定
worker_processes auto;  # worker プロセスの数を自動設定

# 2. eventsコンテキスト: イベント処理に関する設定
events {
    worker_connections 1024;  # worker プロセスあたりの最大接続数を指定
}

# 3. httpコンテキスト: Web サイト全体の設定
http {
    # 4. serverコンテキスト: Web サイトごとの設定
    server {
        listen 80;                # 待ち受けるポート番号を指定
        server_name example.com;  # サーバー名を指定

        # 5. locationコンテキスト: Web サイト内の特定のページやディレクトリの設定
        location / {
            root /usr/share/nginx/html;  # ドキュメントルートを指定
            index index.html;            # index ファイルを指定
        }
    }
}

リクエスト処理の流れ

では、実際にクライアントからリクエストが来たとき、Nginx はどのようにコンテキストを使って処理するのでしょうか?

  1. server ブロックの選択: リクエストの Host ヘッダーと server_name を照合
  2. location ブロックの選択: リクエストパスと location のパターンを照合
  3. コンテンツの配信: マッチした location の設定に従ってファイルを返す

初期設定で記載されている nginx.conf の内容は、長文になるため以下のアコーディオン内に記載しています。各設定値の解説付きです✍️

デフォルトのnginx.confの内容
nginx.conf
# main コンテキスト: Nginx 全体の設定

# 実行ユーザー
# Nginx がどのユーザー権限で動作するかを指定します。
# セキュリティの観点から、専用のユーザー (nginx など) を設定することが推奨されます。
user nginx;

# worker プロセス数
# Nginx が同時に処理できるリクエスト数を決定する worker プロセスの数です。
# auto を指定すると、CPU コア数に合わせて自動的に最適な数が設定されます。
worker_processes auto;

# エラーログ
# Nginx のエラーログの出力先とログレベルを指定します。
# notice: 通常の動作情報も出力されます。
error_log /var/log/nginx/error.log notice;

# PID ファイル
# Nginx のプロセス ID を記録するファイルです。
# Nginx の起動・停止・再起動などの制御に使用されます。
pid /run/nginx.pid;

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

# events コンテキスト: イベント処理に関する設定
events {
    # worker プロセスごとの最大接続数
    # 1 つの worker プロセスが同時に処理できる接続数です。
    worker_connections 1024;
}

# http コンテキスト: Web サイト全体の設定
http {
    # ログフォーマット
    # アクセスログの形式を定義します。
    # $remote_addr: アクセス元の IP アドレス
    # $remote_user: アクセス元のユーザー名 (認証時)
    # $time_local: アクセス日時
    # $request: リクエスト内容
    # $status: HTTP ステータスコード
    # $body_bytes_sent: 送信されたデータ量
    # $http_referer: リファラー
    # $http_user_agent: ユーザーエージェント
    # $http_x_forwarded_for: X-Forwarded-For ヘッダー
    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';

    # アクセスログ
    # アクセスログの出力先とログフォーマットを指定します。
    access_log /var/log/nginx/access.log main;

    # 高速化設定
    # sendfile() システムコールを使用してファイルを送信します。
    sendfile on;
    # tcp_nopush: 小さなデータをまとめて送信することで、ネットワーク効率を向上させます。
    tcp_nopush on;

    # Keep-Alive 接続
    # Keep-Alive 接続のタイムアウト時間を指定します。
    keepalive_timeout 65;

    # MIME タイプのハッシュテーブルサイズ
    types_hash_max_size 4096;

    # MIME タイプの定義ファイルを読み込みます。
    include /etc/nginx/mime.types;
    # デフォルトの MIME タイプ
    default_type application/octet-stream;

    # 追加設定ファイル
    # /etc/nginx/conf.d/ ディレクトリ以下の設定ファイルを読み込みます。
    include /etc/nginx/conf.d/*.conf;

    # server コンテキスト: デフォルトサーバーの設定
    # Amazon Linux 2023 では nginx.conf 内に直接記述されています
    server {
        listen       80;
        listen       [::]:80;        # IPv6 対応
        server_name  _;              # すべてのホスト名にマッチ
        root         /usr/share/nginx/html;  # ドキュメントルート

        # デフォルトサーバーブロック用の追加設定を読み込み
        include /etc/nginx/default.d/*.conf;

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

        # 500 系エラーページ
        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
        }
    }
}

ディレクティブの継承と上書き 🔄

上位コンテキストの設定は下位に継承されますが、同じディレクティブを指定すると 上書き されます。

nginx.conf
http {
    access_log /var/log/nginx/access.log;  # ① デフォルト設定

    server {
        access_log /var/log/nginx/example.log;  # ② 上書き

        location / {
            # 未指定 → ② が継承される
        }
        
        location /api {
            access_log /var/log/nginx/api.log;  # ③ さらに上書き
        }
    }
}

📌 ポイント

  • 設定の階層構造を理解し、意図しない上書きに注意
  • 継承させたい設定は上位コンテキストに記述
  • オーバーライドが必要な場合のみ下位で再定義

設定ファイルを分割して管理する 🗂️

大規模な Nginx の設定では、include ディレクティブを活用してファイルを分割すると管理が楽になります。

例えば、以下のように設定を分割すると管理しやすくなります。

/etc/nginx/
├── nginx.conf        # メイン設定
├── conf.d/           # 追加設定を格納
│   ├── http.conf     # http コンテキスト設定
│   ├── servers/      # 各サーバー設定
│   │   └── example.com.conf
│   ├── locations/    # 各ロケーション設定
│       └── static.conf

具体例

nginx.conf
http {
    include conf.d/http.conf;

    server {
        include conf.d/servers/example.com.conf;

        location /static {
            include conf.d/locations/static.conf;
        }
    }
}

📌 ポイント

  • パスは絶対パスか /etc/nginx/ からの相対パスで指定
  • *.conf でワイルドカード指定も可能
  • 用途別(サーバー、ロケーション、共通設定)に分類すると管理しやすい

Nginxの基本操作コマンド 💻

さいごに Nginxを運用する上でよく利用する基本コマンドを紹介します💡

サービス管理

操作 コマンド
🟢 起動 sudo systemctl start nginx
🔴 停止 sudo systemctl stop nginx
🔄 再起動 sudo systemctl restart nginx
📊 状態表示 sudo systemctl status nginx
♻️ 設定再読み込み sudo systemctl reload nginx

📌 ポイント

  • nginx の設定が間違っていると、nginxの起動に失敗する場合がありますが、そのような場合には「systemctl status nginx」で表示されるログが役立ちます。
  • 設定ファイルの変更後は、sudo systemctl reload nginx で再読み込みが必要です。

設定ファイル操作

操作 コマンド
✅ 構文チェック sudo nginx -t
📄 設定確認 sudo nginx -T
ℹ️ バージョン確認 nginx -v

さいごに 🎯

Nginx のディレクトリ構造や設定ファイルの基本を理解すると、運用管理がスムーズになります🚀

業務で Nginx 設定のリファクタリングを行うことになり、その過程で土台となった Nginx の基礎知識をまとめました。

どなたかの参考になれば幸いです。
以上、えみり〜でした|ωΦ)ฅ

参考 ✨

Discussion