Nginx静态文件缓存配置包含五种方法:一、用expires指令控制浏览器缓存;二、用proxy_cache实现反向代理级磁盘缓存;三、用map指令动态设置缓存时间;四、用open_file_cache优化文件元数据读取;五、通过ETag与Last-Modified实现协商缓存。

如果您希望提升网站访问速度并降低服务器负载,Nginx静态文件缓存配置是关键环节。以下是针对Linux系统下Nginx缓存策略的多种具体配置方法:
一、配置location块启用expires指令
该方法通过HTTP响应头中的Expires和Cache-Control字段控制浏览器端缓存行为,适用于CSS、JS、图片等静态资源,无需额外模块支持。
1、打开Nginx主配置文件或站点配置文件,通常位于/etc/nginx/nginx.conf或/etc/nginx/sites-available/your-site。
2、在server块内添加匹配静态资源的location块,例如:location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
3、在该location块中加入expires指令:expires 1y;
4、同时添加强制更新缓存的头部:add_header Cache-Control "public, immutable";
5、保存文件后执行sudo nginx -t验证语法,再运行sudo systemctl reload nginx重载配置。
二、使用proxy_cache定义反向代理级缓存区
此方法在Nginx作为反向代理时生效,将上游服务器返回的内容缓存在本地磁盘,减少重复请求对后端的压力,需启用ngx_http_proxy_module模块(默认已编译)。
1、在http块顶部定义缓存路径与参数:proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m use_temp_path=off;
2、在server或location块中启用该缓存区:proxy_cache my_cache;
3、设置缓存键值以避免相同URL不同参数被误判为同一资源:proxy_cache_key "$scheme$request_method$host$request_uri$is_args$args";
4、设定缓存有效时间:proxy_cache_valid 200 302 10m;proxy_cache_valid 404 1m;
5、添加响应头标识是否命中缓存:add_header X-Cache-Status $upstream_cache_status;
三、结合map指令实现差异化缓存策略
利用map模块根据请求URI后缀或用户代理动态生成缓存时间变量,实现更精细的缓存控制,避免全局统一设置带来的灵活性缺失。
1、在http块中定义缓存时间映射关系:map $sent_http_content_type $cache_time { "~image/" "1h"; "~text/css" "1d"; "~application/javascript" "1d"; default "1m";}
2、在对应的location块中引用该变量:expires $cache_time;
3、确保Nginx已加载map模块(通常默认启用),可通过nginx -V 2>&1 | grep -o with-http-map-module确认。
4、重启前检查配置:注意:map定义必须位于server块之外,且不能嵌套在其他指令块内部。
四、启用open_file_cache优化文件元数据读取
该机制缓存文件描述符、文件大小和修改时间等信息,显著减少高并发下对文件系统stat()调用的开销,特别适合大量小静态文件场景。
1、在http或server块中添加配置:open_file_cache max=10000 inactive=20s;
2、设置最小访问次数才纳入缓存:open_file_cache_min_uses 2;
3、启用缓存校验功能:open_file_cache_valid 30s;
4、开启错误状态缓存(如文件不存在):open_file_cache_errors on;
5、应用配置后执行sudo nginx -s reload,此项不依赖客户端请求头,仅影响Nginx自身文件操作性能。
五、配置ETag与Last-Modified协商缓存
通过服务端生成资源标识符(ETag)或最后修改时间(Last-Modified),配合客户端If-None-Match或If-Modified-Since请求头实现304响应,节省带宽并复用本地副本。
1、确认Nginx未禁用相关头部输出:etag on;if_modified_since exact;
2、在location块中启用条件响应:add_header Last-Modified ""; // 若需禁用Last-Modified可设为空
3、对于由FastCGI或uWSGI等后端生成的内容,确保上游协议支持传递ETag头;静态文件默认已启用ETag和Last-Modified,无需额外配置。
4、测试是否生效:使用curl命令发送带If-None-Match头的请求,观察响应状态码是否为304。

















