0x01 前言
nginx最常见的应用场景就是作为反向代理服务器使用,那必然要使用代理功能,为了提高性能,代理缓存也是必不可少的一项配置。实践发现,Nginx的限速也是基于缓存的。
0x02 代理缓存之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。 |
这里其实没有什么好说得,但是有一个点要注意,代理产生的临时文件不会自删除,如果这里将代理作为下载服务,那可能产生大量的临时文件,最终导致磁盘写满。
0x03 作为下载服务器的代理机时
接上面的问题,如果要将Nginx作为下载服务的代理机器时怎么操作,这里有两个选项:
- 不使用代理(万事大吉)
- 搭配proxy_cache_path使用
不需要使用一些依赖缓存的功能时完全可以不适用代理缓存功能,proxy_buffering设置为off即可,但是如果想使用一些高级功能,比如下载限时速,是依赖proxy_buffering的,这里就要采用第二种方案,proxy_buffering搭配proxy_cache_path一期使用。
0x04 代理缓存之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; } } |