Nginx怎么开启缓存来提高性能?

3,334 阅读3分钟

本文正在参与 “网络协议必知必会”征文活动


一、缓存的作用?

Web 浏览器和应用服务器之间可能存在多个缓存:客户端的浏览器缓存、中间缓存、内容交付网络 (CDN) 以及位于应用服务器前面的负载平衡器或反向代理,即使在反向代理/负载平衡器级别的缓存,也可以大大提高性能。


二、怎么开启缓存功能?
1、两步开启缓存功能
# 1、设置缓存的基本配置
proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=10g 
                 inactive=60m use_temp_path=off;

server {
    # ...
    location / {
    		# 2、开启缓存功能
        proxy_cache my_cache;
        proxy_pass http://my_upstream;
    }
}

2、proxy_cache_path
  • /path/to/cache/ :设置缓存的存储目录;
  • levels :上面目录下的文件目录层次结构,这里设置2层目录结构,单个文件夹包含大量文件会降低文件访问速度。如果不设置此参数,表示采用1层目录结构。
  • keys_zone :设置共享内存大小,用于存储缓存的key和相关数据,内存访问速度要比硬盘块很多,内存1MB大约可存储8000个 key, 这里的 10m 可以存储大于80,000个 可以。
  • max_size :设置缓存大小的上限,如果不设置,缓存上限就是硬盘大小,缓存到达上限后,会自动删除不常用的缓存。
  • inactive :表示文件在给定时长内没有被使用,就会被删除。默认值为10分钟。
  • use_temp_path=off :是否将缓存文件先写入临时存储区域,推荐关闭此选项,避免不必要的文件复制操作。

3、proxy_cache
  • proxy_cache :使用上面的缓存配置,来启动匹配 URL 的缓存功能,这里的 URL 是指 /
  • 当把 proxy_cache 放到 server 下,那么 server 下的所有 location 匹配的 URL 都会启动缓存功能。

三、怎么处理源服务器故障?

当源服务器遇到 故障 或 流量太大,无法提供服务时,Nginx 可以使用缓存继续为用户提供服务。

通过设置 proxy_cache_use_stale 指令,当 Nginx 访问源服务器,发生 超时、500、502、503、504 这几种情况时,Nginx会先使用缓存来响应客户,如果没有缓存,才返回错误给客户。

location / {
    # ...
    proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504;
}

四、微调缓存,提高性能
proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=10g 
                 inactive=60m use_temp_path=off;

server {
    # ...
    location / {
        proxy_cache my_cache;
        proxy_cache_revalidate on;
        proxy_cache_min_uses 3;
        proxy_cache_use_stale error timeout updating http_500 http_502
                              http_503 http_504;
        proxy_cache_background_update on;
        proxy_cache_lock on;

        proxy_pass http://my_upstream;
    }
}
  • proxy_cache_revalidate :表示使用 条件请求 向源服务器发送 GET 请求。If-Modified-SinceIf-Unmodified-Since 等请求头会被使用,最大可能减少数据的传输。条件请求相关的请求头信息,看这里!
  • proxy_cache_min_uses :表示 缓存 被使用的最小次数,默认值为1。这个属性用在缓存空间达到上限时,低于此属性设置的次数的缓存,会被删除。
  • proxy_cache_use_stale updating + proxy_cache_background_update on ,表示新资源正在下载,用旧的缓存资源来响应现在的请求,直到新资源下载完毕。
  • proxy_cache_lock on :当多个请求都没找到相应缓存时,只能按照时间顺序,一个一个地向源服务器请求资源;如果此属性设置为 off,那么多个请求之间不会等待,多个请求一起向源服务器请求资源。

五、拆分缓存目录

可以把缓存目录拆分成多个,分别保存到多个硬盘中,达到缓存扩容的需求。

# 1、设置两块硬盘的缓存目录及配置
proxy_cache_path /path/to/hdd1 levels=1:2 keys_zone=my_cache_hdd1:10m
                 max_size=10g inactive=60m use_temp_path=off;
proxy_cache_path /path/to/hdd2 levels=1:2 keys_zone=my_cache_hdd2:10m
                 max_size=10g inactive=60m use_temp_path=off;

# 2、访问URL 作为key,两个硬盘各负责一半的缓存
split_clients $request_uri $my_cache {
              50%          “my_cache_hdd1”;
              50%          “my_cache_hdd2”;
}

server {
    # ...
    location / {
    		# 3、启动缓存服务
        proxy_cache $my_cache;
        proxy_pass http://my_upstream;
    }
}

六、通过 Cookie 和 Session 区分缓存文件

希望给每一个登录用户指定专门的缓存,提升用户的访问体验,可以通过 proxy_cache_key 设定特定的 key ,这样用户常用的网页,都被缓存。

# 组合 主机名、url、cookie、sessionid 作为缓存文件的唯一标识
proxy_cache_key $proxy_host$request_uri$cookie_jessionid;

七、支持 ETagVary

八、参考文档