nginxのlocation適用順

リクエストURIが複数のlocation設定にマッチしても適用されるものは1つだけです。適用の優先順位は

  1. 完全一致(=)
  2. 前方一致(^~あり、複数マッチした時は一番パスが長いもの)
  3. 正規表現(~または*~ 複数マッチする場合は一番上のもの)
  4. 前方一致(^~なし、複数マッチした時は一番パスが長いもの)

=や^~でマッチした場合はその時点でマッチング処理を終了するそうです。

わずかでも軽くしたいなら正規表現を避けるといいのかもしれません。たとえば画像ファイルを全て /img 以下に設置しているのであれば

location ~* .(gif|jpg|png)$ {
    access_log off;
}

よりも前方一致マッチングを使って

location ^~ /img/ {
    access_log off;
}

とした方が、わずかながら速くなるかもしれないです。ただ、ディレクトリにも適用されてしまうのが欠点。

また、トップページへのアクセスが非常に多いならば、他のlocation設定とのマッチングを処理をキャンセルするために、

location = / {
}

と書いておくといいらしいです。これは公式のドキュメントにも載っています。

By using the "=" prefix we define the exact match between request URI and location. When matched search stops immediately. E.g., if the request "/" occurs frequently, using "location = /" will speed up processing of this request a bit as search will stop after first comparison.

ベンチ取ったわけではないので、どこまで効果があるのか分かりませんが、負荷をかなり気にするサイトでなければ不要でしょう。もっとも、アクセス負荷に気を使わなければならないので、apacheではなくnginxを使用しているのかもしれませんが…

ついき

locationの適用順は…

  1. 修飾子=、完全一致
  2. 修飾子なし、完全一致
  3. 修飾子^~、前方一致
  4. 修飾子~ or ~* 正規表現マッチ
  5. 修飾子なし、前方一致

URIのパラメータ(?以降)はlocation適用順に影響しない。

~ は大文字小文字を区別する、~* は区別しない。