web-dev-qa-db-ja.com

NGINXプロキシのデフォルトのキャッシュ時間(Cache-Controlあり、有効期限なし)

NGINXプロキシでキャッシュを有効にしています。

私の理解では、プロキシ構成(Cache-Control)のproxy_ignore_headersヘッダーを無視しない限り、期限切れまでのキャッシュ時間は、Cache-Controlを使用してオリジンサーバーから設定できます。 = max-age=XXXX

しかし、それが保持し、Cache-Control: publicのようなものに使用するデフォルトのキャッシュ時間はどのくらいでしょうか?これらのリソースのデフォルトの最大キャッシュ時間を設定する方法はありますか?

3
dlrust

おそらく、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";
  }
}
3
Tim

これは正しいです。デフォルトでは、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のデフォルトはありません。

1
maxschlepzig