0

0

静态资源服务器 Nginx 缓存策略优化

幻夢星雲

幻夢星雲

发布时间:2025-07-14 14:11:02

|

667人浏览过

|

来源于php中文网

原创

nginx 缓存策略优化通过合理配置提升网站性能和节省资源。1. 配置静态资源缓存需使用 proxy_cache_path 定义缓存区域,并在 location 或 server 块中启用 proxy_cache,设置缓存键、状态码及过期时间;2. 根据文件类型设置缓存时间可利用 expires 和 cache-control 头;3. 缓存键应根据业务需求定制,如加入参数或 cookie 以支持多版本内容;4. 缓存更新可通过版本号控制、手动清除或短时间缓存+验证机制实现;5. 监控命中率可使用 stub_status 模块或 prometheus + grafana 进行可视化;6. 缓存预热通过脚本或模块主动加载热门资源;7. 动态与静态内容混合缓存可使用 esi 或 micro-caching 技术;8. 避免缓存雪崩和穿透的方法包括设置随机过期时间、互斥锁、缓存空对象和布隆过滤器;9. 安全性方面需避免缓存敏感信息、防止缓存污染。

静态资源服务器 Nginx 缓存策略优化

Nginx 缓存策略优化,简单来说,就是让你的网站更快,更省服务器资源。通过合理配置 Nginx,可以缓存静态资源,减少回源请求,提升用户体验。

Nginx 缓存策略优化

如何配置 Nginx 缓存静态资源?

配置 Nginx 缓存静态资源,核心在于 proxy_cache_pathproxy_cache 指令。首先,你需要定义一个缓存区域,指定缓存目录、大小、过期时间等。例如:

proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;

这个配置的意思是:

  • /data/nginx/cache:缓存目录。
  • levels=1:2:缓存目录层级,可以提高查找效率。
  • keys_zone=my_cache:10m:缓存区域名称和大小,用于存储缓存键和元数据。
  • max_size=10g:最大缓存空间。
  • inactive=60m:资源在缓存中保留的最长时间,即使它们没有被访问。
  • use_temp_path=off:直接将文件写入缓存目录,而不是先写入临时目录再移动。

然后在你的 server 或 location 块中启用缓存:

server {
    location /static/ {
        proxy_pass http://backend;
        proxy_cache my_cache;
        proxy_cache_valid 200 304 12h;
        proxy_cache_valid any 1m;
        proxy_cache_key "$scheme$request_method$host$request_uri";
        add_header X-Cache-Status $upstream_cache_status;
    }
}

这里解释下:

  • proxy_pass http://backend:将请求转发到后端服务器。
  • proxy_cache my_cache:启用名为 my_cache 的缓存区域。
  • proxy_cache_valid 200 304 12h:缓存 HTTP 状态码为 200 和 304 的响应 12 小时。
  • proxy_cache_valid any 1m:缓存所有其他状态码的响应 1 分钟。
  • proxy_cache_key "$scheme$request_method$host$request_uri":定义缓存键,确保每个 URL 都有唯一的缓存。
  • add_header X-Cache-Status $upstream_cache_status:添加响应头,显示缓存状态(HIT, MISS, BYPASS, EXPIRED, STALE)。

如何根据文件类型设置不同的缓存时间?

可以利用 location 块和 expires 指令,针对不同的文件类型设置不同的缓存时间。例如:

location ~* \.(jpg|jpeg|png|gif|svg|js|css|woff2?)$ {
    expires 30d;
    add_header Cache-Control "public";
}

这段配置表示,所有以 .jpg, .jpeg, .png, .gif, .svg, .js, .css, .woff2.woff 结尾的文件,缓存 30 天,并设置 Cache-Control: public 头,允许浏览器和中间代理缓存。

缓存键的设置有什么讲究?

缓存键的设置至关重要,它决定了哪些请求会被视为相同并使用缓存。 默认情况下,Nginx 使用 $scheme$proxy_host$request_uri 作为缓存键。 但有时你需要更精细的控制。

比如,你的网站支持多语言,不同的语言版本使用不同的 URL 参数。 这时,你需要将语言参数也加入到缓存键中:

proxy_cache_key "$scheme$request_method$host$uri?$arg_lang";

这样,只有相同语言版本的请求才会命中缓存。 另外,如果你的网站使用了 cookie 来区分用户,并且需要针对不同用户缓存不同的内容,那么你需要将 cookie 也加入到缓存键中(但要非常小心,避免缓存敏感信息)。

如何处理缓存更新问题?

缓存更新是个头疼的问题,因为一旦缓存了,即使源站内容更新了,用户看到的仍然是旧版本。 常见的解决方案有:

  1. 版本号控制:在静态资源 URL 中加入版本号,例如 style.css?v=1.0。 当文件内容更新时,修改版本号,强制浏览器重新下载。

  2. 缓存清除:手动或自动清除缓存。 Nginx 本身没有提供缓存清除的接口,但你可以通过第三方模块,例如 ngx_cache_purge 来实现。 或者,你可以通过发送 PURGE 请求来清除缓存(需要配置)。

  3. 短时间缓存 + 验证:设置较短的缓存时间,同时使用 Cache-Control: must-revalidate 指令,告诉浏览器每次使用缓存前都必须向服务器验证。

如何监控 Nginx 缓存的命中率?

监控缓存命中率是优化缓存策略的重要手段。 可以通过 ngx_http_stub_status_module 模块来获取 Nginx 的运行状态,包括连接数、请求数、以及缓存命中率。

首先,确保你的 Nginx 编译时包含了该模块。 然后在你的配置文件中添加一个 location 块:

location /nginx_status {
    stub_status;
    allow 127.0.0.1;
    deny all;
}

然后,你就可以通过访问 http://your_server_ip/nginx_status 来查看 Nginx 的状态信息。 其中,Requests 字段表示总请求数,Cache 字段表示缓存命中情况。

更高级的监控可以使用 Prometheus + Grafana,通过 Nginx 的 ngx_http_prometheus_module 模块暴露监控指标,然后用 Prometheus 收集,最后用 Grafana 可视化。 这样可以更直观地了解缓存的性能。

东莞多用户商城
东莞多用户商城

用div+css+全站HTML静态页面缓存技术,访问速度更快对服务器的压力更小,有利于搜索引擎SEO优化。帐号:admin密码:admin

下载

缓存预热是什么?如何实现?

缓存预热是指在服务上线或缓存失效后,主动将热门资源加载到缓存中,避免大量请求直接打到后端服务器。 实现缓存预热的方法有很多:

  1. 使用工具:编写脚本,模拟用户请求,访问热门资源,将其缓存到 Nginx 中。 可以使用 curlwget 等工具。

  2. 分析日志:分析 Nginx 的访问日志,找出热门资源,然后编写脚本预热这些资源。

  3. 使用 Nginx 模块:有一些 Nginx 模块可以自动预热缓存,例如 ngx_cache_warmup_module

预热时需要注意,避免瞬间大量请求导致服务器过载。 可以控制预热速度,分批次进行。

如何处理动态内容和静态内容的混合缓存?

动态内容通常不适合缓存,但有时可以对动态内容的部分片段进行缓存。 例如,一个电商网站的商品详情页,商品信息是动态的,但页面结构、样式等静态资源可以缓存。

可以使用 Edge Side Includes (ESI) 技术,将页面分成多个片段,静态片段由 Nginx 缓存,动态片段由后端服务器动态生成。 Nginx 支持 ESI,需要启用 esi on; 指令。

另外,还可以使用 micro-caching 技术,对动态内容设置非常短的缓存时间,例如 1 秒。 这样可以减少后端服务器的压力,同时保证用户看到的内容不会过时太久。

如何避免缓存雪崩和缓存穿透?

缓存雪崩是指缓存同时失效,导致大量请求直接打到数据库,造成数据库压力过大甚至崩溃。 缓存穿透是指请求的 key 根本不存在于缓存中,导致每次请求都要查询数据库。

避免缓存雪崩的方法:

  1. 设置不同的过期时间:避免所有缓存同时失效。 可以给不同的缓存设置随机的过期时间。

  2. 使用互斥锁:当缓存失效时,只允许一个请求去重建缓存,其他请求等待。

  3. 备份缓存:使用多级缓存,例如本地缓存 + 分布式缓存。

避免缓存穿透的方法:

  1. 缓存空对象:如果数据库中不存在对应的 key,则缓存一个空对象,避免每次都查询数据库。 但要注意,空对象也要设置过期时间,避免占用过多内存。

  2. 使用布隆过滤器:在缓存之前,使用布隆过滤器过滤掉不存在的 key,避免请求打到缓存。

Nginx 缓存策略的安全性考虑

虽然缓存可以提高性能,但也需要注意安全性。 避免缓存敏感信息,例如用户密码、信用卡信息等。 如果必须缓存包含敏感信息的内容,则需要对缓存进行加密。

另外,要防止缓存污染。 恶意用户可能会通过构造特殊的请求,将恶意内容缓存到 Nginx 中,导致其他用户受到攻击。 可以对请求进行严格的验证,避免恶意请求进入缓存。

总之,Nginx 缓存策略优化是一个复杂而重要的课题。 需要根据你的实际业务场景,选择合适的策略,并不断监控和调整,才能达到最佳效果。

相关专题

更多
nginx 重启
nginx 重启

nginx重启对于网站的运维来说是非常重要的,根据不同的需求,可以选择简单重启、平滑重启或定时重启等方式。本专题为大家提供nginx重启的相关的文章、下载、课程内容,供大家免费下载体验。

229

2023.07.27

nginx 配置详解
nginx 配置详解

Nginx的配置是指设置和调整Nginx服务器的行为和功能的过程。通过配置文件,可以定义虚拟主机、HTTP请求处理、反向代理、缓存和负载均衡等功能。Nginx的配置语法简洁而强大,允许管理员根据自己的需要进行灵活的调整。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

496

2023.08.04

nginx配置详解
nginx配置详解

NGINX与其他服务类似,因为它具有以特定格式编写的基于文本的配置文件。本专题为大家提供nginx配置相关的文章,大家可以免费学习。

498

2023.08.04

tomcat和nginx有哪些区别
tomcat和nginx有哪些区别

tomcat和nginx的区别:1、应用领域;2、性能;3、功能;4、配置;5、安全性;6、扩展性;7、部署复杂性;8、社区支持;9、成本;10、日志管理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

227

2024.02.23

nginx报404怎么解决
nginx报404怎么解决

当访问 nginx 网页服务器时遇到 404 错误,表明服务器无法找到请求资源,可以通过以下步骤解决:1. 检查文件是否存在且路径正确;2. 检查文件权限并更改为 644 或 755;3. 检查 nginx 配置,确保根目录设置正确、没有冲突配置等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

333

2024.07.09

Nginx报404错误解决方法
Nginx报404错误解决方法

解决方法:只需要加上这段配置:try_files $uri $uri/ /index.html;即可。想了解更多Nginx的相关内容,可以阅读本专题下面的文章。

3507

2024.08.07

nginx部署php项目教程汇总
nginx部署php项目教程汇总

本专题整合了nginx部署php项目教程汇总,阅读专题下面的文章了解更多详细内容。

7

2026.01.13

nginx配置文件详细教程
nginx配置文件详细教程

本专题整合了nginx配置文件相关教程详细汇总,阅读专题下面的文章了解更多详细内容。

5

2026.01.13

Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

36

2026.01.14

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
进程与SOCKET
进程与SOCKET

共6课时 | 0.3万人学习

nginx浅谈
nginx浅谈

共15课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号