[Nginx] キャッシュサーバとオリジンサーバを立ち上げて、キャッシュされるか検証

Nginxで今度はキャッシュ機能についてDockerでの環境構築をして色々試してみたわ。

キャッシュサーバとは

ブラウザからサーバにリクエストを投げると通常はそのサーバから、リクエストに応じたレスポンスが帰ってくるけど

アクセスが集中するとサーバがレスポンスを返しきれなくなったりする、

で、サーバからのレスポンスを保存して、同じアクセスが来たときにサーバへリクエストを飛ばさず、代わりにレスポンスを返してあげるのがキャッシュサーバである。(ドヤ

イメージ

オリジンサーバは実際のWebサービスが立ち上がっているサーバのことで

ブラウザからのリクエストを一次受けして、キャッシュがあった場合はオリジンサーバの代わりに返してあげるのがキャッシュサーバ

キャッシュがある場合

オリジンサーバは何もしなくてもオッケー

キャッシュサーバが返してくれるんで

キャッシュがない場合

キャッシュサーバに該当するキャッシュがない場合は仕方ない、

オリジンサーバにリクエストを流して、その結果を返す

ただし、キャッシュに保存するから次のアクセスではオリジンには行かせないぞ

検証

環境を最近ハマっているDockerで再現してみた。

リポジトリはこれな https://github.com/smithshiro/docker_nginx_cache_origin(宣伝ではないんや、ソース全部はるのダルいだけw

構成

フォルダ構成はtreeコマンドで一発

docker-compose.yaml

まずは全体な

キャッシュサーバ(cache_nginx)のポートのみを開放しているから、直接オリジンサーバ(origin_nginx)にアクセスはできないようになっているのがミソ

cache_nginxのdefault.conf

アクセスをキャッシュするのと、見つからないときはオリジンに問い合わせるのがミソ

origin_nginxのdefault.conf

まあ、普通w

 

起動は”docker-compose up -d

動作検証の前に、新しく出たディレクティブの解説をする

proxy_cache_pathディレクティブ

コンテキスト http
説明 キャッシュの保存先とそのキーゾーンを定義する
デフォルト値 inactive=10m loader_files= 100 loader_sleep=50 loader_threshold=200

proxy_cacheディレクティブ

コンテキスト  http, server, location
説明 キャッシュに利用するキーゾーンを指定する
デフォルト値 off

proxy_cache_keyディレクティブ

コンテキスト http, server, location
説明 キャッシュのキーに使用する文字列を指定する
デフォルト値 $scheme$proxy_host$request_uri

proxy_cache_validディレクティブ

コンテキスト http, server, location
説明 ステータスコードごとのキャッシュの有効期間を指定する
デフォルト値 なし

curlコマンドで試す

初回アクセスの場合

X-Cache-Status: MISS となっているので、オリジンサーバから取ってきている

けど、この結果をキャッシュ化して次のアクセスではこれを返すでしょう。

再度アクセス

X-Cache-Status: HIT となっているので、キャッシュを返しているのが成功しているようだ

ちなみに、キャッシュはcache_nginxの以下にできてた

/var/lib/nginx/cache/nginx

 

まとめ

  • キャッシュサーバを立てるとオリジンサーバに変わってレスポンスを返してくれるので、負荷が削減できる
  • Nginxではキャッシュ用のディレクティブが用意されていて、リクエストごとにキャッシュをするかどうかの制御ができる
  • キャッシュされたファイルはキャッシュサーバに保存され、削除されるまではこれをオリジンに代わって返す

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です