如何在nginx配置文件中实现静态资源缓存

发布时间: 2024-05-02 11:02:25 阅读量: 99 订阅数: 35
PDF

如何在nginx中配置缓存静态文件

![如何在nginx配置文件中实现静态资源缓存](https://img-blog.csdnimg.cn/20201215094202225.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NheWdvb2Q5OTk=,size_16,color_FFFFFF,t_70) # 1. Nginx静态资源缓存概述 Nginx静态资源缓存是一种性能优化技术,它允许Nginx服务器将经常访问的静态文件(如HTML、CSS、JS、图片和视频)存储在内存或磁盘中。通过将这些文件缓存起来,Nginx可以减少对源服务器的请求,从而提高网站的响应速度和吞吐量。 静态资源缓存的工作原理是将请求的静态文件存储在服务器的内存或磁盘中,当后续请求相同的资源时,Nginx将直接从缓存中提供,而无需向源服务器发起请求。这可以显著减少网络延迟和服务器负载,从而提升用户体验和网站性能。 # 2. Nginx静态资源缓存配置 ### 2.1 配置指令详解 #### 2.1.1 location指令 `location`指令用于指定要缓存的资源路径,语法格式如下: ``` location [= | ~ | ~* | ^~] path { ... } ``` 其中: - `=`:精确匹配路径 - `~`:正则表达式匹配路径 - `~*`:通配符匹配路径 - `^~`:前缀匹配路径 例如,以下配置将缓存所有以`/static/`开头的资源: ``` location = /static/ { ... } ``` #### 2.1.2 proxy_cache_path指令 `proxy_cache_path`指令用于指定缓存文件的存储路径,语法格式如下: ``` proxy_cache_path path [levels=number] [keys_zone=name] [max_size=size] [inactive=time] [use_temp_path=on | off]; ``` 其中: - `path`:缓存文件存储路径 - `levels`:缓存文件存储目录的层级深度 - `keys_zone`:用于存储缓存文件键的共享内存区域名称 - `max_size`:缓存文件最大存储大小 - `inactive`:缓存文件未被访问的过期时间 - `use_temp_path`:是否使用临时路径存储缓存文件 例如,以下配置将缓存文件存储在`/data/nginx/cache`目录中,最大存储大小为100MB: ``` proxy_cache_path /data/nginx/cache levels=2 keys_zone=cache_zone max_size=100m; ``` #### 2.1.3 proxy_cache_key指令 `proxy_cache_key`指令用于指定缓存文件的键,语法格式如下: ``` proxy_cache_key string; ``` 其中: - `string`:缓存文件的键,可以是任意字符串 例如,以下配置将使用请求的URI作为缓存文件的键: ``` proxy_cache_key $request_uri; ``` ### 2.2 配置示例 #### 2.2.1 基本缓存配置 以下是一个基本的Nginx静态资源缓存配置示例: ``` location = /static/ { proxy_cache_path /data/nginx/cache levels=2 keys_zone=cache_zone max_size=100m; proxy_cache_key $request_uri; } ``` #### 2.2.2 高级缓存配置 以下是一个高级的Nginx静态资源缓存配置示例,包括了缓存过期时间设置、缓存大小限制、缓存预热和缓存并行化等优化措施: ``` location = /static/ { proxy_cache_path /data/nginx/cache levels=2 keys_zone=cache_zone max_size=100m inactive=30d; proxy_cache_key $request_uri; proxy_cache_valid 200 302 1h; proxy_cache_use_stale error timeout invalid_header http_500 http_502 http_503 http_504; proxy_cache_lock on; proxy_cache_lock_timeout 10s; proxy_cache_min_uses 1; proxy_cache_revalidate on; proxy_cache_background_update on; proxy_cache_bypass $http_pragma $http_authorization; } ``` - `proxy_cache_valid`:设置缓存过期时间,对于状态码为200、302的响应,缓存1小时 - `proxy_cache_use_stale`:设置在特定情况下使用陈旧缓存,如错误、超时、无效头、500、502、503、504状态码 - `proxy_cache_lock`:启用缓存锁定,防止多个请求同时修改同一个缓存文件 - `proxy_cache_lock_timeout`:设置缓存锁定超时时间,10秒后自动释放锁 - `proxy_cache_min_uses`:设置缓存文件最小使用次数,只有被访问过指定次数的缓存文件才会被保留 - `proxy_cache_revalidate`:启用缓存重新验证,在缓存过期后,重新向后端服务器请求资源 - `proxy_cache_background_update`:启用缓存后台更新,在缓存过期后,后台向后端服务器请求资源,并更新缓存 - `proxy_cache_bypass`:设置缓存绕过条件,对于带有`Pragma`或`Authorization`头的请求,不使用缓存 # 3. Nginx静态资源缓存优化 ### 3.1 缓存策略优化 #### 3.1.1 缓存过期时间设置 缓存过期时间是指定缓存内容在客户端浏览器中保存的时间长度。合理设置缓存过期时间可以有效提高缓存命中率,减少服务器负载。 **配置指令:** ```nginx proxy_cache_valid 200 302 10m; proxy_cache_valid 404 1m; ``` **参数说明:** - `proxy_cache_valid 200 302 10m;`:设置状态码为 200 和 302 的响应缓存过期时间为 10 分钟。 - `proxy_cache_valid 404 1m;`:设置状态码为 404 的响应缓存过期时间为 1 分钟。 **逻辑分析:** - 对于状态码为 200 和 302 的响应,缓存过期时间设置为 10 分钟,表示客户端浏览器将在 10 分钟内使用缓存内容,而不会向服务器发送请求。 - 对于状态码为 404 的响应,缓存过期时间设置为 1 分钟,表示客户端浏览器将在 1 分钟内使用缓存内容,而不会向服务器发送请求。 #### 3.1.2 缓存大小限制 缓存大小限制是指定缓存可以存储的最大数据量。合理设置缓存大小限制可以防止缓存占用过多的服务器内存,影响服务器性能。 **配置指令:** ```nginx proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=100m; ``` **参数说明:** - `proxy_cache_path /var/cache/nginx`:指定缓存存储路径。 - `levels=1:2`:指定缓存目录的层级结构,其中 1 表示一级目录,2 表示二级目录。 - `keys_zone=my_cache:10m`:指定缓存键值对区域名称和大小。 - `max_size=100m`:指定缓存最大存储大小为 100MB。 **逻辑分析:** - 缓存存储在 `/var/cache/nginx` 目录下,并使用两级目录结构进行组织。 - 缓存键值对区域名为 `my_cache`,大小为 10MB,用于存储缓存键和值。 - 缓存最大存储大小为 100MB,当缓存大小超过 100MB 时,最老的缓存内容将被删除。 ### 3.2 缓存性能优化 #### 3.2.1 缓存预热 缓存预热是指在服务器启动时或缓存配置更改时,将需要缓存的内容主动加载到缓存中。缓存预热可以减少首次访问时的延迟,提高缓存命中率。 **配置指令:** ```nginx proxy_cache_preload /var/cache/nginx/preload.txt; ``` **参数说明:** - `proxy_cache_preload /var/cache/nginx/preload.txt;`:指定需要预热的 URL 列表文件。 **逻辑分析:** - Nginx 将读取 `/var/cache/nginx/preload.txt` 文件中的 URL 列表,并主动将这些 URL 的响应内容加载到缓存中。 - 当客户端首次访问这些 URL 时,可以直接从缓存中获取响应,而无需向服务器发送请求,从而减少延迟。 #### 3.2.2 缓存并行化 缓存并行化是指允许多个客户端同时从缓存中获取相同的内容。缓存并行化可以提高缓存吞吐量,减少服务器负载。 **配置指令:** ```nginx proxy_cache_use_stale error timeout invalid_header http_500 http_502 http_503 http_504; ``` **参数说明:** - `proxy_cache_use_stale`:指定在某些情况下使用陈旧的缓存内容。 - `error`:当服务器返回错误时。 - `timeout`:当服务器请求超时时。 - `invalid_header`:当服务器返回无效的响应头时。 - `http_500`:当服务器返回 500 错误时。 - `http_502`:当服务器返回 502 错误时。 - `http_503`:当服务器返回 503 错误时。 - `http_504`:当服务器返回 504 错误时。 **逻辑分析:** - 当服务器出现错误或超时时,Nginx 将允许客户端使用陈旧的缓存内容,而不是向服务器发送请求。 - 这可以减少服务器负载,并提高客户端的响应速度。 # 4. Nginx静态资源缓存实践 ### 4.1 缓存静态文件 #### 4.1.1 HTML、CSS、JS等文件 对于HTML、CSS、JS等静态文件,我们可以使用Nginx的`location`指令进行缓存配置。例如: ```nginx location ~* \.(html|css|js)$ { proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=static:10m; proxy_cache_key "$scheme$request_method$host$request_uri"; proxy_cache_valid 200 302 1h; proxy_cache_use_stale error timeout invalid_header http_500 http_502 http_503 http_504; proxy_cache_lock on; proxy_cache_revalidate on; } ``` - `location`指令:匹配所有以`.html`、`.css`或`.js`结尾的请求。 - `proxy_cache_path`指令:指定缓存文件存储的路径和缓存级别。`levels=1:2`表示使用两级缓存,第一级为内存缓存,第二级为磁盘缓存。 - `proxy_cache_key`指令:指定缓存键的生成规则,这里使用请求的协议、方法、主机和URI作为缓存键。 - `proxy_cache_valid`指令:设置缓存的有效期,这里设置为1小时。 - `proxy_cache_use_stale`指令:指定在某些情况下使用陈旧的缓存数据,例如当请求失败或超时时。 - `proxy_cache_lock`指令:启用缓存锁,防止多个请求同时修改同一个缓存文件。 - `proxy_cache_revalidate`指令:启用缓存重新验证,当缓存文件过期时,Nginx会向源服务器重新请求。 #### 4.1.2 图片、视频等媒体文件 对于图片、视频等媒体文件,我们可以使用Nginx的`proxy_cache`模块进行缓存配置。例如: ```nginx location ~* \.(jpg|jpeg|png|gif|mp4|flv)$ { proxy_cache_path /data/nginx/cache/media levels=1:2 keys_zone=media:10m; proxy_cache_key "$scheme$request_method$host$request_uri"; proxy_cache_valid 200 302 1d; proxy_cache_use_stale error timeout invalid_header http_500 http_502 http_503 http_504; proxy_cache_lock on; proxy_cache_revalidate on; } ``` - `location`指令:匹配所有以`.jpg`、`.jpeg`、`.png`、`.gif`、`.mp4`或`.flv`结尾的请求。 - `proxy_cache_path`指令:指定缓存文件存储的路径和缓存级别。 - `proxy_cache_key`指令:指定缓存键的生成规则。 - `proxy_cache_valid`指令:设置缓存的有效期,这里设置为1天。 - `proxy_cache_use_stale`指令:指定在某些情况下使用陈旧的缓存数据。 - `proxy_cache_lock`指令:启用缓存锁。 - `proxy_cache_revalidate`指令:启用缓存重新验证。 ### 4.2 缓存动态页面 #### 4.2.1 使用反向代理 对于动态页面,我们可以使用Nginx的反向代理功能进行缓存。例如,我们可以将请求转发到一个PHP应用服务器,并使用Nginx对PHP应用服务器的响应进行缓存。 ```nginx location / { proxy_pass http://127.0.0.1:8080; proxy_cache_path /data/nginx/cache/dynamic levels=1:2 keys_zone=dynamic:10m; proxy_cache_key "$scheme$request_method$host$request_uri"; proxy_cache_valid 200 302 1h; proxy_cache_use_stale error timeout invalid_header http_500 http_502 http_503 http_504; proxy_cache_lock on; proxy_cache_revalidate on; } ``` - `location`指令:匹配所有请求。 - `proxy_pass`指令:将请求转发到PHP应用服务器。 - `proxy_cache_path`指令:指定缓存文件存储的路径和缓存级别。 - `proxy_cache_key`指令:指定缓存键的生成规则。 - `proxy_cache_valid`指令:设置缓存的有效期,这里设置为1小时。 - `proxy_cache_use_stale`指令:指定在某些情况下使用陈旧的缓存数据。 - `proxy_cache_lock`指令:启用缓存锁。 - `proxy_cache_revalidate`指令:启用缓存重新验证。 #### 4.2.2 使用FastCGI 对于动态页面,我们还可以使用Nginx的FastCGI功能进行缓存。FastCGI是一种协议,允许Nginx与PHP等应用程序进行通信。 ```nginx location / { fastcgi_pass 127.0.0.1:9000; fastcgi_cache_path /data/nginx/cache/dynamic levels=1:2 keys_zone=dynamic:10m; fastcgi_cache_key "$scheme$request_method$host$request_uri"; fastcgi_cache_valid 200 302 1h; fastcgi_cache_use_stale error timeout invalid_header http_500 http_502 http_503 http_504; fastcgi_cache_lock on; fastcgi_cache_revalidate on; } ``` - `location`指令:匹配所有请求。 - `fastcgi_pass`指令:将请求转发到PHP应用服务器。 - `fastcgi_cache_path`指令:指定缓存文件存储的路径和缓存级别。 - `fastcgi_cache_key`指令:指定缓存键的生成规则。 - `fastcgi_cache_valid`指令:设置缓存的有效期,这里设置为1小时。 - `fastcgi_cache_use_stale`指令:指定在某些情况下使用陈旧的缓存数据。 - `fastcgi_cache_lock`指令:启用缓存锁。 - `fastcgi_cache_revalidate`指令:启用缓存重新验证。 # 5. Nginx静态资源缓存疑难解答 ### 5.1 缓存失效问题 #### 5.1.1 缓存过期 **问题描述:** 当缓存的过期时间被达到时,缓存失效,请求将绕过缓存直接访问源服务器。 **解决方法:** * **调整缓存过期时间:**根据文件的更新频率和重要性,适当调整缓存过期时间。 * **使用缓存刷新机制:**定期刷新缓存,确保缓存中的内容是最新的。 #### 5.1.2 缓存刷新 **问题描述:** 当源文件发生更改时,缓存中的内容可能与源文件不一致。 **解决方法:** * **使用主动缓存刷新:**当源文件发生更改时,主动刷新缓存。 * **使用被动缓存刷新:**当请求访问缓存中的文件时,如果发现缓存已过期,则被动刷新缓存。 ### 5.2 缓存性能问题 #### 5.2.1 缓存命中率低 **问题描述:** 缓存命中率低,表示请求经常绕过缓存直接访问源服务器,导致缓存利用率低。 **解决方法:** * **优化缓存策略:**根据文件的访问频率和更新频率,选择合适的缓存策略。 * **排除不可缓存的文件:**排除动态内容、敏感信息等不可缓存的文件。 * **使用缓存预热:**在服务器启动时或定期预热缓存,加载常用文件。 #### 5.2.2 缓存占用空间过大 **问题描述:** 缓存占用空间过大,可能导致服务器性能下降。 **解决方法:** * **设置缓存大小限制:**限制缓存的最大占用空间,避免缓存过大。 * **定期清理缓存:**定期删除过期的或不常用的缓存文件。 * **使用分级缓存:**将缓存分为多个层级,根据文件的重要性和访问频率分配不同的缓存策略。 # 6. Nginx静态资源缓存最佳实践 ### 6.1 缓存策略选择 #### 6.1.1 根据文件类型选择缓存策略 不同的文件类型具有不同的访问模式和缓存需求。因此,根据文件类型选择合适的缓存策略非常重要。 - **HTML、CSS、JS 等文件:**这些文件通常具有较长的缓存时间,因为它们不太频繁更改。 - **图片、视频等媒体文件:**这些文件通常具有较短的缓存时间,因为它们可能经常更新。 - **动态页面:**动态页面不适合缓存,因为它们的内容会根据请求而变化。 #### 6.1.2 根据访问频率选择缓存策略 访问频率高的文件应该具有较长的缓存时间,而访问频率低的文件应该具有较短的缓存时间。 ### 6.2 缓存性能监控 为了确保缓存的有效性和性能,需要对其进行持续监控。 #### 6.2.1 缓存命中率监控 缓存命中率是衡量缓存性能的关键指标。它表示请求被缓存命中而不是从源服务器获取的次数。高缓存命中率表明缓存正在有效工作。 ``` nginx -V | grep -i cache_hit_rate ``` #### 6.2.2 缓存占用空间监控 缓存占用空间也是一个重要的监控指标。过大的缓存占用空间可能会导致性能问题。 ``` du -sh /path/to/cache ```
corwn 最低0.47元/天 解锁专栏
买1年送3月
点击查看下一篇
profit 百万级 高质量VIP文章无限畅学
profit 千万级 优质资源任意下载
profit C知道 免费提问 ( 生成式Al产品 )

相关推荐

SW_孙维

开发技术专家
知名科技公司工程师,开发技术领域拥有丰富的工作经验和专业知识。曾负责设计和开发多个复杂的软件系统,涉及到大规模数据处理、分布式系统和高性能计算等方面。
专栏简介
《Nginx 实战指南》专栏深入探讨了 Nginx 的工作原理、配置和优化技术。专栏文章涵盖了广泛的主题,包括: * Nginx 的工作原理和优势 * 配置静态资源缓存 * 实现反向代理 * 负载均衡策略 * 日志分析方法 * Gzip 模块优化 * 反向代理缓存配置 * 模块开发指南 * Lua 脚本扩展 * 容器化部署实践 * 性能优化策略 * 日志切割和归档 * 动态模块加载 * HTTPS 严格传输安全 * 负载均衡算法 * 高可靠性和高可用性 * 自定义负载均衡策略 * 日志分析和监控集成 * 大文件上传处理 本专栏旨在为 Nginx 用户提供全面的指南,帮助他们充分利用 Nginx 的功能,优化其网站和应用程序的性能、可靠性和安全性。
最低0.47元/天 解锁专栏
买1年送3月
百万级 高质量VIP文章无限畅学
千万级 优质资源任意下载
C知道 免费提问 ( 生成式Al产品 )

最新推荐

【时间序列分析深度解析】:15个关键技巧让你成为数据预测大师

![【时间序列分析深度解析】:15个关键技巧让你成为数据预测大师](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X2pwZy9GSXpPRWliOFZRVXBDR1VwU1lUaGRya1dFY0ljRldxNjJmSURaVWlhOGt4MndnNjZUbFFEZG9YcVpYcWNHWXNyc3ZXbG1pY2ljZm85TjY2Vm5kR01Vak02QUEvNjQw?x-oss-process=image/format,png) # 摘要 时间序列分析是处理和预测按时间顺序排列的数据点的技术。本文

【Word文档处理技巧】:代码高亮与行号排版的终极完美结合指南

![【Word文档处理技巧】:代码高亮与行号排版的终极完美结合指南](https://ecampusontario.pressbooks.pub/app/uploads/sites/473/2019/05/justification.png) # 摘要 本文旨在为技术人员提供关于Word文档处理的深入指导,涵盖了从基础技巧到高级应用的一系列主题。首先介绍了Word文档处理的基本入门知识,然后着重讲解了代码高亮的实现方法,包括使用内置功能、自定义样式及第三方插件和宏。接着,文中详细探讨了行号排版的策略,涉及基础理解、在Word中的插入方法以及高级定制技巧。第四章讲述了如何将代码高亮与行号完美结

LabVIEW性能优化大师:图片按钮内存管理的黄金法则

# 摘要 本文围绕LabVIEW软件平台的内存管理进行深入探讨,特别关注图片按钮对象在内存中的使用原理、优化实践以及管理工具的使用。首先介绍LabVIEW内存管理的基础知识,然后详细分析图片按钮在LabVIEW中的内存使用原理,包括其数据结构、内存分配与释放机制、以及内存泄漏的诊断与预防。第三章着重于实践中的内存优化策略,包括图片按钮对象的复用、图片按钮数组与簇的内存管理技巧,以及在事件结构和循环结构中的内存控制。接着,本文讨论了LabVIEW内存分析工具的使用方法和性能测试的实施,最后提出了内存管理的最佳实践和未来发展趋势。通过本文的分析与讨论,开发者可以更好地理解LabVIEW内存管理,并

【CListCtrl行高设置深度解析】:算法调整与响应式设计的完美融合

# 摘要 CListCtrl是广泛使用的MFC组件,用于在应用程序中创建具有复杂数据的列表视图。本文首先概述了CListCtrl组件的基本使用方法,随后深入探讨了行高设置的理论基础,包括算法原理、性能影响和响应式设计等方面。接着,文章介绍了行高设置的实践技巧,包括编程实现自适应调整、性能优化以及实际应用案例分析。文章还探讨了行高设置的高级主题,如视觉辅助、动态效果实现和创新应用。最后,通过分享最佳实践与案例,本文为构建高效和响应式的列表界面提供了实用的指导和建议。本文为开发者提供了全面的CListCtrl行高设置知识,旨在提高界面的可用性和用户体验。 # 关键字 CListCtrl;行高设置

邮件排序与筛选秘籍:SMAIL背后逻辑大公开

![邮件排序与筛选秘籍:SMAIL背后逻辑大公开](https://img-blog.csdnimg.cn/64b62ec1c8574b608f5534f15b5d707c.png) # 摘要 本文全面探讨了邮件系统的功能挑战和排序筛选技术。首先介绍了邮件系统的功能与面临的挑战,重点分析了SMAIL的排序算法,包括基本原理、核心机制和性能优化策略。随后,转向邮件筛选技术的深入讨论,包括筛选逻辑的基础构建、高级技巧和效率提升方法。文中还通过实际案例分析,展示了邮件排序与筛选在不同环境中的应用,以及个人和企业级的邮件管理策略。文章最后展望了SMAIL的未来发展趋势,包括新技术的融入和应对挑战的策

AXI-APB桥在SoC设计中的关键角色:微架构视角分析

![axi-apb-bridge_xilinx.pdf](https://ask.qcloudimg.com/http-save/yehe-6583963/2qul3ov98t.png) # 摘要 本文对AXI-APB桥的技术背景、设计原则、微架构设计以及在SoC设计中的应用进行了全面的分析与探讨。首先介绍了AXI与APB协议的对比以及桥接技术的必要性和优势,随后详细解析了AXI-APB桥的微架构组件及其功能,并探讨了设计过程中面临的挑战和解决方案。在实践应用方面,本文阐述了AXI-APB桥在SoC集成、性能优化及复杂系统中的具体应用实例。此外,本文还展望了AXI-APB桥的高级功能扩展及其

CAPL脚本高级解读:技巧、最佳实践及案例应用

![CAPL脚本高级解读:技巧、最佳实践及案例应用](https://www.topflytech.com/wp-content/uploads/2020/08/1452051285317933-1024x443.jpg) # 摘要 CAPL(CAN Access Programming Language)是一种专用于Vector CAN网络接口设备的编程语言,广泛应用于汽车电子、工业控制和测试领域。本文首先介绍了CAPL脚本的基础知识,然后详细探讨了其高级特性,包括数据类型、变量管理、脚本结构、错误处理和调试技巧。在实践应用方面,本文深入分析了如何通过CAPL脚本进行消息处理、状态机设计以

【适航审定的六大价值】:揭秘软件安全与可靠性对IT的深远影响

![【适航审定的六大价值】:揭秘软件安全与可靠性对IT的深远影响](https://itshelp.aurora.edu/hc/article_attachments/1500012723422/mceclip1.png) # 摘要 适航审定作为确保软件和IT系统符合特定安全和可靠性标准的过程,在IT行业中扮演着至关重要的角色。本文首先概述了适航审定的六大价值,随后深入探讨了软件安全性与可靠性的理论基础及其实践策略,通过案例分析,揭示了软件安全性与可靠性提升的成功要素和失败的教训。接着,本文分析了适航审定对软件开发和IT项目管理的影响,以及在遵循IT行业标准方面的作用。最后,展望了适航审定在

CCU6定时器功能详解:定时与计数操作的精确控制

![CCU6定时器功能详解:定时与计数操作的精确控制](https://img-blog.csdnimg.cn/b77d2e69dff64616bc626da417790eb9.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5L2c6Zq-5b-F5b6X,size_20,color_FFFFFF,t_70,g_se,x_16) # 摘要 CCU6定时器是工业自动化和嵌入式系统中常见的定时器组件,本文系统地介绍了CCU6定时器的基础理论、编程实践以及在实际项目中的应用。首先概述了CCU