Nginx缓存简介
对于一个含有大量内容的网站来说,随着访问量的增多,对于经常被用户访问的内容,若每一次都要到后端服务器中获取,会给服务器带来巨大压力,为此,利用反向代理服务器对访问频率较多的内容进行缓存,有利于节省后端服务器的资源。Nginx提供了两种Web缓存方式,一种是永久性缓存,另一种是临时性缓存。
Web缓存服务器位于内容源Web服务器和客户端之间,当客户端用户访问一个URL时,Web缓存服务器就会请求相应的内容源Web服务器,并将响应的信息缓存到内存或磁盘,然后当下一次请求来时,如果访问的是相同的URL,Web缓存服务器会直接将已缓存的内容输出给客户端,而不用再次访问内容源Web服务器。
利用缓存服务器可以有效降低内容源服务器和数据库的负载,提高用户访问速度。
Nginx配置缓存服务
永久性缓存
Nginx提供的proxy_store指令可用于将内容源服务器响应的内容缓存到本地文件,若不手动删除,该缓存文件一直生效。因此,永久缓存方式适用于缓存网站中几乎不会更改的内容。
location / {
root cache;
proxy_store on;
proxy_store_access user:rw group:rw all:r;
proxy_temp_path cache_tmp;
proxy_pass http://59.110.171.154;
}
第一行将目标服务器的响应结果文件保存在nginx的根目录cache下,第二行是打开缓存,第三行是缓存文件的访问权限,第四行为生成的缓存文件位置,第四行为反向代理。
访问后,cache目录如下所示:
这两个文件正好是目标服务器返回的结果
root@iZ2ze488eeqkbsq8cxntxbZ logs]# tail -20f access.log
94.191.112.250 - - [03/Sep/2019:21:13:16 +0800] "GET /WWW/phpMyAdmin/index.php HTTP/1.0" 404 153 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:28.0) Gecko/20100101 Firefox/28.0"
94.191.112.250 - - [03/Sep/2019:21:13:16 +0800] "GET /phpMyAdmln/index.php HTTP/1.0" 404 153 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:28.0) Gecko/20100101 Firefox/28.0"
94.191.112.250 - - [03/Sep/2019:21:13:17 +0800] "GET /program/index.php HTTP/1.0" 404 153 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:28.0) Gecko/20100101 Firefox/28.0"
94.191.112.250 - - [03/Sep/2019:21:13:17 +0800] "GET /shopdb/index.php HTTP/1.0" 404 153 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:28.0) Gecko/20100101 Firefox/28.0"
94.191.112.250 - - [03/Sep/2019:21:13:17 +0800] "GET /phppma/index.php HTTP/1.0" 404 153 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:28.0) Gecko/20100101 Firefox/28.0"
94.191.112.250 - - [03/Sep/2019:21:13:18 +0800] "GET /phpmy/index.php HTTP/1.0" 404 153 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:28.0) Gecko/20100101 Firefox/28.0"
94.191.112.250 - - [03/Sep/2019:21:13:18 +0800] "GET /mysql/admin/index.php HTTP/1.0" 404 153 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:28.0) Gecko/20100101 Firefox/28.0"
94.191.112.250 - - [03/Sep/2019:21:13:19 +0800] "GET /mysql/dbadmin/index.php HTTP/1.0" 404 153 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:28.0) Gecko/20100101 Firefox/28.0"
94.191.112.250 - - [03/Sep/2019:21:13:19 +0800] "GET /mysql/sqlmanager/index.php HTTP/1.0" 404 153 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:28.0) Gecko/20100101 Firefox/28.0"
94.191.112.250 - - [03/Sep/2019:21:13:20 +0800] "GET /mysql/mysqlmanager/index.php HTTP/1.0" 404 153 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:28.0) Gecko/20100101 Firefox/28.0"
94.191.112.250 - - [03/Sep/2019:21:13:20 +0800] "GET /wp-content/plugins/portable-phpmyadmin/wp-pma-mod/index.php HTTP/1.0" 404 153 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:28.0) Gecko/20100101 Firefox/28.0"
94.191.112.250 - - [03/Sep/2019:21:13:20 +0800] "GET /manager/html HTTP/1.0" 404 555 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36"
94.191.112.250 - - [03/Sep/2019:21:17:21 +0800] "GET / HTTP/1.0" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36"
94.191.112.250 - - [03/Sep/2019:21:22:24 +0800] "GET / HTTP/1.0" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36"
124.89.2.70 - - [03/Sep/2019:21:24:50 +0800] "GET / HTTP/1.1" 200 628 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36"
124.89.2.70 - - [03/Sep/2019:21:24:57 +0800] "GET /demo.html HTTP/1.1" 200 16 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36"
124.89.2.70 - - [03/Sep/2019:21:25:02 +0800] "GET /demo2.html HTTP/1.1" 200 22 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36"
94.191.112.250 - - [03/Sep/2019:21:25:12 +0800] "GET / HTTP/1.0" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36"
94.191.112.250 - - [03/Sep/2019:21:25:18 +0800] "GET /demo.html HTTP/1.0" 200 16 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36"
94.191.112.250 - - [03/Sep/2019:21:25:24 +0800] "GET /demo2.html HTTP/1.0" 200 22 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36"
94.191.112.250 - - [03/Sep/2019:21:29:17 +0800] "GET /demo2.html HTTP/1.0" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36"
查看目标服务器访问日志,发现还是将请求转发,并没有使用本地缓存
原因很简单,以上配置只是打开缓存,将响应缓存下来,但是遇到请求还是会转发,想要使用本地缓存,还需要添加如下配置
location / {
root cache;
proxy_store on;
proxy_store_access user:rw group:rw all:r;
proxy_temp_path cache_tmp;
if (!-e $request_filename){
proxy_pass http://59.110.171.154;
}
}
上面的表达式,!-e的意思是检查一个文件是否存在,当不存在时,就将请求转发。
这次成功使用缓存,目标服务器并未接受到请求。
PS:Nginx的永久性缓存是基于文件存储的,有时候和使用Redis缓存的服务端相比,速度可能还会变慢。
临时性缓存
Nginx服务器中还存在一种使用proxy_cache指令设置的临时缓存配置,它采用md5算法将请求连接进行Hash后,根据具体配置生成缓存文件目录,保存响应数据。
proxy_temp_path /root/local/nginx/proxy_temp_dir;
proxy_cache_path /root/local/nginx/proxy_cache_dir levels=1:2 keys_zone=cache_one:50m inactive=1m max_size=500m;
配置目标服务器返回文件的临时目录和Web缓存目录和参数设置
levels:表示缓存目录下的层级结构,Hash后的请求URL地址创建。
keys_zone:指定缓存区的名称cache_one及大小50M
inactive:主动清空在指定时间内未被访问的缓存 1m代表1分钟
max_size:指定缓存最大大小
接着在Server块中添加临时缓存相关配置
add_header X-Via $server_addr;
add_header X-Cache $upstream_cache_status;
location / {
proxy_cache cache_one;
proxy_cache_key $host$uri$is_args$args;
proxy_cache_valid 200 10m;
proxy_cache_valid 304 1m;
proxy_cache_valid any 1m;
proxy_pass http://59.110.171.154;
}
第一行用于设置缓存区名称,第二行设置key规则,后面几行设置不同状态码的缓存时间。
至此临时缓存配置完成。