NGINXプロキシでキャッシュを有効にしています。
私の理解では、プロキシ構成(Cache-Control
)のproxy_ignore_headers
ヘッダーを無視しない限り、期限切れまでのキャッシュ時間は、Cache-Control
を使用してオリジンサーバーから設定できます。 = max-age=XXXX
。
しかし、それが保持し、Cache-Control: public
のようなものに使用するデフォルトのキャッシュ時間はどのくらいでしょうか?これらのリソースのデフォルトの最大キャッシュ時間を設定する方法はありますか?
おそらく、Nginx内のキャッシュ制御ヘッダーを設定または書き換えたほうがよいでしょう。これについてのチュートリアルがあります here 、そしてチュートリアルのパート1にはダウンロード可能な構成ファイルがあります。主なパーツは以下のとおりです
これらが機能するには headers_more が必要です。一部のディストリビューションにはこれが含まれ、一部には含まれておらず、ソースからビルドする必要があります。これは非常に簡単で、私のチュートリアルに含まれています。
チュートリアルからコピー
キャッシュ制御ヘッダーを設定するには、いくつかの異なる手法を使用します。最初に、もう役に立たない非常に古いプラグマのような既存のヘッダーをすべてクリアし、Expiresヘッダーをクリアします(後で設定するのでおそらく無意味です)。また、セキュリティのためにサーバー名をクリアします。
more_clear_headers "Pragma"; more_clear_headers Server; more_clear_headers "Expires";
その後、ヘッダーを手動で設定できます。画像にはかなり長い有効期限を使用しています
add_header Cache-Control "public, max-age=691200, s-maxage=691200";
ページの場合は短くします–多くのサイトではこれよりずっと短い時間が必要になります
add_header Cache-Control "public, max-age=86400, s-maxage=86400";
一部の場所では、便宜上、代替フォーマットを使用しています。
expires 8d;
Nginx構成の例
Nginxサーバーの例(SSLセットアップのように一部欠落している)
# Caching. Putting the cache into /dev/shm keeps it in RAM, limited to 10MB, for one day.
# You can move to disk if you like, or extend the caching time
fastcgi_cache_path/dev/shm/nginxcache levels = 1:2 keys_zone = CACHE:50m inactive = 1440m; #羊
# This needs to match your PHP configuration. Port is sometimes 9000 ****
upstream php {
server 127.0.0.1:9001;
}
server {
server_name www.example.com;
listen 443 ssl http2;
root /var/www/***folder;
location ~* \.(jpg|jpeg|png|gif|css|js|ico|svg)$ {
log_not_found off; access_log off;
# Set up caching - 8 days for static resources
# Remove the old unnecessary Pragma and hide the server version
more_clear_headers "Cache-Control";
add_header Cache-Control "public, max-age=691200, s-maxage=691200";
more_clear_headers Server; more_clear_headers "Pragma"; mo re_clear_headers "Expires";
}
# PHP requests
location ~ \.php$ {
fastcgi_keep_conn on;
fastcgi_intercept_errors on;
fastcgi_pass php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
# Use the cache defined above. Cache 200 (success) status's, for 24 hours, and cache
# specific other status's for an hour. This helps mitigate DDOS attacks.
# Only cache GET and HEAD requests
fastcgi_cache CACHE;
fastcgi_cache_valid 200 1440m;
fastcgi_cache_valid 403 404 405 410 414 301 302 307 60m;
add_header X-Cache $upstream_cache_status;
fastcgi_cache_methods GET HEAD;
fastcgi_cache_bypass $skip_cache;
fastcgi_no_cache $skip_cache;
# Set the cache control headers we prepared earlier. Remove the old unnecessary Pragma and hide
# the server version. Clearing existing headers seems necessary
more_clear_headers "Cache-Control";
add_header Cache-Control $cacheControl;
more_clear_headers "Pragma"; more_clear_headers Server; more_clear_headers "Expires";
}
}
これは正しいです。デフォルトでは、proxy_cache
が設定されているだけで、nginxはmax-age
ヘッダーにCache-Control
が設定されている応答のみをキャッシュします。
Cache-Control
ヘッダーがない場合、またはCache-Control: public
だけがない場合、nginxは応答をキャッシュしません(つまり、X-Cache-Status: MISS
も設定すると、add_header X-Cache-Status $upstream_cache_status;
を毎回取得します)。
Cache-Control
ヘッダーのないレスポンス、またはmax-age
ヘッダーのCache-Control
フィールドのないレスポンスのデフォルトのキャッシュ時間を設定できます。
# for 200, 301, 302 responses
proxy_cache_valid 10m;
# for all other responses
proxy_cache_valid any 1m;
つまり、Cache-Control
ヘッダーはproxy_cache_valid
設定よりも優先され、proxy_cache_valid
のデフォルトはありません。