Squid

概要

Squidでリバースプロキシサーバを構成し、ウェブサーバ(Apache)で提供するコンテンツ(動的な、CGIなども含めて)をキャッシュすることで、ウェブサーバの負荷を軽減する。

環境

  • Squidのバージョンは2.6。
  • ウェブサーバとSquidサーバは、物理的に同じサーバマシンとする。
  • ウェブサイトは、Apacheでは名前ベースのバーチャルホストで運用する。
  • ウェブサイトのドメイン名はwww.example.comとする。
  • ウェブサーバはポート80で、Squidサーバはポート8080でサービスを提供する。

squid.conf

 http_port 8080 vhost                                                                                       # (1)
 visible_hostname squid-server                                                                              # (2)
 cache_peer 127.0.0.1 parent 80 0 no-query originserver                                                     # (3)
 refresh_pattern . 30 100% 30 ignore-no-cache override-expire ignore-private override-lastmod ignore-reload # (4)
 
 acl all src 0.0.0.0/0.0.0.0                                                                                # (5)
 http_access allow all                                                                                      # (6)
  • (1) Squidの起動ポートを指定(Apacheでバーチャルホストを利用のためvhostを指定)
  • (2) Squidサーバ名を指定(任意)
  • (3) 親サーバ(Apache)のIPアドレスとポートを指定(0/no-query:ICPは不使用)
  • (4) ignore-*** override-*** は動的コンテンツもキャッシュするために設定
  • (5) クライアントIPアドレス(全て)に対してアクセス制御名としてallを設定
  • (6) allに対してアクセス許可
  • 各設定の詳細は、http://www.squid-cache.org/Doc/config/ を参照のこと。

refresh_pattern でのリフレッシュ時間の指定

http://squid.robata.org/faq_12.htmlのページの「12.20 Squidはいつキャッシュオブジェクトをリフレッシュするように決定しますか?」の項を見る。

用語説明
NOW現在時刻8/10
OBJ_DATEソースサーバからキャッシュにオブジェクトが登録された日8/5
OBJ_LASTMODソースサーバにおけるオブジェクトの最終変更日8/2
OBJ_AGE最後の検索からどれだけ経過したか(OBJ_AGE = NOW - OBJ_DATE)5日間(7200分)
LM_AGEオブジェクトが検索されたときに、すでにどれくらい古いか(LM_AGE = OBJ_DATE - OBJ_LASTMOD)3日間(4320分)
LM_FACTOROBJ_AGEとLM_AGEの比率(LM_FACTOR = OBJ_AGE / LM_AGE)1.66
CLIENT_MAX_AGEクライアント(ブラウザ)がHTTPヘッダーでリクエストした生存時間(Cache-Control: max-age=86400)
EXPIRESソースサーバがHTTPヘッダーでレスポンスする消滅時間
CONF_MINオブジェクトの明確な満期期間がない場合に、新しいオブジェクトを拾ってくるまでの時間7日間(10080分)
CONF_PERCENT明確な満期時間がないオブジェクトが計る時間で最後の修正日からの割合20%
CONF_MAX明確な消滅時間がないオブジェクトの最長リミット10日間(14400分)
STALEキャッシュがすでに古い
FRESHキャッシュはまだ新しい
 if (EXPIRES) {
     if (EXPIRES <= NOW)
         return STALE
     else
         return FRESH
 }
 if (CLIENT_MAX_AGE)
     if (OBJ_AGE > CLIENT_MAX_AGE)
         return STALE
 if (OBJ_AGE > CONF_MAX)
     return STALE
 if (OBJ_DATE > OBJ_LASTMOD) {      # 8/5 > 8/2
     if (LM_FACTOR < CONF_PERCENT)  # 1.66 < 20%
         return FRESH
     else
         return STALE
 }
 if (OBJ_AGE <= CONF_MIN)           # 5日間 <= 7日間
     return FRESH
 return STALE

まとめると

  • ウェブサーバがExpiresヘッダを出力していれば、現在時刻と比べ、キャッシュが古いか新しいか決める。
  • ブラウザがCache-Control: max-ageヘッダを出力していて、すでにキャッシュの年齢がmax-ageを超えていれば、キャッシュは古いことにする。
  • キャッシュの年齢がSquid設定値のMAXを超えていれば、キャッシュは古いことにする。
  • ウェブサーバ上のファイルがキャッシュされて以降、そのファイルが更新されていない場合、LM_FACTORとCONF_PERCENTで判別する。
  • 上について補足すると、キャッシュする時点で割と最近修正されていたファイルなら、キャッシュ後、さらに更新されている可能性が高いので、LM_FACTORは高くなる。随分昔に修正されており、ずっと放置されていたファイルなら、キャッシュ後、更新されている可能性は低いだろうから、LM_FACTORは低くなる。CONF_PERCENTはこれとの比較に使われるが、CONF_PERCENTを高く設定しておくとキャッシュは新しいとされ易くなり、低く設定しておくと古いとされやすくなる。
  • キャッシュの年齢がSquid設定値のMIN以下なら、キャッシュは新しいこととする。
  • それ以外の場合は、キャッシュは古いこととする。

トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS