*Squid [#qb1cd10e]

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

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

** squid.conf [#t4ae7955]
 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 でのリフレッシュ時間の指定 [#ud0e29b8]
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_FACTOR|OBJ_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

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

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