NGINX 代理默认缓存时间与 Cache-Control 一致且无过期时间

NGINX 代理默认缓存时间与 Cache-Control 一致且无过期时间

我已在 NGINX 代理上启用了缓存。

据我了解,只要我不忽略Cache-Control代理配置中的标头(proxy_ignore_headers),就可以使用Cache-Control=从原始服务器设置到期前的缓存时间max-age=XXXX

但是,它会保留并使用什么样的默认缓存时间呢Cache-Control: public?有没有办法为这些资源设置默认的最大缓存时间?

答案1

没错,默认情况下,刚刚proxy_cache配置好后,nginx 只会缓存已经max-age设置在Cache-Controlheader 中的响应。

没有任何Cache-Control标头或者只是Cache-Control: publicnginx 不缓存响应(即,每次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

答案2

你最好在 Nginx 中设置或重写缓存控制标头。我有一个关于此的教程这里,本教程的第一部分有可下载的配置文件。关键部分如下

你需要headers_more才能让它们正常工作。有些发行版包含此功能,有些则不包含,因此您需要从源代码进行构建 - 这非常简单,并且包含在我的教程中。

从教程中复制

我们使用几种不同的技术来设置缓存控制标头。首先,我们清除所有现有标头,例如不再有用的非常旧的 Pragma,清除 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 级别=1:2 keys_zone=CACHE:50m inactive=1440m;#RAM

# 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";
  }
}

相关内容