Nginxのdefault.confとは?書き方について説明

2025年1月21日Docker,Other

kamiです。
TwitterYoutubeもやってます。

今回はNginxのdefault.confとは?書き方について説明の紹介です。

Nginxとは

Nginxとは次になります。

  • Webサーバー
  • リバースプロキシ
  • APIゲートウェイ
  • ロードバランサ

Webサーバー

静的ファイルやPHPアプリケーションのホストとして使用します。

リバースプロキシ

バックエンドの複数サーバーにリクエストを転送し、負荷分散を行います。
クライアントからのリクエストを受け取り、バックエンドサーバーに転送する役割を持ちます。

APIゲートウェイ

APIリクエストを統合的に管理・処理します。

ロードバランサ

複数のアプリケーションサーバー間でリクエストを分散します。
複数のサーバーにリクエストを分散させることで、システムの負荷を軽減します。

default.confとは?

Nginxのdefault.confは、ウェブサーバー(Nginx)で使用される設定ファイルの一つで、サーバーのデフォルトの設定を定義するために使用されます。
このファイルは通ウェブサーバーの初期設定や仮想ホストのデフォルト設定を指定するために利用されます。

default.confの役割

Nginxの初期設定として動作します。
特にカスタマイズしていない場合、default.conf がデフォルトサーバーの設定として機能します。
複数の仮想ホストを使用する場合、明示的に設定されていないリクエストを処理するサーバー設定です。

スポンサードサーチ

default.confの書き方

server {
    listen;                       # サーバーがリクエストを待ち受けるポートを指定
    index;                        # デフォルトのインデックスファイル(例: index.php, index.html)
    server_name;                  # サーバーのドメイン名やホスト名を指定
    root;                         # ドキュメントルート(公開ディレクトリのパス)
    client_max_body_size;         # クライアントから送信されるリクエストの最大サイズ

    location / {
        try_files;                # リクエストされたファイルを探し、見つからない場合はフォールバック
    }

    location ~ \.php$ {           # .phpファイルにマッチするリクエストを処理
        fastcgi_split_path_info;  # PHPファイルのパスと追加パス情報を分割
        fastcgi_pass;             # PHP-FPMサーバーのアドレスを指定(例: 127.0.0.1:9000)
        fastcgi_index;            # デフォルトで実行するPHPファイル(index.php)
        include;                  # FastCGIの標準パラメータを読み込む
        fastcgi_read_timeout;     # PHP-FPMからの応答を待つ最大時間(秒)
        fastcgi_param;            # PHPに渡す環境変数: SCRIPT_FILENAME(実行するスクリプトのパス)
        fastcgi_param;            # PHPに渡す環境変数: PATH_INFO(追加のパス情報)
        fastcgi_param;            # PHPに渡す環境変数: SERVER_NAME(ホスト名)
    }
}

server

仮想サーバーブロックを定義します。

Nginxは複数の仮想サーバーをホストでき、それぞれ個別の設定(ドメイン、ルート、ポートなど)を指定できます。

listen

ポート番号でHTTP接続をリッスンします。

HTTPのデフォルトポートです。Nginxはこのポートで接続を受け付けます

listen 80;
icon

docker-composeymlを使う場合はポート番号を合わせておきましょう

ports:
  - "80:80" # ホスト側:コンテナ側
  • 80(ホスト側のポート):
    • ホストマシン((あなたのローカルPCやサーバー)の81番ポートを開放します。
    • クライアントは、http://<ホストのIPまたはドメイン>:80にアクセスする必要があります。
  • 80(コンテナ側のポート):
    • コンテナ内で動作するNginxがlisten 80;でリクエストを受け付けます。(default.confに記載)

リクエストの流れ

  • クライアント → ホストのポート80 → コンテナのポート80 → Nginxがlisten 80;で処理。

index

デフォルトのインデックスファイルを指定します。

ディレクトリにアクセスした際に index.php → index.html の順でファイルを探して表示します。

index index.php index.html;

server_name

サーバーがホストするドメイン名(ホスト名)を指定します。

リクエストのホストヘッダーが一致する場合、このブロックが処理されます。

server_name localhost;

root

サーバーのドキュメントルート(公開ディレクトリのパス)を指定します。

root /var/www/html;

リクエストがhttp://example.com/index.htmlの場合、
→ サーバーは 「/var/www/html/index.html 」を探して返します。

もし複数のプロジェクトやサービスをホストする場合にディレクトリを分けて管理します。

root /var/www/hoge/html

リクエスト: http://example.com/index.html
→ 「/var/www/hoge/html/index.html 」を探して返します。

client_max_body_size

クライアントが送信するリクエストボディの最大サイズを制限します。

client_max_body_size 500m;

上記例だと500MBまで送信できます。

location /

ルートパス / へのリクエストを処理する設定です。

try_files

try_files は、Nginxのlocationブロック内で使用され、指定された複数のファイルやパスを順番に確認して、存在する場合にそれを返すディレクティブです。

存在しない場合は、指定されたフォールバック(デフォルト処理)を実行します。

try_files path1 path2 ... default;

path1, path2

確認するファイルやディレクトリのパスを順番に指定します。

default

すべてのパスが存在しない場合に実行されるフォールバック処理。
エラーページを返す (=404) や別のリソースに転送することができます。

こちらが基本構文です。

 try_files $uri $uri/ =404;
  1. $uri → リクエストされたファイルが存在するか確認。
  2. $uri/ → リクエストされたディレクトリが存在するか確認。
  3. =404 → すべて存在しなければ 404エラー を返す。

フォールバックでPHPに処理を渡す方法です。

LaravelやWordPressなどのフレームワークでよく使われます。

try_files $uri $uri/ /index.php?$query_string;
  1. $uri → リクエストされたファイルが存在するか確認。
    • http://example.com/about → /var/www/html/about
  2. $uri/ → ディレクトリが存在するか確認。
    • http://example.com/about/ → /var/www/html/about/
  3. /index.php?$query_string → すべて存在しない場合、index.php にリクエストを渡し、クエリパラメータも引き継ぐ。
    • http://example.com/about?key=value
      → /index.php?key=value

例で説明すると

http://example.com/about

「 /about」 が存在しなければ 「/index.php 」が実行される。
Laravelのようなフロントコントローラにすべてのリクエストを渡します。

location ~ .php$

.php で終わるリクエストを処理する設定です(PHPファイルの実行)。

fastcgi_split_path_info

リクエストのパスを2つに分割します。

  • ^(.+.php) → PHPファイル名部分
  • (/.+)$ → PATH_INFO(追加のパス部分)
fastcgi_split_path_info ^(.+\.php)(/.+)$;

fastcgi_pass

PHPリクエストを PHP-FPMサーバー に転送します。

fastcgi_pass 127.0.0.1:9000;
  • app: Dockerコンテナ名(サービス名)です。
  • 9000: PHP-FPMが待機しているポート番号です。

意味

Nginxが ローカルホスト(127.0.0.1) 上のポート 9000 で待機している PHP-FPM サーバーに接続します。

対象

同じサーバー(ホスト)上で Nginx と PHP-FPM が動作している場合に使います。

ネットワーク

ローカルホスト経由なので、ローカル通信(Unixソケットに近い)となり、一般的に高速です。

fastcgi_pass app: 9000;

意味

Nginxが app というホスト名(Dockerコンテナ名や別サーバー名)に対してポート 9000 で待機している PHP-FPM に接続します。

対象

Dockerコンテナ や リモートサーバー 上でPHP-FPMが動作している場合に使います。

ネットワーク

DNS名 や コンテナ名 を通じて通信します。NginxとPHP-FPMが異なるネットワーク上でも動作します。

まとめ

項目127.0.0.1:9000app:9000
接続先ローカルホスト上のポート9000appというホスト名/コンテナ名
対象環境同一サーバー内Docker環境やリモートサーバー
ネットワーク通信ローカル通信(高速)ネットワーク通信(DNS解決あり)
ホスト名の解決不要必要(DNS名またはコンテナ名)
用途の例単体サーバー、開発環境マイクロサービス、Docker環境

fastcgi_index

デフォルトで実行するPHPファイルを指定します。

fastcgi_index index.php;

上記例だとindex.phpデフォルトで実行するファイルに指定しています。

include

FastCGIの標準設定パラメータを読み込みます。

include fastcgi_params

fastcgi_read_timeout

PHP-FPMからの応答を待つ最大時間を設定します。

長時間の処理(大きなファイルのアップロードなど)を考慮して設定します。

fastcgi_read_timeout 100

fastcgi_param

SCRIPT_FILENAME $document_root$fastcgi_script_name

実行するPHPスクリプトの絶対パスを指定します。

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  • $document_root: root ディレクティブで指定したパス。
    • 例: root /var/www/html; の場合 → /var/www/html。
  • $fastcgi_script_name: リクエストされたPHPファイル名。
    • 例: http://example.com/index.php → /index.php。

$document_root$fastcgi_script_nameの結果は「/var/www/html/index.php」です。

PATH_INFO $fastcgi_path_info

PHP-FPMに追加のパス情報を渡します。
PATH_INFOは、PHPで動的ルーティングを行う際に使われる情報です。

fastcgi_param PATH_INFO $fastcgi_path_info;

http://example.com/index.php/some/path fastcgi_split_path_info ^(.+.php)(/.+)$; で分割を行います。

  • $fastcgi_script_name → /index.php
  • $fastcgi_path_info → /some/path

PATH_INFO $fastcgi_path_infoの用途としては次になります。

  • フレームワークやPHPスクリプトがPATH_INFOを使ってルーティングする場合に有効。
  • LaravelやSymfony、その他のモダンフレームワークで使われることがあります。

SERVER_NAME $host

サーバー名(ホスト名)をPHP側に渡します。

fastcgi_param SERVER_NAME $host;

まとめ

この設定は Nginx が PHPアプリケーション を動作させるための基本的な構成です。

  1. 静的ファイル(HTML、CSS、画像など)は root ディレクトリから直接配信します。
  2. PHPファイルは PHP-FPM にリクエストを転送して処理します(app:9000)。
  3. try_files によって、リクエストがファイルやディレクトリに存在しない場合、index.php にフォールバックします。

Docker,OtherNginx

Posted by kami