浅谈Nginx代理缓存配置

浅谈Nginx代理缓存配置

前言

nginx最常见的应用场景就是作为反向代理服务器使用,那必然要使用代理功能,为了提高性能,代理缓存也是必不可少的一项配置。实践发现,Nginx的限速也是基于缓存的。

代理缓存之proxy_buffering

proxy_buffering可以是on也可以是off,当开启时,代理服务器将启用缓存功能,包括硬盘缓存和内存缓存,当buffer满时将会使用磁盘作为缓存,和其配套使用的参数介绍如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34

1. proxy_buffering  on;
# 该参数设置是否开启proxy的buffer功能,参数的值为on或者off。
# 如果这个设置为off,那么proxy_buffers和proxy_busy_buffers_size这两个指令将会失效。
# 但是无论proxy_buffering是否开启,proxy_buffer_size都是生效的

2. proxy_buffer_size  4k;
# 该参数用来设置一个特殊的buffer大小的。
# 从被代理服务器(C)上获取到的第一部分响应数据内容到代理服务器(B)上,通常是header,就存到了这个buffer中。
# 如果该参数设置太小,会出现502错误码,这是因为这部分buffer不够存储header信息。建议设置为4k。

3. proxy_buffers  8  4k;
# 这个参数设置存储被代理服务器上的数据所占用的buffer的个数和每个buffer的大小。
# 所有buffer的大小为这两个数字的乘积。

4. proxy_busy_buffer_size 16k;
# 在所有的buffer里,我们需要规定一部分buffer把自己存的数据传给A,这部分buffer就叫做busy_buffer。
# proxy_busy_buffer_size参数用来设置处于busy状态的buffer有多大。

# 对于B上buffer里的数据何时传输给A,我个人的理解是这样的:
# 1)如果完整数据大小小于busy_buffer大小,当数据传输完成后,马上传给A;
# 2)如果完整数据大小不少于busy_buffer大小,则装满busy_buffer后,马上传给A;

5. proxy_temp_path
# 语法:proxy_temp_path  path [level1 level2 level3]
# 定义proxy的临时文件存在目录以及目录的层级。

# 例:proxy_temp_path /usr/local/nginx/proxy_temp 1 2;
# 其中/usr/local/nginx/proxy_temp为临时文件所在目录,1表示层级1的目录名为1个数字(0-9),2表示层级2目录名为 # 2个数字(00-99)

6. proxy_max_temp_file_size
# 设置临时文件的总大小,例如 proxy_max_temp_file_size 100M;

7. proxy_temp_file_wirte_size
# 设置同时写入临时文件的数据量的总大小。通常设置为8k或者16k。

这里其实没有什么好说得,但是有一个点要注意,代理产生的临时文件不会自删除,如果这里将代理作为下载服务,那可能产生大量的临时文件,最终导致磁盘写满。

作为下载服务器的代理机时

接上面的问题,如果要将Nginx作为下载服务的代理机器时怎么操作,这里有两个选项:

  • 不使用代理(万事大吉)
  • 搭配proxy_cache_path使用

不需要使用一些依赖缓存的功能时完全可以不适用代理缓存功能,proxy_buffering设置为off即可,但是如果想使用一些高级功能,比如下载限时速,是依赖proxy_buffering的,这里就要采用第二种方案,proxy_buffering搭配proxy_cache_path一期使用。

代理缓存之proxy_cache_path

proxy_cache_path会对访问过的内容在本地建立副本,当再次访问时不必请求源服务器就可以返回数据,同时支持本地副本的过过期时间配置

proxy_cache_path需要在http模块配置,下面是一个例子:

1

proxy_cache_path /tmp/nginx_cache/ levels=1:2 keys_zone=my_zone:10m inactive=2m max_size=800m;

下面是参数介绍

1
2
3
4
5
6
7

/tmp/nginx_cache/  #本地路径,用来设置Nginx缓存资源的存放地址
levels          #默认所有缓存文件都放在同一个/tmp/nginx_cache/下,但是会影响缓存的性能,因此通常会在/tmp/nginx_cache/下面建立子目录用来分别存放不同的文件。假设levels=1:2,Nginx为将要缓存的资源生成的key为f4cd0fbc769e94925ec5540b6a4136d0,那么key的最后一位0,以及倒数第2-3位6d作为两级的子目录,也就是该资源最终会被缓存到/tmp/nginx_cache/0/6d目录中
key_zone        #在共享内存中设置一块存储区域来存放缓存的key和metadata(类似使用次数),这样nginx可以快速判断一个request是否命中或者未命中缓存,1m可以存储8000个key,10m可以存储80000个key
max_size        #最大cache空间,如果不指定,会使用掉所有disk space,当达到配额后,会删除最少使用的cache文件
inactive        #未被访问文件在缓存中保留时间,本配置中如果60分钟未被访问则不论状态是否为expired,缓存控制程序会删掉文件。inactive默认是10分钟。需要注意的是,inactive和expired配置项的含义是不同的,expired只是缓存过期,但不会被删除,inactive是删除指定时间内未被访问的缓存文件
use_temp_path   #如果为off,则nginx会将缓存文件直接写入指定的cache文件中,而不是使用temp_path存储,official建议为off,避免文件在不同文件系统中不必要的拷贝
proxy_cache     #启用proxy cache,并指定key_zone。另外,如果proxy_cache off表示关闭掉缓存。

使用keys_zone是在server块内部,比如

1
2
3
4
5
6
7
8
9

server {
    …
    proxy_buffering on;

    location / {
        proxy_cache my_zone;
        proxy_pass http://my_upstream;
    }
}

© 版权声明
THE END
喜欢就支持一下吧
点赞7赞赏 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容