expiresディレクティブ
“Expires”と“Cache-Control”ヘッダをコントロールする
ExpiresとCache-Controlとは
Expires:エンティティヘッダ。キャッシュサーバがこのヘッダを含むレスポンスを受け取ると、指定された日時までコピーを保存してリクエストにはキャッシュで応えるようになる
Cache-Control:一般ヘッダ。max-ageは
通常、これらのヘッダが同時に設定された場合は
HTTP/1.1キャッシュサーバの場合は、Cache-Controlのmax-ageが優先される
HTTP/1.0キャッシュサーバの場合は、Expiresが優先される
またこの2つのヘッダに続いて、Etag(If-None-Match) > LastModified(If-Modified-Since) の順番でキャッシュがコントロールされる
またEtagとLastModifiedを受け取った場合は、条件付きリクエストをクライアントから送信する
動作確認
root@hostname:/usr/share/nginx/www# wget -d http://www5d.biglobe.ne.jp/~marywool/contents/2015_nenga/nenga_sheep_006.jpg root@hostname:/usr/share/nginx/www# mv nenga_sheep_006.jpg sheep.jpg
expiresなし
Chrome39の場合
[F5]更新してクライアントからGETリクエスト
その際にCache-Control:max-age=0であるため、サーバにデータを取得しにいく
リクエストにIf-Modified-Sinceヘッダも含まれているため
サーバはLast-Moifiedを確認し、304 Not Modifiedを返却する
Chromeでヘッダを確認する方法
chrome://net-internals/#events
にアクセスして、[type:URL_REQUEST]でフィルタする
IE11の場合
[F5]更新してクライアントからGETリクエスト
Chromeと違い、条件付きリクエスト(If-Modified-Since)を出していないため
サーバにアクセスし、200が返却される
リバースプロキシあり
nginxでリバースプロキシ+キャッシュサーバを構築
[root@ip-10-10-10-5 ec2-user]# cat /etc/nginx/nginx.conf ... http { proxy_buffering on; proxy_cache_path /var/cache/web/nginx_cache levels=1:2 keys_zone=cachezone:256m max_size=256m inactive=5d; proxy_temp_path /var/cache/web/nginx_tmp; proxy_buffers 200 8k; ... server { listen 80; server_name 54.64.246.142; root /usr/share/nginx/html; location / { proxy_cache cachezone; proxy_cache_valid 200 302 60m; proxy_pass http://49.212.204.46/; } ...
結果としてはexpiresの意味を感じることができなかった
49.212.204.46にてexpiresを設定していようが、していまいが
最初のアクセスとキャッシュが切れたタイミング除きすべて54.64.246.142が200か304を返却する
expiresあり
location ~ .*\.jpg { expires 10d; }
Chrome39の場合
さきほどと変わらない
新しくCache-Control・Expiresヘッダが追加されるが
If-Modified-SinceヘッダとLast-Moifiedの関係で304を返却するか、200を返却するかが決まる
IE11の場合
さきほどと変わらない
新しくCache-Control・Expiresヘッダが追加されるが、常に200を返却する
プロキシ利用時
squidでプロキシを構築した
Chromeでプロキシを利用してみたが、[F5]で更新した時は304、[ctl]+[F5]だと200であり、特に変化はなかった
[root@ip-10-10-10-5 ec2-user]# yum install squid [root@ip-10-10-10-5 ec2-user]# vi /etc/squid/squid.conf ... acl localnet src x.x.x.x/32 # プロキシを利用するクライアントのIPをlocalnetに追加した http_access allow localhost # localnetを許可する、denyよりも上に記載すること http_access deny manager ### cache ### cache_mem 16 MB cache_dir ufs /var/spool/squid 100 16 256 refresh_pattern -i \.jpg$ 1440 20% 10080 ... [root@ip-10-10-10-5 ec2-user]# /etc/init.d/squid start Starting squid: . [ OK ]
参考URL
HttpHeadersModuleJa
http://wiki.nginx.org/HttpHeadersModuleJa