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