在之前有篇文章介绍了浏览器缓存,如果小伙伴不知道建议去看看传送门。这篇文章 主要介绍nginx作为代理缓存。

1.nginx代理缓存

ssl

客户端第一次向服务器请求数据,此时nginx没有缓存,nginx会向服务器请求数据,服务器响应请求,nginx会将服务器响应的数据 缓存起来后再向客户端响应,当客户端第二次发送请求时,此时nginx有缓存就不会再向服务器发送请求,而是直接将之前的缓存返回给客户端。这样可以减轻服务器端的压力。

2.代理缓存配置项

1.proxy_cache_path

Syntax:	proxy_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] 
	[max_size=size] [manager_files=number] [manager_sleep=time] [manager_threshold=time] [loader_files=number] 
	[loader_sleep=time] [loader_threshold=time] [purger=on|off] [purger_files=number] [purger_sleep=time] [purger_threshold=time];
Default: 
Context: http

2.proxy_cache_valid

Syntax:	proxy_cache_valid [code ...] time;
Default: 
Context: http, server, location

3.proxy_cache_key

Syntax:	proxy_cache_key string;
Default: proxy_cache_key $scheme$proxy_host$request_uri;
Context: http, server, location

3.缓存场景配置

服务目录

#应用程序
/opt/app
|
|-cache #存放缓存
|-code
   |-index.html
|-code2
   |-index.html
|-code3
   |-index.html

#配置文件
/etc/nginx/conf.d
|
|-cache.conf
|-server1.conf
|-server2.conf
|-server3.conf

index.html(code)

<!doctype html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>

<h1>欢迎来到瓦力博客</h1>

</body>
</html>

index.html(code2)

<!doctype html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>

<h1>这个是code2</h1>

</body>
</html>

index.html(code3)

<!doctype html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>

<h1>这个是code3</h1>

</body>
</html>

cache.conf

upstream wali {
    server 127.0.0.1:8001;
    server 127.0.0.1:8002;
    server 127.0.0.1:8003;  
}

#proxy_cache_path 设置路径
#levels 设置目录级别
#keys_zone=wali_cache:10m 定义名字wali_cache大小10M
#max_size=10g 缓存最大10G
#inactive=60m 表示60分钟内如果没有被访问过就清掉
proxy_cache_path /opt/app/cache levels=1:2 keys_zone=wali_cache:10m max_size=10g inactive=60m use_temp_path=off;

server {
    listen       80;
    server_name  localhost;

    #charset koi8-r;
    access_log  /var/log/nginx/host.access.log  main;

    location / {
      proxy_cache wali_cache;  #开启缓存 off关闭缓存
      proxy_pass http://wali;  
      proxy_cache_valid 200 304 12h;  #表示对200 304头信息12小时过期
      proxy_cache_valid any 10m;      #表示除200 304头信息10钟过期
      proxy_cache_key $host$uri$is_args$args;  #设置缓存的key
      add_header Nginx-Cache "$upstream_cache_status";  #添加一个头信息,告知客户端是否命中缓存

	  #当返回的头信息中有500,502,503,504就跳过当前访问下一台服务器
      proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
      include proxy_params; #导入常用的代理配置在上一节中写到过
    }
	
}

server1.conf

server {
    listen       8001;
    server_name  localhost;

    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;

    location / { 
        root   /opt/app/code;
        index  index.html index.htm;
    } 
}

server2.conf

server {
    listen       8002;
    server_name  localhost;

    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;

    location / { 
        root   /opt/app/code2;
        index  index.html index.htm;
    } 
}

server3.conf

server {
    listen       8003;
    server_name  localhost;

    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;

    location / { 
        root   /opt/app/code3;
        index  index.html index.htm;
    } 
}

检测语法重启服务

nginx -tc /etc/nginx/conf

nginx -s reload -c /etc/nginx/conf

关闭代理缓存

proxy_cache off;

为了更直观的看到效果,将cache.conf文件修改,然后重启服务

打开控制台,勾选Disable cache禁用掉缓存,F5刷新。就会看到内容不停在变。

打开代理缓存

proxy_cache wali_cache;  

打开控制台,勾选Disable cache禁用掉缓存,F5刷新。发现内容不会变。头信息中多了Nginx-Cache值为HIT表示命中缓存,同时在/opt/app/cache目录下面也会出现缓存文件。

ssl

4.清理指定代理缓存

proxy_no_cache

Syntax:	proxy_no_cache string ...;
Default: 
Context: http, server, location

示例配置

server {
    listen       80;
    server_name  localhost;

    #charset koi8-r;
    access_log  /var/log/nginx/host.access.log  main;

	if ( $request_uri ~ ^/(url3|login|register|password)) {
		set $cookie_nocache 1;
	}
	
    location / {
      proxy_cache wali_cache;  
      proxy_pass http://wali;  
      proxy_cache_valid 200 304 12h;  
      proxy_cache_valid any 10m;      
      proxy_cache_key $host$uri$is_args$args;  
	  proxy_no_cache $cookie_nocache $arg_nocache $arg_comment;  
	  proxy_no_cache $http_pragma $http_authorization;
      add_header Nginx-Cache "$upstream_cache_status";  

      proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
      include proxy_params; #导入常用的代理配置在上一节中写到过
    }
	
}

proxy_no_cache配置项后面跟着的string,如果匹配到就不会去缓存。这里设置如果匹配/(url3|login|register|password)就不会被缓存。

还有一个插件ngx_cache_purge,可以指定哪些url不会被缓存。感兴趣的小伙伴可以试试

5.缓存命中率分析

$upstream_cache_status

状态含义
MISS未命中,请求被传送到后台处理
HIT缓存命中
EXPIRED缓存已经过期,请求被传送到后台处理
UPDATING正在更新缓存,将使用旧的应答
STALE后端得到过期的应答

缓存命中率

缓存命中率 = HIT次数 / 总请求次数

用日志分析代理缓存的命中率需要用到awk命令,如果不熟悉awk命令传送门

打开缓存配置文件

vim /etc/nginx/conf.d/cache.conf

查找到日志存放在哪里,这里是存放在/var/log/nginx/host.access.log,日志格式main

 access_log  /var/log/nginx/host.access.log  main;

在打开

vim /etc/nginx/nginx.conf

查找到日志存放在哪里,发现日志存在/var/log/nginx/access.log

log_format  main  '$http_user_agent' '$remote_addr - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
                  '"$http_user_agent" "$http_x_forwarded_for" ';

access_log  /var/log/nginx/access.log  main;

nginx.conf文件中添加$upstream_cache_status"指nginx代理缓存命中的值

log_format  main  '$http_user_agent' '$remote_addr - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
                  '"$http_user_agent" "$http_x_forwarded_for" '
                  '"$upstream_cache_status"';  #添加nginx缓存命中值

access_log  /var/log/nginx/access.log  main;

先清空一下代理缓存文件记录/var/log/nginx/host.access.log

>/var/log/nginx/host.access.log

清空后重启nginx服务,在浏览器上刷新页面。然后在命令行中输入

awk '{if($NF=="\"HIT\""){hit++}}END{printf "%.2f",hit/NR}' /var/log/nginx/host.access.log

打印出来的就是nginx缓存命中率。

6.代理缓存分片

slice

slice配置项是属于ngx_http_slice_module模块传送门

Syntax:	slice size;
Default: slice 0;
Context: http, server, location

示例配置

location / {
    slice             1m;
    proxy_cache       cache;
    proxy_cache_key   $uri$is_args$args$slice_range;
    proxy_set_header  Range $slice_range;
    proxy_cache_valid 200 206 1h;
    proxy_pass        http://localhost:8000;
}

分片优势

每个子请求收到的数据都会形成一个独立文件,一个请求断了,其他请求不受影响。

分片劣势

当文件很大或者slice很小的时候,可能会导致文件描述符耗尽等情况

nginx教程

nginx环境搭建(1) nginx基础知识(2) nginx的安装 卸载(3) nginx的基本参数使用(4) nginx分析默认配置(5) nginx 虚拟主机配置(6) nginx 日志(7) nginx 模块(8) nginx 访问控制(9) nginx 静态资源web服务(10) nginx 缓存(11) nginx 跨域访问(12) nginx 防盗链(13) nginx 正向,反向代理配置(14) nginx 代理缓存配置(15) nginx websocket(16) nginx fastcgi(17) nginx 搭建wordPress博客(18) nginx Fastcgi缓存配置(19) nginx uwsgi反向代理(20) nginx 负载均衡(21) [深] nginx 动静分离(22) [深] nginx rewrite规则(23) [深] nginx 平滑升级 添加模块 调试(24) [深] nginx secure_link_module模块(25) [深] nginx geoip_module模块(26) [深] nginx https(27) [深] nginx与lua的开发(28) [架] nginx常见问题(29) [架] nginx性能优化(30) [架] nginx 安全(31) [架] nginx 反向代理gRpc(32)