缓存配置
对于一个含有大量内容的网站来说,随着访问量的增多,对于经常被用户访问的内容,若每一次都要到后端服务器中获取,会给服务器造成很大的压力。为此,利用反向代理服务器对访问频率较多的内容进行缓存,有利于节省后端服务器的资源。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指令设置的响应消息头。
常用缓存配置指令: