リバースプロキシとは

リバースプロキシの役割

例えば以下のようなシンプルなサーバシステムがあったとします。

f:id:setomoki:20161027142157p:plain

ここにリバースプロキシを導入した場合は以下のうような構成になります。

 

 

f:id:setomoki:20161103133215p:plain

このような構成をすることでWebサーバが直接クライアントからの要求を受け付けるのではなく、一旦リバースプロキシが受け取りそれをWebサーバに送るようにできます。

つまりはWebサーバの代理の役割をプロキシサーバが行います。

さらにはリバースプロキシではWebサーバに送る前に処理を行ったり、複数のWebサーバがあった場合送るWebサーバをクライアントのリクエスト内容により変えることができます。

 

リバースプロキシのメリット

ではリバースプロキシを用いることで以下のようなメリットがあります。

  • HTTPリクエスト内容に応じたサーバの選択
  • URLの書き換え
  • システム全体のメモリ効率の向上
  • Apacheモジュールを利用した処理の制御

これらのメリットついて詳しく見ていきます。

HTTPリクエスト内容に応じたサーバの選択

例えばクライアントから

http://xxxx/image.jpg

のような画像のリクエストと

http://xxxx/top.php

のような動的コンテンツのリクエストがきたとします。

ここでリバースプロキシを使用していると画像のリクエストは画像用のWebサーバに、動的コンテンツのリクエストは動的コンテンツ用のWebサーバに振り分けることができます。

f:id:setomoki:20161103140439p:plain

リクエスト内容だけでなくIPアドレスでの制御も可能です。

IPアドレスの制御ができることにより悪意のあるホストからのリクエストの遮断や特定のIPのみからしかアクセスできない管理者向けページができます。

URLの書き換え

例えば以下のようなURLがあったとします。

http://xxxx/yyyy.php?id=3&val1=tokyo&val2=japan&val3=sample

これを綺麗に見せるために

http://xxxx/yyyy.php/3/tokyo/japan/sample

としてクライアントにアクセスしてもらいリバースプロキシで

http://xxxx/yyyy.php?id=3&val1=tokyo&val2=japan&val3=sample

に戻すしWebサーバにアクセスするといったことが可能です。

f:id:setomoki:20161103142707p:plain

システム全体のメモリ効率の向上

動的コンテンツ(phpperlなど)は静的コンテンツ(css・html・javascript・画像など)など比較しより多くのメモリが必要になります。

また動的コンテンツに対応しているサーバ(APサーバ)では1リクエストに対して1プロセス/スレッドで応答する場合に静的コンテンツに対しても消費メモリが大きい1プロセス/スレッド使ってしまいます。

f:id:setomoki:20161103144843j:plain

そこで動的コンテンツと静的コンテンツでサーバを分けることによりメモリ効率の向上を行います。

Apacheモジュールを利用した処理の制御

リバースプロキシにApacheを用いた場合Apacheモジュールを組み込んでHTTPリクエストの前処理・後処理として任意のプログラムを使用することができます。

例えば以下のようなものがあります。

  • HTTPの応答を、クライアントに圧縮(gzip圧縮)してから返却する
  • APサーバからの応答をSSLで暗号化する
  • 特定のクライアントからの過剰なアクセスを一時遮断する

最後に

本記事ではリバースプロキシとはどうものなのかとメリットについて簡単に説明しました。リバースプロキシを導入することで様々なメリットがあるので基本的にはどんな環境でも導入したほうが良い中と思います。

デメリットとしてはリバースプロキシに関する知識が必要なことぐらいなんですかね。

デメリットは調べてみたんですがあまりでてきませんでした・・・

 

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

この記事はほぼサーバなどを触ったことがない人物が学んだことを整理するために書いていますので間違いなどが多々あると思います。間違いなどありましたら是非コメントなどで教えていただけると幸いです。