あきネット

フリーソフトウェアやオープンソースをはじめ、コンピューターやインターネットに関するTIPSや話題を扱います

北のまちから南のまちへと素敵な何かを届けます。
それは、六花かもしれないし、ナナカマドの実かもしれないし、雪の下キャベツかもしれません。

Nginx の location の設定は難解

ウェブサーバというと、Apache と Nginx と Lighttpd だと思うのですが、それぞれに何を優先しているかが異なります。
Apache は多機能であること、Nginx は高速であること、Lighttpd はリソース消費の少ないことでしょう。


Nginx は、同時アクセス者数が多いウェブサイトに向いたようにつくられています。
そのため、人気サイトで次々に導入されて話題になり、それに釣られて導入する人が増えたものと思われます。だから、「実際にあなたのサイトに向いているかどうか」というと、別です。


CPUコア数やメモリ量の少ないサーバマシンだと、Lighttpd が向いていることが多くなってきます。


そういうわけで、私の生活としては Nginx を使用しないといけないような事情はあまりないのですが、
技能的に、 Apache や Lighttpd だけではなく、シェアの大きな Nginx も運用してみないといけないよね、という思いもあって、Nginx も試しています。


設定のしやすさも、Lighttpd はプログラミング感覚で書けますし、Apache は特徴的だとはいえ不可解ではありません。
ところが Nginx は、性能最優先なので、見た目は単純でも、難解です。処理性能最優先なので、処理性能を落とすような設定のしかたは嫌われます。
Nginx は、癖のある、作者の思想をゴリ押しするソフトウェアです。


例えば、 .htaccess にわざと非対応にしているのが Nginx です。.htaccess を検索すると遅くなるからです。
なので、レンタルサーバみたいに不特定多数が利用するものでは .htaccess の需要が高いですが、 .htaccess に対応させるためには改造が必要です。 Nginx なのに .htaccess に対応しているレンタルサーバがあれば、性能をある程度犠牲にして改造を施してあるということです。


このように、実は、 Nginx は万人向きでは全くなく、ユースケースをとてもえらぶウェブサーバなのです。



さて、Nginx の設定で、特に難解なのは location の設定です。
location で、アクセス先にあわせて場合分けして設定を適用するわけですが、その書き方が、見た目は簡単なのに、難解です。


location に使用するmodifier(演算子)は、

  • (なし)
  • ~
  • ~*
  • ^~
  • =

の5種類です。こんな modifier を用いるのは Nginx 独特です。奇怪です。
Perl などは =~ というのがあって Lighttpd でも書きますが、Nginx にはありません( ~ 1文字がこれに相当します)。


このうち、なしと、 = は、文字列そのもののマッチです。


なしと、 ^~ は、前方一致です。


~ と ~*は、 regular expression によるパタンマッチです。
~ は大文字小文字を区別します (case sensitive)。 ~* は区別しません(case insensitive)。


^~ は、マッチすると、ほかのパタンマッチ(~のついている条件)を無視します
= は、完全一致で、一致すると、あとのマッチング解析をやめます。
つまり、 ^~ や = を巧く使うと、マッチング解析に無駄がなくなり高速になります。


しかしそれはつまり、
下手に ^~ や = を使うと、思い通りの結果にならなかったり、設定ファイルがエラーになったりします。


location は nest (入れ子構造)でも書け、ネストを巧く使えば場合分けに無駄が減り、やはり高速になります。
ところが、  ^~ や = といった、ほかの modifier より優先順位の高いものが混在すると、思い通りの結果にならなかったり、エラーになったりするわけです。
だから、 「Nginx の設定にはネストを使うな」、「ネストは使えない」と言う人までいます。


パタンマッチにしても、巧く使うと解析は速いです。下手に使うとボトルネックです。
例えば ^ (行頭) や $ (行末)記号を用いれば、当てはまるものがより絞り込めるので速くなるはずです。
反対に、 .* みたいに、何も絞り込んでいないのがいると、遅くなるはずです。


使う必要がなければ ~* も使わないほうが速いです。例えば、そもそも .JPG だとかいうようなファイル名などに大文字をつかうことをやめてしまえば、速くなるわけです。


設定を完成させるまでに試行錯誤の要る、面倒くさいウェブサーバが Nginx です 😂


そして、完成した設定は安易に編集していけない危険のあるのも Nginx です😅
管理者が複数いると大変ですね。


Nginx は、処理性能が先にありきなんです。
設定内容をざっと見て一瞬で解るようには、なかなか、いきませんね。