[Nginx]キャッシュとロードバランスの組み合わせ構成

大規模コンテンツ配信のテクニックとして、以前

  • コンテンツのキャッシュ化
  • ロードバランスでのアクセス負荷分散

を検証した

今回は、これらの2つを組み合わせてより負荷に耐えうる構成について検証したい

構成イメージ

流れは

  1. ロードバランサがアクセスの一次受けをして、配下のキャッシュサーバ群にリバースプロキシする
  2. キャッシュサーバは自身にキャッシュが残されていればそれを返し、ない場合はオリジンサーバ郡にリバースプロキシする(自身もロードバランサとして機能しているのでオリジンサーバに対するアクセスを負荷分散している)
  3. オリジンサーバはキャッシュサーバよりアクセスされた場合に対応するリソースを返す

となってる

この構成でキャッシュサーバのキャッシュがない場合にはオリジンサーバにアクセスされるが、そのアクセスもロードバランスによって負荷分散されているためオリジンサーバ一台にかかる負荷は大分抑えられるでしょうよ、と

構築

例に違わずDockerで構築したんで、ソースの細かい構成とかはこっちを参照してほしい(https://github.com/smithshiro/nginx_load_balancer_v2

まあ、フォルダ構成はこんなだけどさ

docker-compose.yaml

load_balancer_nginxのdepends_onがcache*_nginxになってて

cache*_nginxのdepends_onがorigin*_nginxになってて

プロジェクトのソースコードはorigin*_nginxに入っているのがポイント

docker/load_balance_nginx/default.conf

upstreamディレクティブでロードバランスを可能にして、そのグループがキャッシュサーバ郡になってる

consistent_hashディレクティブによって、同じアクセスURIは同じキャッシュサーバに向くらしいが、ちょっとよくわかってない

proxy_set_headerはオマジナイみたいなもの

docker/cache_nginx/default.conf

proxy_cache_pathでキャッシュの保存場所を指定して、キャッシュがヒットすればそこに保存されてるキャッシュを返し、存在しなかったらupstreamで指定しているオリジンサーバ群にアクセスを分散して流すようにしている

proxy_cache_validでキャッシュを無効になるまでの期間を指定しているぞ

docker/origin_nginx/default.conf

まあ、いつものやな

ここでのexpiresで指定された期間がブラウザのキャッシュの有効期間になるようだ

・・なんか今回むずいな

とりあえず、立ち上げてアクセスしてみよう

検証

curlコマンドで確かめるぜ

キャッシュはMISS

ロードバランスー>キャッシュサーバー>オリジンサーバってアクセスしてるっぽい

オリジンからリソースを取りに行っているのがわかるね

もう一回実行

うーん、cache1_nginxに行ってほしんだけどcache2_nginxに行ってしまっているね

当然、キャッシュヒットもMISS

もう一回実行したら今度はcache3_nginxに行った

4度目の正直

Hit!!

cache1_nginxでとどまってくれてるね

今のところは同じURLを叩いたらキャッシュサーバの数だけはオリジンにアクセスする感じだけど、ちゃんとコンテンツキャッシュとアクセス分散はできてそうだな

疲れた、これぐらいにしよう

まとめ

  • Nginxでは大規模コンテンツ配信をコンテンツキャッシュやロードバランサを使って、オリジンサーバへの負荷を減らすことが可能である
  • ロードバランスではupstream、コンテンツキャッシュではproxy_passを必ず使う(その他も色々必要だが)

返信を残す

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