Nginx 通过 proxy_cache 缓存动态页面

要提升动态网站的响应速度,通常有两种方式,一种就是负载均衡,添加更多的背后服务器,这个成本比较高;第二种是缓存,有些动态的数据对即时性要求并不高,或者说一当生成,也不会再发生变化,这种情况就可以缓存。

Nginx 服务器作为高效的,备受推崇的 Web 服务器,其实现缓存技术的方法很多,我们今天只关注:Proxy Cache,配置简单,性能优秀,支持动态地址,Nginx内部集成,无需自己安装模块。我们只需很少量的配置就可以实现对页面的缓存,从而降低后端服务器压力。

// 文件 nginx.confg,加粗着色为缓存配置部分
worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    proxy_cache_path /cache levels=1:2 keys_zone=one:50m loader_threshold=300 loader_files=200 loader_sleep=5m max_size=500m inactive=10h;

    sendfile        on;
    keepalive_timeout  65;
    include www.hrefs.cn.conf;
}

// 文件www.hrefs.cn.conf,加粗着色为缓存配置部分
server {
    listen       80;
    server_name  www.hrefs.cn;
    proxy_cache one;
    proxy_cache_valid  200 304 302 24h;
    
    location / {
        proxy_pass http://10.10.13.12;
        proxy_ignore_headers cache-control;
        proxy_cache_key $host$uri$is_args$args;
        add_header  Nginx-Cache "$upstream_cache_status";
    }
}

proxy_cache_path: 这个配置再http模块中的全局配置,指定了缓存的一些配置参数
levels: 缓存目录的层级,这里配置两级,见下面的截图
keys_zone: 缓存的名字和内存空间的内存大小
loader_sleep: 每隔多久遍历一次磁盘缓存数据源,更新内存Cache中的缓存索引
max_size: 缓存数据的总量,不能超过这个量
inactive: 可以理解为缓存的会话,如果缓存在多久没有被访问,就强制更新,这里配置10小时,与后面的proxy_cache_valid缓存时间并不冲突
proxy_cache: 指定缓存名字
proxy_cache_valid: 针对不同的HTTP状态码设置缓存时间,这里24小时,如果网站10小时内都有访问,那么缓存24小时失效,如果10小时内无人访问,10小时后被强制更新
proxy_cache_key: Web缓存的Key值,域名、URI、参数组成
add_header: 添加缓存状态码来监视是否命中缓存,MISS为没有使用缓存,HIT是使用缓存


这个图可以看见缓存目录层级,/docker/nginx/cache/2/fe,标彩色目录为缓存生成的目录,本网站使用docker部署的nginx,/docker/nginx/cache映射到nginx内部/cache,在docker的yml中配置/docker/nginx/cache:/cache,如果是直接安装的nginx,配置一个存在的目录即可,非常简单,就按照我上面配置文件所示:/cache。


nginx-cache为MISS,为没有读取缓存,从后端服务器拿的数据


nginx-cache为HIT,为命中缓存,直接从nginx服务器拿数据,没有将请求发送到后端服务器
Posted by 何敏
on 2018/07/22 00:36:27
Copyright ©2018 程序员网址导航 粤ICP备14091834号