Nginx——缓存配置

缓存配置

对于一个含有大量内容的网站来说,随着访问量的增多,对于经常被用户访问的内容,若每一次都要到后端服务器中获取,会给服务器造成很大的压力。为此,利用反向代理服务器对访问频率较多的内容进行缓存,有利于节省后端服务器的资源。Nginx 提供了两种Web缓存方式,一种是永久性缓存,另一种是临时性缓存。

缓存实现原理

Web缓存服务器位于内容源Web服务器和客户端之间,当客户端用户访问一个URL时,Web缓存服务器就会请求相应的内容源Web服务器,并将响应的信息缓存至内存或磁盘;然后,当下一个请求到来时,如果访问的是相同的URL, Web缓存服务器会直接将已缓存的内容输出给客户端,而不用再次向内容源Web服务器发送请求。

利用缓存服务器,可以有效降低内容源服务器和数据库的负载,提高用户访问的响应速度:
在这里插入图片描述

当用户向Web缓存服务器中发送请求时,缓存服务器要检查一下当前URL请示是否已经存在缓存,若存在则直接返回给用户。否则,向内容源Web服务器发送请求,获取响应结果,将其缓存并返回给发送请求的客户端。

永久缓存配置

Nginx提供的proxy_store指令可以用于将内容源服务器响应的内容缓存到本地,若不手动删除,该缓存文件会一直生效。因此,永久缓存方式适用于缓存网站中几乎不会更改的一些内容。

准备服务器:

Nginx使用80端口反向代理Tomcat8080端口。

缓存配置:

server {
	listen 80;
	server_name localhost;
	location / {
		root cache;
		proxy_store on;
		proxy_store_access user:rw group:rw all:r;
		proxy_temp_path cache_tmp;
		proxy_pass http://localhost:8080;
	}
}

上述第5行配置,用于指定缓存文件的保存目录,这里将其设定在Nginx安装目录下的cache目录中,需要用户手动创建,创建后修改此目录的用户权限,要求与Nginx工作进.程的用户相同(如nobody)。第6行用于开启本地缓存,第7行设置缓存的读写规则,第8行设置反向代理时接收的数据临时存储文件的目录,该目录会由Nginx在配置生效后自动创建。
在这里插入图片描述
需要注意的是,上述配置虽然能够将文件缓存在本地,但是客户端每次请求时,Nginx仍然会向后端服务器获取文件。为了避免这种情况的发生,需要先判断缓存文件是否存在,具体配置如下:

#利用正则表达式匹配缓存目录中的文件、目录或符号链接是否存在
if (!-e $request_filename){
	proxy_pass http://localhost:8080;
}

#注意:if和(之间有一个空格!!!!

上述配置中,!-e表示检查一个文件、目录或符号链接是否存在,当不存在时就执行{}中的指令。其中,内置变量$request filename表示当前请求的文件路径或URI。例如,当客户端向Web缓存服务器发送http://192. 168. 78.3/test/index. html请求时,变量$request_filename的值为/test/index.html,如果缓存目录cache中没有用户请求的缓存文件,Nginx会到后端服务器http://192. 168. 78. 128/test/index. html中请求,然后将响应结果进行缓存。

验证测试:

在tomcat下的webapp目录下新建edu目录,新建一个a.html文件:

<h1>tomcat9 8080</h1>

访问:http://localhost/edu/a.html
在这里插入图片描述

进入cache目录查看缓存命中结果:
在这里插入图片描述

临时缓存配置

Nginx服务器中,还有一种使用proxy_cache指令设置的临时缓存配置,它采用md5算法将请求链接进行哈希(hash)后,根据具体配置生成缓存文件目录,保存响应的数据。

缓存配置:

#代理临时目录
proxy_temp_path /usr/local/nginx/proxy_tmp_dir;
#web缓存目录和参数设置
proxy_cache_path /usr/local/nginx/proxy_cache_dir levels=1:2 keys_zone=cache_one:50m inactive=1m max_size=500m;

上述第2行指令,用于设置缓存服务器(192.168.78.3)接收内容源服务器响应内容时使用的临时目录。第4行指令,用于设置缓存目录。其中,proxy_ cache_ path 指令相关参数的含义如下。

  • /usr/local/nginx/proxy_cache_ dir参数:表示用户自定义的缓存文件保存目录。
  • levels参数:表示缓存目录下的层级目录结构,它是根据哈希后的请求URL地址创建的,目录名称从哈希后的字符串结尾处开始截取。
    假设哈希后的请求链接地址为af7098a15e430326197 ee01516fdace0,则levels= 1:2表示,第1层子目录的名称是长度为1的字符0,第2层子目录的名称是长度为2的字符 ce。
  • keys_ zone参数:指定缓存区名称及大小,例如,cache_one:50m表示缓存区名称为cache_ one, 在内存中的空间是50MB。
  • inactive 参数:表示主动清空在指定时间内未被访问的缓存。例如,1m清空在1分钟内被访问过的缓存,1h标识1小时,1d标识1天等。
  • max_size参数:标识指定磁盘空间代销。例如,500m、10g。

需要注意的是,Nginx在进行缓存时,首先会被写人proxy_ temp_ path 指定的临时目录中,因此建议proxy_ cache_ path 和proxy_ temp_ path 指令设置的目录应在同一个文件系统中,避免不同文件系统之间的磁盘I/O消耗。

在server块中添加临时缓存的相关配置:

server {
	listen 80;
	server_name localhost;
	#增加两个响应头信息,用于获知访问的服务器地址与缓存是否成功
	add_header X-Via $server_addr;
	add_header X-Cache $upstream_cache_status;
	location / {
		#设置缓存区域名称
		proxy_cache cache_one;
		#以域名、URI、参数组合成Web缓存的Key值,Nginx根据Key值哈希
		proxy_cache_key $host$uri$is_args$args;
		#对不同的HTTP状态码设置不同的缓存时间
		proxy_cache_valid 200 10m; #200缓存10分钟
		proxy_cache_calid 304 1m;  #304缓存1分钟
		proxy_cache_calid 301 302 1h; #301、302缓存1小时
		proxy_cache_valid any 1m; #其他未设置的状态码缓存1分钟
		#设置反向代理
		proxy_pass http://localhost:8080;
	}
}

上述第9行,用于设置缓存区域名称;第11行用于设置hash的Key值组成规则,在省略的情况下,Nginx将使用默认的Key值组成规则。第13~16行设置,通过proxy_ cache_valid指令对不同的HTTP状态码设置不同的缓存时间,该指令的第1个参数表示状态码,第2个参数表示缓存时间。
关于proxy_cache_key指令参数中使用的具体内置变量的说明如下:

  • $host:服务器的域名,如 test. ng. test。
  • $uri:域名和参数之间的部分,如/index.html。
  • $is_ args:有URL参数时,则值为?,否则为空字符串。
  • $args: 保存URL参数,如a=1&b=2,没有参数时为空字符串。
  • 利用$is_ _args和$args,可以实现根据不同URL参数缓存不同文件。

为了便于在浏览器端查看是否正确缓存,第5~6行配置通过add_ header 指令添加了两个响应消息头。其中X-Via表示服务器地址,利用内置变量$server_addr 获取,另一个X-Cache表示资源缓存状态,利用内置变量$upstream_ cache_ status获取。$upstream_cache_ status的返回值有7个,如表:

在这里插入图片描述

需要注意的是,对于用户的请求,仅在处理成功的情况下,才会在浏览器的ResponseHeaders中查看到add_header指令设置的响应消息头。

常用缓存配置指令:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值