Nginxのlocationディレクティブを頻繁にいじることがなく、いざ設定しようとするとゴタゴタしてしまうので基本的な書き方の一部をメモがてら書いておく。
静的コンテンツをキャッシュさせたい
特定のPATHのものをキャッシュさせたい場合、例えば/static/
に静的コンテンツがあり、それらをキャッシュさせたい場合は下記のようになる。
server { : location /static/ { root /path/to/public; autoindex on; expires 1d; add_header Cache-Control "private max-age=86400"; } : }
静的コンテンツをキャッシュさせたい(正規表現)
/static/
の中の画像やCSS、JSなどを正規表現で指定してキャッシュさせたい場合は下記のようになる。
~
で正規表現の始まりを表し、^
で行頭を、()
の中が正規表現を指す。最初の.*
で任意の文字の繰り返しを表し、\.(html?|jpe?g|gif|pdf|png|css|js|ico|swf|inc)
で各ファイルの拡張子を表す。最後の $
は行の終わりを意味する。
server { : location ~ ^/static/(.*\.(html?|jpe?g|gif|pdf|png|css|js|ico|swf|inc))$ { root /path/to/public; autoindex on; expires 30d; add_header Cache-Control "private max-age=86400"; } : }
etagを使う場合、etagの値の生成には一般的に最終更新日時のハッシュが用いられるため、複数台のサーバがある場合は各サーバの画像ファイルの更新日時も統一しておく必要がある。
ファイルの存在をチェックする(try_files)
try_files
自体はtry_files file_path ... uri;
のような構文で記載して、順番にファイルの存在をチェックして、最初に見つかったファイルでリクエストを処理する。
例えば下記のような記載で、example.com/images/hogehoge.png
というリクエストがあった場合に、$uri
は/images/hogehoge.png
となってファイルの存在チェックをし、それが存在しなければ/images/default.gif
にリクエストされる。
$uri/
のように最後に/
をつけると、ディレクトリと判定してくれる。
server { : server_name example.com; root /path/to/public; location /images/ { try_files $uri /images/default.gif; } : }
プロキシさせる(proxy_pass)
/hogehoge
へのリクエストを特定のサーバで処理させたい場合は下記のようにする。
server { root /var/www/example.com; location /hogehoge { proxy_pass http://hogehoge.com; } }
複数台のサーバに分散させたい場合は下記のようにupstream
ディレクティブを使って分散対象のサーバを定義する。
upstream hogehoge { server hogehoge01.com; server hogehoge02.com; } server { root /var/www/example.com; location / { proxy_pass http://hogehoge; } }
fastCGIへリクエストを投げる
例えばphp-fpm等のFastCGIのプロセスにリクエストを投げたい場合は下記のようにする。下記の例ではFastCGIプロセスは8080
で応答しているモノとする。
server { root /var/www/example.com; location / { fastcgi_pass hogehoge.com:8080; } }
複数台のサーバのFastCGIに分散させたい場合はproxy_pass
の時とほぼ同様でupstream
ディレクティブを使って分散対象のサーバを定義する。
upstream hogehoge { server hogehoge01.com:8080; server hogehoge02.com:8080; } server { root /var/www/example.com; location / { proxy_pass hogehoge; } }
まとめ
Nginxのlocationディレクティブの基本的な使い方の一部を書いた。