nginx 缓存与优化

简介: 在浏览器和应用服务器之间,存在多种“潜在”缓存,如:客户端浏览器缓存中间缓存内容分发网络(CDN)服务器上的负载均衡和反向代理缓存,仅在反向代理和负载均衡的层面,就对性能提高有很大的帮助。

在浏览器和应用服务器之间,存在多种“潜在”缓存,如:

  • 客户端浏览器缓存
  • 中间缓存
  • 内容分发网络(CDN)
  • 服务器上的负载均衡和反向代理

    缓存,仅在反向代理和负载均衡的层面,就对性能提高有很大的帮助。

为什么要用缓存?

  • 网站的访问速度更快
  • 减轻源服务器的负担
  • 提高负载平衡器、反向代理和应用服务器前端web服务的性能

nginx代理模块缓存指令

指令 说明
proxy_cache 定义缓存的共享内存区域
proxy_cache_bypass 一个或者多个字符串变量,变量的值为非空或者非零将会导致响应从上游服务器获取而不是缓存
proxy_cache_key 用来区分缓存文件的key,作为缓存key的一个字符串,用于存储或者获取缓存值。默认值为$scheme$proxy_host$uri$is_args$args
proxy_cache_lock 启用这个指令,当多个客户端请求一个缓存中不存在的文件(或称之为一个MISS),只有这些请求中的第一个被允许发送至服务器。其他请求在第一个请求得到满意结果之后在缓存中得到文件。
proxy_cache_lock_timeout 等待一个请求将出现在缓存或者proxy_cache_lock锁释放的时间长度
proxy_cache_min_uses 在一个响应被缓存为一个key之前需要请求的最小次数
proxy_cache_path 一个放置缓存响应和共享zone(keys_zone=name:size)的目录,用于存放key和响应的元数据。
proxy_cache_path:keys_zone 设置一个共享内存区,用于存储缓存键和元数据,有些类似计时器的用途。
proxy_cache_path:levels 冒号用于分隔在每个级别(1或2)的子目录名长度,最多三级深;
proxy_cache_path:inactive 在一个不活动的响应被驱除出缓存之前待在缓存中的最大时间长度;例如设置如60m,则文件如果在60分钟之内没有被请求,则缓存管理会自动将其在内存中删除,不管文件是否过期。
proxy_cache_path:max_size 缓存的最大值,当大小超过这个值,缓存管理器溢出最近最少使用的缓存条目;
proxy_cache_path:loader_files 缓存文件的最大数量,它们的元数据被每个缓存载入进程迭代载入;
proxy_cache_path:loader_sleep 在每个迭代缓存载入进程之间停顿的毫秒数;
proxy_cache_path:loader_threshold 缓存载入进程迭代花去时间的最大值
proxy_cache_use_stale 在访问上游服务器的时候发生错误,在这种情况下接受提供过期的缓存数据。参数updating告知NGINX在客户端请求的项目的更新正在原服务器中下载时发送旧内容,而不是向服务器转发重复的请求
proxy_cache_valid 缓存的有效期;指定对200、301或者302有效代码缓存的时间长度。特定参数any表示对任何响应都缓存一定时间长度。
proxy_cache_methods 缓存支持的方法,默认为GET,可以改为POST,OPTIONS等

缓存策略

  • 首页缓存1分钟,因为它所包含的链接及文件列表经常更新
  • 每篇文章都被缓存1天,因为一旦写完它们将不会改变,但我们又不希望缓存被填满,因此需要移除一些旧的缓存内容以便满足空间的需要。
  • 尽量地缓存所有图像,因为从磁盘检索图像文件是一件比较“昂贵”的操作。
http {
    proxy_cache_path    /var/spool/nginx/articles    keys_zone=ARTICLES:16m    levels=1:2    inactive=1d;
    proxy_cache_path    /var/spool/nginx/images    keys_zone=IMAGES:128m    levels=1:2    inactive=30d;
    proxy_temp_path    /var/spool/nginx;

    server {

        location / {
            # 首页
            proxy_cache_valid 1m;
        }
        
        location /articles {
            proxy_cache_valid 1d;
        }
    
        location /img {
            proxy_cache_valid 10y;
        }
    }
}

示例

下面的配置设计缓存所有的响应6个小时,缓存大小为1GB。任何条目保存刷新,就是说,在6个小时内被调用为超时,有效期为1天。在此时间后,上游服务器将再次调用提供响应。如果上游服务器由于错误、超时、无效头或者是由于缓存条目被升级,那么过期的条目就会被使用。共享内存区、CACHE被定义为10MB,并且在location中使用,在这里设置缓存key,并且也可以从这里查询。

http {
    proxy_temp_path  /var/spool/nginx;

    proxy_cache_path  /var/spool/nginx  keys_zone=CACHE:10m  levels=1:2  inactive=6h max_size=1g;
 
    server {
 
        location / {
            # using include to bring in a file with commonly-used settings
            include proxy.conf;
 
            proxy_cache CACHE;
 
            proxy_cache_valid any 1d;
 
            proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504;
 
            proxy_pass http://upstream;
        }
    }
}

实践

1,检测缓存状态

通过添加如下代码实现

server {
    listen 80;
    server_name xx.fofpower.com;
    location / {
        proxy_cache api_cache;
        proxy_cache_valid  200 206 304 301 302 1d;        
        proxy_ignore_headers Cache-Control;
        add_header X-Cache-Status $upstream_cache_status;  #添加此行
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://myapi;
    }
}

浏览器上看到的状态可能有:



$upstream_cache_status可能值:
1,MISS——响应在缓存中找不到,所以需要在服务器中取得。
2,HIT——响应包含来自缓存的最新有效的内容
3,EXPIRED——缓存中的某一项过期了,来自原始服务器的响应包含最新的内容
4,STALE——内容陈旧是因为原始服务器不能正确响应。需要配置proxy_cache_use_stale
5,UPDATING——内容过期了,因为相对于之前的请求,响应的入口(entry)已经更新,并且proxy_cache_use_stale的updating已被设置
6,REVALIDATED——proxy_cache_revalidate命令被启用,NGINX检测得知当前的缓存内容依然有效(If-Modified-Since或者If-None-Match)

2,缓存POST请求

NGINX默认支持GET请求的缓存,要增加POST,需要设置proxy_cache_methods。
对于POST请求,url相同,body内容不同,如果使用默认的proxy_cache_key,会造成不同的post请求,用了一个缓存键,返回给前端的数据会错乱。
解决方案是将post的请求参数也作为key的一部分。

server {
    listen 80;
    server_name www.fofeasy.com;
    add_header X-Cache-Status $upstream_cache_status;
    location / {
        proxy_cache web_cache;
        proxy_cache_valid  200 206 304 301 302 10d;
        proxy_cache_key $uri$request_body; #增加此行
        proxy_cache_methods GET POST;  #增加此行
        proxy_ignore_headers Cache-Control;
        proxy_redirect off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://myweb;
    }
}

参考

目录
相关文章
|
4月前
|
缓存 应用服务中间件 nginx
成功解决 Nginx更新静态资源无效 ,Nginx静态资源更新不及时,Nginx清除缓存
这篇文章讨论了在使用Nginx进行动静分离时遇到的静态资源更新不及时的问题。问题描述了在服务器上更新静态资源后,访问页面时页面没有显示更新的情况。文章提供了解决这个问题的方法,即清除浏览器缓存,并提供了相关参考文章链接。此外,还展示了问题复现的步骤和正常情况的预期结果。
成功解决 Nginx更新静态资源无效 ,Nginx静态资源更新不及时,Nginx清除缓存
|
25天前
|
缓存 监控 测试技术
如何利用浏览器的缓存来优化网站性能?
【10月更文挑战第23天】通过以上多种方法合理利用浏览器缓存,可以显著提高网站的性能,减少网络请求,加快资源加载速度,提升用户的访问体验。同时,要根据网站的具体情况和资源的特点,不断优化和调整缓存策略,以适应不断变化的业务需求和用户访问模式。
75 7
|
2月前
|
存储 缓存 监控
|
2月前
|
缓存 JavaScript 前端开发
Vue 3的事件监听缓存如何优化性能?
【10月更文挑战第5天】随着前端应用复杂度的增加,性能优化变得至关重要。Vue 3 通过引入事件监听缓存等新特性提升了应用性能。本文通过具体示例介绍这一特性,解释其工作原理及如何利用它优化性能。与 Vue 2 相比,Vue 3 可在首次渲染时注册事件监听器并在后续渲染时重用,避免重复注册导致的资源浪费和潜在内存泄漏问题。通过使用 `watchEffect` 或 `watch` 监听状态变化并更新监听器,进一步提升应用性能。事件监听缓存有助于减少浏览器负担,特别在大型应用中效果显著,使应用更加流畅和响应迅速。
84 1
|
2月前
|
存储 缓存 负载均衡
Nginx代理缓存机制
【10月更文挑战第2天】
78 4
|
2月前
|
存储 缓存 NoSQL
Nginx缓存
Nginx缓存
30 2
|
2月前
|
缓存 前端开发 JavaScript
|
2月前
|
存储 缓存 监控
HTTP:强缓存优化实践
HTTP强缓存是提升网站性能的关键技术之一。通过精心设计缓存策略,不仅可以显著减少网络延迟,还能降低服务器负载,提升用户体验。实施上述最佳实践,结合持续的监控与调整,能够确保缓存机制高效且稳定地服务于网站性能优化目标。
49 3
|
3月前
|
缓存 JavaScript 中间件
优化Express.js应用程序性能:缓存策略、请求压缩和路由匹配
在开发Express.js应用时,采用合理的缓存策略、请求压缩及优化路由匹配可大幅提升性能。本文介绍如何利用`express.static`实现缓存、`compression`中间件压缩响应数据,并通过精确匹配、模块化路由及参数化路由提高路由处理效率,从而打造高效应用。
167 10
|
2月前
|
缓存 监控 负载均衡
nginx相关配置及高并发优化
Nginx的高并发优化是一个综合性的过程,需要根据具体的业务场景和硬件资源量身定制。以上配置只是基础,实际应用中还需根据服务器监控数据进行持续调整和优化。例如,利用工具如ab(Apache Benchmarks)进行压力测试,监控CPU、内存、网络和磁盘I/O等资源使用情况,确保配置的有效性和服务的稳定性。
124 0