私は基本的に仮想サーバー構成で以下のパス内にある静的コンテンツをキャッシュしようとしています。何らかの理由でファイルがキャッシュされていません。キャッシュディレクトリ内にいくつかのフォルダとファイルが表示されますが、常に20MB程度で、高くも低くもありません。たとえば、画像をキャッシュする場合、少なくとも500MBのスペースが必要になります。
Nginx.confのキャッシュ部分は次のとおりです。
** nginx.conf **
proxy_cache_path /usr/share/nginx/www/cache levels=1:2 keys_zone=static$
proxy_temp_path /usr/share/nginx/www/tmp;
proxy_read_timeout 300s;
デフォルトの仮想サーバーです。
**sites-available/default**
server {
listen 80;
root /usr/share/nginx/www;
server_name myserver;
access_log /var/log/nginx/myserver.log main;
error_log /var/log/nginx/error.log;
proxy_set_header Host $Host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
location ~* ^/(thumbs|images|css|js|pubimg)/(.*)$ {
proxy_pass http://backend;
proxy_cache static;
proxy_cache_min_uses 1;
proxy_cache_valid 200 301 302 120m;
proxy_cache_valid 404 1m;
expires max;
}
location / {
proxy_pass http://backend;
}
}
バックエンドがSet-Cookie
ヘッダーを返さないことを確認してください。 Nginxがそれを検出すると、キャッシュを無効にします。
これがあなたのケースである場合、最良のオプションはバックエンドを修正することです。バックエンドを修正するオプションがない場合、Set-Cookie
ヘッダーを無視するようにNginxに指示することが可能です
proxy_ignore_headers "Set-Cookie";
proxy_hide_header "Set-Cookie";
ドキュメント を参照してください
proxy_ignore_header
は、キャッシュが確実に行われるようにします。 proxy_hide_header
は、Cookieペイロードがキャッシュされたペイロードに含まれないようにします。これは、NGINXキャッシュを介したCookieのリークを防ぐために重要です。
複数の構成オプションと組み合わせでNginxのプロキシキャッシングを無効にできることを追加したいと思います。残念ながらこれは不十分に文書化されています。
私の構成では、proxy_buffering on
と期待どおりにキャッシュを有効にしました。
複数の回答とコメントを確認した後、この構成がようやく機能することがわかりました。
10m = 10mbキーキャッシュ、max_sizeから2GB、inactive = 120m(120分の非アクティブ後にソースから更新)、use_temp_path = off(ioを削減するため)
proxy_cache_valid-60分間の200および302のキャッシュステータス
proxy_cache_path /tmp/cache levels=1:2 keys_zone=default_cache:10m max_size=2g
inactive=120m use_temp_path=off;
proxy_cache_key "$scheme$request_method$Host$request_uri";
proxy_cache_valid 200 302 60m;
server {
listen 80;
server_name example.com;
# https://www.nginx.com/blog/nginx-caching-guide
location / {
proxy_cache default_cache;
proxy_buffering on;
proxy_ignore_headers Expires;
proxy_ignore_headers X-Accel-Expires;
proxy_ignore_headers Cache-Control;
proxy_ignore_headers Set-Cookie;
proxy_hide_header X-Accel-Expires;
proxy_hide_header Expires;
proxy_hide_header Cache-Control;
proxy_hide_header Pragma;
add_header X-Proxy-Cache $upstream_cache_status;
proxy_pass http://ip-of-Host:80;
#set $memcached_key "$uri?$args";
#memcached_pass 127.0.0.1:11211;
# error_page 404 502 504 = @fallback;
}
}
価値があることについては、私の経験では、nginxは常に指示された場所にキャッシュするわけではありません。
たとえば、centos7では、構成オプション
proxy_cache_path /tmp/my_nginx_cache levels=1:2 keys_zone=my_zone:10m inactive=24h max_size=1g;
nginxは実際にファイルを次の場所にキャッシュします:
/tmp/systemd-private-phJlfG/tmp/my_nginx_cache