🍫

【入門】 Nginx 設定:nginx.conf

2025/02/08に公開

はじめに 🚀

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

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

Nginxのディレクトリ構造 📂

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

# 設定ファイル
/etc/nginx/               # Nginxの設定ディレクトリ
├── nginx.conf            # メインの設定ファイル(最初に読み込まれる)
├── conf.d/               # 追加の設定ファイルを格納
│   ├── default.conf      # 基本的なWebサーバーの設定
├── mime.types            # MIMEタイプの定義
├── fastcgi_params        # FastCGI の設定
…

# ログ関連
/etc/logrotate.d/nginx    # ログローテーションの設定
/var/log/nginx/           # ログファイルのディレクトリ
├── access.log            # アクセスログ
├── error.log             # エラーログ

# Webコンテンツ
/var/www/html/            # デフォルトのWebコンテンツディレクトリ

# モジュールと共有データ
/usr/lib64/nginx/modules/ # Nginxのモジュール

# サービス管理
/usr/lib/systemd/system/nginx.service  # systemd用のサービス管理ファイル

📌 ポイント

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

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

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

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

主要コンテキストの関係

  1. main コンテキスト: Nginx 全体の設定
  2. events コンテキスト: イベント処理に関する設定
  3. http コンテキスト: Web サイト全体の設定
  4. server コンテキスト: Web サイトごとの設定
  5. location コンテキスト: Web サイト内の特定のページやディレクトリの設定

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

nginx.conf
# 1. mainコンテキスト: Nginx 全体の設定
main {
    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.conf の内容は、長文になるため以下のアコーディオン内に記載しています。各設定値の解説付きです✍️

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

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

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

# エラーログ
# Nginx のエラーログの出力先とログレベルを指定します。
# warn: 警告以上のエラーが出力されます。
error_log /var/log/nginx/error.log warn;

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

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

# http コンテキスト: Web サイト全体の設定
http {
    # MIME タイプ
    # MIME タイプの定義ファイルを読み込みます。
    # これにより、様々なファイル形式に対応できます。
    include mime.types;
    # デフォルトの MIME タイプ
    # MIME タイプが不明な場合に適用されます。
    default_type application/octet-stream;

    # ログフォーマット
    # アクセスログの形式を定義します。
    # $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 on;
    # TCP_NOPUSH フラグを有効にします。
    # 小さなデータをまとめて送信することで、ネットワーク効率を向上させます。

    # Keep-Alive 接続
    # Keep-Alive 接続のタイムアウト時間を指定します。
    # タイムアウト時間内に次のリクエストがない場合、接続を切断します。
    keepalive_timeout 65;

    # gzip 圧縮
    # gzip 圧縮を有効にします。
    # 通信量を削減し、Web サイトの表示速度を向上させます。
    # gzip on;

    # 追加設定ファイル
    # /etc/nginx/conf.d/ ディレクトリ以下の設定ファイルを読み込みます。
    # 様々な設定をファイル分割して管理する際に便利です。
    include /etc/nginx/conf.d/*.conf;

nginx.confからinclude ディレクティブで、読み込んでいる/etc/nginx/conf.d/default.confの初期設定の内容は以下の通りです。

default.conf
server {
    listen       80;         # リクエストを待ち受けるポート番号を指定します。
    server_name  localhost;  # サーバー名 (ドメイン名) を指定します。

    #charset koi8-r;       # 文字コードセット (コメントアウトされています)
    #access_log  /var/log/nginx/log/host.access.log  main; # アクセスログ (コメントアウトされています)

    location / {            # / (ルートパス) へのリクエストに対する設定
        root   /usr/share/nginx/html; # ドキュメントルート (Webサイトのファイルが置かれているディレクトリ) を指定します。
        index  index.html index.htm; # インデックスファイル (ディレクトリにアクセスした際に表示するファイル) を指定します。
    }

    #error_page  404              /404.html; # 404エラーページ (コメントアウトされています)

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html; # 500, 502, 503, 504 エラー発生時のリダイレクト先を指定します。
    location = /50x.html {       # /50x.html へのリクエストに対する設定
        root   /usr/share/nginx/html; # 50x.html ファイルのドキュメントルートを指定します。
    }

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {       # .php ファイルへのリクエストをApacheにプロキシする設定 (コメントアウトされています)
    #    proxy_pass   http://127.0.0.1;
    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    #location ~ \.php$ {       # .php ファイルへのリクエストをFastCGIサーバーに渡す設定 (コメントアウトされています)
    #    root           html;
    #    fastcgi_pass   127.0.0.1:9000;
    #    fastcgi_index  index.php;
    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
    #    include        fastcgi_params;
    #}

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {        # .htaccess ファイルへのアクセスを拒否する設定 (コメントアウトされています)
    #    deny  all;
    #}
}

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

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

具体例

nginx.conf
http {
  access_log /var/log/nginx/access.log;

  server {
    access_log /var/log/nginx/example.com_access.log;

    location / {
      # access_log が指定されていないため、server の設定が適用される
    }
  }
}

設定の階層構造を理解し、意図しない上書きに注意が必要しましょう💡

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

大規模な 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;
        }
    }
}

📌 ポイント

  • include で設定をファイルごとに整理できます。引数は絶対パスか、 /etc/nginx/ からの相対パスで指定します。

Nginxの基本操作コマンド 💻

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

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

📌 ポイント

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

さいごに 🎯

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

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

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

参考 ✨

Discussion