nginx の try_files ディレクティブの挙動を見てみた

はじめに

nginx の設定ファイルを書いていてふと try_files ってどんな挙動するんだっけと気になった。この記事では調べた内容、挙動をまとめておく。

結論

シンタックス

ドキュメント を見ると以下のようなシンタックスになっている。

Syntax:	try_files file ... uri;
try_files file ... =code;
Default:	—
Context:	server, location

どういう挙動か

以下に設定ファイルの一例を置いておく。

server {
    ...
    location / {
        ...
+       try_files $uri $uri/ $uri/index.html $uri.html =404;
    }
}
  • try_files ディレクティブに設定してある値を左から順に評価し、サーバ上に静的コンテンツがあれば返す。
  • $uri/ のようにディレクトリも指定可能。
  • 末尾に最終的に見つからなかった場合のステータスコードを定義でき、=code 形式で指定する。
  • (上記には記載はないが)@proxy のように名前付きロケーションにプロキシさせることも可能。

検証

Docker コンテナを使う

検証として公式の nginx:1.23.1 コンテナイメージを使用する。イメージは、Docker Hub から pull できる。

ディレクトリの構成は以下のようにいくつかの静的コンテンツを用意しておく。ここで使用する HTML ファイルの中身はそれぞれの区別ができれば何でも良い)

tree .
.
├── contents
│   ├── hoge
│   │   └── index.html
│   └── index.html
└── nginx.conf

2 directories, 3 files

nginx の設定ファイルは以下。

nginx.conf
server {
    listen       80;
    root         /usr/share/nginx/html;

    include /etc/nginx/default.d/*.conf;

    location / {
        index     index.html index.htm index.php;
        try_files $uri $uri/ $uri/index.html $uri.html =404;
    }
}

nginx コンテナをデバッグモードで起動する。

起動時に -v(--volume) オプションを用いて設定ファイルとコンテンツをマウントする。また、-p(--publish) オプションを用いてコンテナ上の 80 番ポートとホスト上の 8080 番ポートをバインドする。

$ docker run -itd --rm --name nginx \
    -v ${PWD}/nginx.conf:/etc/nginx/conf.d/default.conf:ro \
    -v ${PWD}/contents/:/usr/share/nginx/html:ro  \
    -p 8080:80 \
    nginx:1.23.1 nginx-debug -g 'daemon off;'

cURL でアクセス

/ ルートにアクセスすると、./contents/index.html の内容が返る。

$ curl http://localhost:8080
<!DOCTYPE html>
<html>
  <head>
    <title>Welcome to nginx!</title>
  </head>
  <body>
    <h1>Welcome to nginx!</h1>
  </body>
</html>

/hoge にアクセスすると、./contents/hoge/index.html の内容が返る。

$ curl http://localhost:8080/hoge
<!DOCTYPE html>
<html>
  <head>
    <title>Welcome to hoge page!</title>
  </head>
  <body>
    <h1>Welcome to hoge page!</h1>
  </body>
</html>

/hoge/ にアクセスすると、./contents/hoge/index.html の内容が返る。

$ curl http://localhost:8080/hoge/
<!DOCTYPE html>
<html>
  <head>
    <title>Welcome to hoge page!</title>
  </head>
  <body>
    <h1>Welcome to hoge page!</h1>
  </body>
</html>

/hoge/index.html にアクセスすると、./contents/hoge/index.html の内容が返る。

$ curl http://localhost:8080/hoge/index.html
<!DOCTYPE html>
<html>
  <head>
    <title>Welcome to hoge page!</title>
  </head>
  <body>
    <h1>Welcome to hoge page!</h1>
  </body>
</html>

存在しないパス /aaaaaaaaaaaaaa にアクセスすると、ステータスコード 404 とデフォルト 404 ページの内容が返る。

$ curl http://localhost:8080/aaaaaaaaaaaaaa
<html>
  <head><title>404 Not Found</title></head>
  <body>
    <center><h1>404 Not Found</h1></center>
    <hr><center>nginx/1.23.1</center>
  </body>
</html>

まとめ

結論としては try_files は左から順に評価されるので、書く順番が重要。必要に応じて末尾にステータスコードを定義したり、名前付きロケーションを使って動的なパスへのプロキシ設定などをしてあげると良さそう。ちゃんと理解できたので使いこなしていきたい。

参考

Module ngx_http_core_module
Module ngx_http_core_module favicon nginx.org
Nginxのtry_filesディレクティブ設定例 - Qiita
Nginxの設定にて、静的なファイルと動的なURLを振り分けたいことがあります。try_filesを利用すれば、指定した順番で確認と転送を実施してくれます。 参考 Module ngx_http_core_module 以下の順番で確認するよう設定します 1. URLのパス...
Nginxのtry_filesディレクティブ設定例 - Qiita favicon qiita.com
Nginxのtry_filesディレクティブ設定例 - Qiita
nginx実践入門 WEB+DB PRESS plus
本電子書籍は2016年1月6日初版発行のものを、後日電子化し、発売したものです。 (概要) nginxを現場で活用するための知識を、実践的なノウハウを交えて解説した書籍です。 nginxのインストール方法や基本的な設定方法からはじめ、nginxを利用した「静的コンテンツ配信サーバ」「HTTPSサーバ」「Webアプリケーションサーバ」「大規模コンテンツ配信システム」の構築方法をそれぞれ詳しく紹介しています。後半ではnginxサーバのモニタリングやログの収集、そして軽量スクリプト言語Luaでnginxを拡張する方法について解説しているので、nginxをこれから使う方はもちろん、さらに活用したい方にもお勧めです。 (こんな方におすすめ) ・nginxを初めて使う/さらに使いこなしたいWeb開発者ア (目次) 第1章:nginxの概要とアーキテクチャ 1.1 nginxとは 1.2 nginxのアーキテクチャ 1.3 まとめ 第2章:インストールと起動 2.1 ソースコードからのインストール 2.2 パッケージからのインストール 2.3 nginxの起動、終了、基本的な操作 2.4 まとめ 第3章:基本設定 3.1 設定ファイルの構成 3.2 HTTPサーバに関する設定 3.3 nginx本体の設定 3.4 パフォーマンスに影響する設定 3.5 まとめ 第4章:静的なWebサイトの構築 4.1 静的コンテンツの公開 4.2 アクセス制限の設定 4.3 リクエストの書き換え 4.4 gzip圧縮転送 4.5 まとめ 第5章:安全かつ高速なHTTPSサーバの構築 5.1 なぜHTTPS通信が必要なのか 5.2 必要なモジュールと最低限の設定 5.3 安全なHTTPS通信を提供するために 5.4 TTFBの最小化によるHTTPS通信の最適化 5.5 複数ドメインを1台のサーバで運用するには 5.6 まとめ 第6章:Webアプリケーションサーバの構築 6.1 リバースプロキシの構築 6.2 Ruby on Railsアプリケーションサーバの構築 6.3 PHPアプリケーションサーバの構築 6.4 まとめ 第7章:大規模コンテンツ配信サーバの構築 7.1 大量のコンテンツを配信するには 7.2 大規模コンテンツ配信のスケールアウト 7.3 nginxによるコンテンツキャッシュ 7.4 オリジンサーバの構築 7.5 ロードバランサの構築 7.6 キャッシュとロードバランスを利用したコンテンツ配信 7.7 まとめ 第8章:Webサーバの運用とメトリクスモニタリング 8.1 nginxのステータスモニタリング 8.2 アクセスログの記録 8.3 Fluentdによるログ収集 8.4 Fluentd、Norikra、GrowthForecastによるメトリクスモニタリング 8.5 ログファイルのローテーション 8.6 無停止でのアップグレード 8.7 まとめ 第9章:Luaによるnginxの拡張──Embed Lua into nginx 9.1 ngx_lua 9.2 nginxをLuaで拡張 9.3 ngx_lua APIプログラミング 9.4 nginxの内部変数の参照 9.5 HTTPリクエストやレスポンスの操作/参照 9.6 正規表現 9.7 データの共有 9.8 サブリクエストをノンブロッキングで処理 9.9 実践的なサンプル 9.10 まとめ 第10章:OpenResty──nginxベースのWebアプリケーションフレームワーク 10.1 OpenRestyの導入 10.2 OpenRestyにバンドルされているLuaモジュール 10.3 memcached、Redis、MySQLへの接続のクローズとキープアライブ 10.4 まとめ 続きを読む
nginx実践入門 WEB+DB PRESS plus  favicon amazon.co.jp
nginx実践入門 WEB+DB PRESS plus
nginx実践ガイド impress top gearシリーズ
※この商品は固定レイアウトで作成されており、タブレットなど大きいディスプレイを備えた端末で読むことに適しています。また、文字列のハイライトや検索、辞書の参照、引用などの機能が使用できません。 購入前にお使いの端末で無料サンプルをお試しください。  nginxは、インターネットの多くのWebサイトで使われているソフトウェアで、設定ファイルの構造がシンプルで使いやすく、少ないリソースで動作し、性能も安定して出るため、順調に人気を獲得している注目度ナンバーワンのWebサーバーです。静的ファイルを配信するWebサーバーとしての性能も目を見張るものがありますが、よく使われるのはロードバランサやリバースプロキシとしての使い方です。本書は、nginxを利用したWebアプリケーションを構築・運用するといった作業において、性能やセキュリティ、メンテナンスに頭を悩ませる管理者のために、表面的なnginxの設定ファイルの書き方だけにとどまらず、実際に動作を検証する方法や、Webシステムの中でnginxとは直接関係ない部分も含めて紹介しています。これらの手法を知っておくことで、ネットワーク全般の知識、ネットワークプログラムの動作に関する知識を得られます。
nginx実践ガイド impress top gearシリーズ  favicon amazon.co.jp
nginx実践ガイド impress top gearシリーズ

関連記事