nginx的异步和缓存

代理异步请求的执行过程:
  • 1、当HTTP请求交给Nginx处理时,首先Nginx会取出header头中的Host (此处也就是 www.nginx-s1.com)

  • 2、然后将其与所有的配置文件中的每个server段中的server_name进行匹配,以此决定到底有哪个server块来处理这个ver块中的server_name都匹配,这时会根据请求匹配选择实际处理的server块。

  • 3、此时可以看到HTTP请求匹配到了server_name www.nginx-s1.com; ,这样接下来nginx就会在当前server块中匹配到 location / 。

  • 4、接下来继续由nginx处理可以看到
    location / {
    proxy_pass http://WebA;
    } ;
    这就是进行反向代理处理,这个例子中使用的是nginx的upstream模块进行反向代理实现。

  • 5、通过proxy_pass http://WebA; 中的 WebA 可以找到对应的upstream块,然后,可以根据其中的 server 172.16.12.61 和 172.16.12.62 ;再次进行代理请求到目标服务器。

为了方便理解,我们定义三个角色,A为客户端,B为代理服务器,C为被代理服务器。

proxy_buffering主要是实现被代理服务器的数据和客户端的请求异步

当proxy_buffering开启,A发起请求到B,B再到C,C反馈的数据先到B的buffer上,然后B会根据proxy_busy_buffer_size来决定什么时候开始把数据传输给A。
就存在下边nginx目录结构的proxy_temp
在这里插入图片描述

1. proxy_cache
语法:proxy_cache zone|off

默认为off,即关闭proxy_cache功能,zone为用于存放缓存的内存区域名称。
例:proxy_cache my_zone;

从nginx 0.7.66版本开始,proxy_cache机制开启后会检测被代理端的HTTP响应头中的"Cache-Control""Expire"头域。
如,Cache-Control为no-cache时,是不会缓存数据的。

2. proxy_cache_bypass 
语法:proxy_cache_bypass string;

该参数设定,什么情况下的请求不读取cache而是直接从后端的服务器上获取资源。
这里的string通常为nginx的一些变量。

例:proxy_cahce_bypass $cookie_nocache $arg_nocache$arg_comment;
意思是,如果$cookie_nocache $arg_nocache$arg_comment这些变量的值只要任何一个不为0或者不为空时,
则响应数据不从cache中获取,而是直接从后端的服务器上获取。

3. proxy_no_cache
语法:proxy_no_cache string;

该参数和proxy_cache_bypass类似,用来设定什么情况下不缓存。

例:proxy_no_cache $cookie_nocache $arg_nocache $arg_comment;
表示,如果$cookie_nocache $arg_nocache $arg_comment的值只要有一项不为0或者不为空时,不缓存数据。

4. proxy_cache_key
语法:proxy_cache_key string;

定义cache key,如: proxy_cache_key $scheme$proxy_host$uri$is_args$args; (该值为默认值,一般不用设置)

5. proxy_cache_path
语法:proxy_cache_path path [levels=levels] keys_zone=name:size  [inactive=time] [max_size=size] 

path设置缓存数据存放的路径;
levels设置目录层级,如levels=1:2,表示有两级子目录,第一个目录名取md5值的倒数第一个值,第二个目录名取md5值的第23个值。
keys_zone设置内存zone的名字和大小,如keys_zone=my_zone:10m
inactive设置缓存多长时间就失效,当硬盘上的缓存数据在该时间段内没有被访问过,就会失效了,该数据就会被删除,默认为10s。
max_size设置硬盘中最多可以缓存多少数据,当到达该数值时,nginx会删除最少访问的数据。
nginx缓存:

使用场景:
      项目的页面需要加载很多数据,也不是经常变化的,不涉及个性化定制,为每次请求去动态生成数据,性能比不上根据请求路由和参数缓存一下结果,使用 Nginx 缓存将大幅度提升请求速度。

      只需要配置 proxy_cache_pathproxy_cache就可以开启内容缓存,前者用来设置缓存的路径和配置,后者用来启用缓存。

 gzip  on;
    upstream WebA {
        server 172.16.12.200:80;    <---用到缓存的肯定是做了反向代理,那么这个就是一定要有的,如果是本地的那就不需要缓存了
    }
    proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;
    proxy_cache_valid  200 304 302 24h;		<---这个是比较重要的,200是状态码,表示访问成功,如果没有这条缓存文件不会生成。
    client_max_body_size    300m;
    client_body_buffer_size 128k;
    proxy_connect_timeout   600;
    proxy_read_timeout      600;
    proxy_send_timeout      600;
    proxy_buffer_size       64k;
    proxy_buffers           4  32k;
    proxy_busy_buffers_size 64k;
    proxy_max_temp_file_size 64k;
    server {
        listen       80;
        server_name  localhost;

        proxy_cache my_cache;
        location / {
            proxy_pass http://WebA;
            proxy_next_upstream http_500 http_502 http_503 error timeout invalid_header;
            include /usr/local/nginx/conf/proxy.conf;
        }
/usr/local/nginx/conf/proxy.conf;

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;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;

1、用于缓存的本地磁盘目录是 /path/to/cache/

2、levels:在 /path/to/cache/ 设置了一个两级层次结构的目录。将大量的文件放置在单个目录中会导致文件访问缓慢,所以针对大多数部署,我们推荐使用两级目录层次结构。如果 levels 参数没有配置,则 NGINX 会将所有的文件放到同一个目录中。

3、keys_zone:设置一个共享内存区,该内存区用于存储缓存键和元数据,有些类似计时器的用途。将键的拷贝放入内存可以使 NGINX 在不检索磁盘的情况下快速决定一个请求是 HIT 还是 MISS,这样大大提高了检索速度。一个 1MB 的内存空间可以存储大约 8000 个 key,那么上面配置的 10MB 内存空间可以存储差不多 80000 个key。

4、max_size:设置了缓存的上限(在上面的例子中是 10G)。这是一个可选项;如果不指定具体值,那就是允许缓存不断增长,占用所有可用的磁盘空间。当缓存达到这个上线,处理器便调用 cache manager 来移除最近最少被使用的文件,这样把缓存的空间降低至这个限制之下。

5、inactive:指定了项目在不被访问的情况下能够在内存中保持的时间。在上面的例子中,如果一个文件在 60 分钟之内没有被请求,则缓存管理将会自动将其在内存中删除,不管该文件是否过期。该参数默认值为 10 分钟(10m)。注意,非活动内容有别于过期内容。NGINX 不会自动删除由缓存控制头部指定的过期内容(本例中Cache-Control:max-age=120)。过期内容只有在 inactive 指定时间内没有被访问的情况下才会被删除。如果过期内容被访问了,那么 NGINX 就会将其从原服务器上刷新,并更新对应的 inactive 计时器。

6、NGINX: 最初会将注定写入缓存的文件先放入一个临时存储区域, use_temp_path=off 命令指示 NGINX 将在缓存这些文件时将它们写入同一个目录下。我们强烈建议你将参数设置为 off 来避免在文件系统中不必要的数据拷贝。use_temp_path 在 NGINX1.7 版本和 NGINX Plus R6 中有所介绍。

最终,proxy_cache 命令启动缓存那些 URL 与 location 部分匹配的内容(本例中,为/)。你同样可以将 proxy_cache 命令添加到 server 部分,这将会将缓存应用到所有的那些 location 中未指定自己的 proxy_cache 命令的服务中。

Nginx 缓存相关进程

缓存中还涉及两个额外的NGINX进程:

cache manager :周期性地启动,检查高速缓存的状态。如果高速缓存大小超过 proxy_cache_path 中 max_size 参数设置的限制,则高速缓存管理器将删除最近访问过的数据。在两次缓存管理器启动的间隔,缓存的数据量可能短暂超过配置的大小。
cache loader:只运行一次,NGINX 开始之后。它将有关以前缓存的数据的元数据加载到共享内存区域。一次加载整个缓存可能会消耗足够的资源来在启动后的最初几分钟内降低 NGINX 的性能。要避免这种情况,请通过在 proxy_cache_path 指令中包含以下参数来配置缓存的迭代加载:
loader_threshold : 迭代持续时间,以毫秒为单位(默认情况下 200)
loader_files :一次迭代期间加载的最大项目数(默认情况下 100)
loader_sleeps :迭代之间的延迟,以毫秒为单位(默认情况下 50)

nginx缓存的进程:
在这里插入图片描述
配置完之后访问测试:

然后就能看到缓存了,其中这个缓存的文件是根据hash算法进行存储的。
在这里插入图片描述
这个文件可以打开的。

在这里插入图片描述
可以看到,请求的KEY:http://WebA/就是upstream里的那个。

下边是具体的内容,代码什么的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值