nginx-expires-

  • 投稿者:
  • 投稿カテゴリー:nginx

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]でフィルタする
2015-01-05_231745

リソースを更新したら、もちろん200が返却される
2015-01-05_234707

IE11の場合

[F5]更新してクライアントからGETリクエスト
Chromeと違い、条件付きリクエスト(If-Modified-Since)を出していないため
サーバにアクセスし、200が返却される

[F12]で開発者ツールが起動する
2015-01-05_232618

リバースプロキシあり

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を返却する
2015-01-08_012135

expiresあり

location ~ .*\.jpg {
        expires 10d;
}

Chrome39の場合

さきほどと変わらない
新しくCache-Control・Expiresヘッダが追加されるが
If-Modified-SinceヘッダとLast-Moifiedの関係で304を返却するか、200を返却するかが決まる

2015-01-06_000833

IE11の場合

さきほどと変わらない
新しくCache-Control・Expiresヘッダが追加されるが、常に200を返却する

2015-01-06_001648

プロキシ利用時

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  ]

[F5]で更新時
2015-01-09_002601

[ctl]+[F5]で更新時
2015-01-09_004839

参考URL

HttpHeadersModuleJa
http://wiki.nginx.org/HttpHeadersModuleJa