我已在 NGINX 代理上启用了缓存。
据我了解,只要我不忽略Cache-Control
代理配置中的标头(proxy_ignore_headers
),就可以使用Cache-Control
=从原始服务器设置到期前的缓存时间max-age=XXXX
。
但是,它会保留并使用什么样的默认缓存时间呢Cache-Control: public
?有没有办法为这些资源设置默认的最大缓存时间?
答案1
没错,默认情况下,刚刚proxy_cache
配置好后,nginx 只会缓存已经max-age
设置在Cache-Control
header 中的响应。
没有任何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
。
答案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";
}
}