1.缓存常见类型

服务端缓存
06.Nginx代理缓存服务 - 图1

代理缓存, 获取服务端内容进行缓存

06.Nginx代理缓存服务 - 图2

客户端浏览器缓存
06.Nginx代理缓存服务 - 图3

Nginx代理缓存原理

06.Nginx代理缓存服务 - 图4

2.缓存配置语法

1.proxy_cache配置语法

  1. Syntax: proxy_cache zone | off;
  2. Default: proxy_cache off;
  3. Context: http, server, location
  4. #1.缓存路径
  5. Syntax: proxy_cache_path path [levels=levels]
  6. [use_temp_path=on|off] keys_zone=name:size [inactive=time]
  7. [max_size=size] [manager_files=number] [manager_sleep=time][manager_threshold=time]
  8. [loader_files=number] [loader_sleep=time] [loader_threshold=time] [purger=on|off]
  9. [purger_files=number] [purger_sleep=time] [purger_threshold=time];
  10. Default:
  11. Context: http
  12. #2.缓存过期周期
  13. Syntax: proxy_cache_valid [code ...] time;
  14. Default:
  15. Context: http, server, location
  16. #示例
  17. proxy_cache_valid 200 302 10m;
  18. proxy_cache_valid 404 1m;
  19. #3.缓存的维度
  20. Syntax: proxy_cache_key string;
  21. Default: proxy_cache_key $scheme$proxy_host$request_uri;
  22. Context: http, server, location
  23. #示例
  24. proxy_cache_key "$host$request_uri $cookie_user";
  25. proxy_cache_key $scheme$proxy_host$uri$is_args$args;

3.缓存配置实践

1.缓存准备

操作系统 应用服务 外网地址 内网地址
CentOS7.5 Nginx Proxy 10.0.0.5 172.16.1.5
CentOS7.5 Nginx Web 172.16.1.7

2.web节点准备

  1. #建立相关目录
  2. [root@web01 ~]# mkdir -p /soft/code{1..3}
  3. #建立相关html文件
  4. [root@web01 ~]# for i in {1..3};do echo Code1-Url$i > /soft/code1/url$i.html;done
  5. [root@web01 ~]# for i in {1..3};do echo Code2-Url$i > /soft/code2/url$i.html;done
  6. [root@web01 ~]# for i in {1..3};do echo Code3-Url$i > /soft/code3/url$i.html;done
  7. #配置Nginx
  8. [root@web01 ~]# cat /etc/nginx/conf.d/web_node.conf
  9. server {
  10. listen 8081;
  11. root /soft/code1;
  12. index index.html;
  13. }
  14. server {
  15. listen 8082;
  16. root /soft/code2;
  17. index index.html;
  18. }
  19. server {
  20. listen 8083;
  21. root /soft/code3;
  22. index index.html;
  23. }
  24. #检查监听端口
  25. [root@web01 ~]# netstat -lntp|grep 80
  26. tcp 0 0 0.0.0.0:8081 0.0.0.0:* LISTEN 50922/nginx: master
  27. tcp 0 0 0.0.0.0:8082 0.0.0.0:* LISTEN 50922/nginx: master
  28. tcp 0 0 0.0.0.0:8083 0.0.0.0:* LISTEN 50922/nginx: master

3.代理配置缓存

  1. [root@lb01 ~]# mkdir /soft/cache
  2. [root@lb01 ~]# cat /etc/nginx/conf.d/proxy_cache.conf
  3. upstream cache {
  4. server 172.16.1.7:8081;
  5. server 172.16.1.7:8082;
  6. server 172.16.1.7:8083;
  7. }
  8. #proxy_cache存放缓存临时文件
  9. #levels 按照两层目录分级
  10. #keys_zone 开辟空间名, 10m:开辟空间大小, 1m可存放8000key
  11. #max_size 控制最大大小, 超过后Nginx会启用淘汰规则
  12. #inactive 60分钟没有被访问缓存会被清理
  13. #use_temp_path 临时文件, 会影响性能, 建议关闭
  14. proxy_cache_path /soft/cache levels=1:2 keys_zone=code_cache:10m max_size=10g inactive=60m use_temp_path=off;
  15. server {
  16. listen 80;
  17. server_name cache.bgx.com;
  18. #proxy_cache 开启缓存
  19. #proxy_cache_valid 状态码200|304的过期为12h, 其余状态码10分钟过期
  20. #proxy_cache_key 缓存key
  21. #add_header 增加头信息, 观察客户端respoce是否命中
  22. #proxy_next_upstream 出现502-504或错误, 会跳过此台服务器访问下台
  23. location / {
  24. proxy_pass http://cache;
  25. proxy_cache code_cache;
  26. proxy_cache_valid 200 304 12h;
  27. proxy_cache_valid any 10m;
  28. add_header Nginx-Cache "$upstream_cache_status";
  29. proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
  30. include proxy_params;
  31. }
  32. }

3.客户端测试

  1. #第一次访问无法命中
  2. [root@lb01 ~]# curl -s -I http://cache.bgx.com/url3.html|grep "Nginx-Cache"
  3. Nginx-Cache: MISS
  4. #第二次访问命中
  5. [root@lb01 ~]# curl -s -I http://cache.bgx.com/url3.html|grep "Nginx-Cache"
  6. Nginx-Cache: HIT

4.缓存如何清理

如何清理proxycache代理的缓存
_1.使用rm删除已缓存数据

  1. [root@lb01 ~]# rm -rf /soft/cache/*
  2. [root@lb01 ~]# curl -s -I http://cache.bgx.com/url3.html|grep "Nginx-Cache"
  3. Nginx-Cache: MISS

2.通过ngx_cache_purge扩展模块清理, 需要编译安装Nginx

  1. #建立对应目录
  2. [root@lb01 ~]# mkdir /soft/src
  3. [root@lb01 ~]# cd /soft/src
  4. #下载Nginx包
  5. [root@lb01 ~]# wget http://nginx.org/download/nginx-1.12.2.tar.gz
  6. [root@lb01 ~]# tar xf nginx-1.12.2.tar.gz
  7. #下载ngx_cache_purge
  8. [root@lb01 ~]# wget http://labs.frickle.com/files/ngx_cache_purge-2.3.tar.gz
  9. [root@lb01 ~]# tar xf ngx_cache_purge-2.3.tar.gz
  10. #编译Nginx
  11. [root@lb01 ~]# cd nginx-1.12.2/ && ./configure \
  12. --prefix=/server/nginx --add-module=../ngx_cache_purge-2.3 \
  13. --with-http_stub_status_module --with-http_ssl_module
  14. [root@lb01 ~]# make && make install

3.增加清理缓存的location,配置如下内容

  1. [root@lb01 ~]# cat /etc/nginx/conf.d/proxy_cache.conf
  2. upstream cache {
  3. server 172.16.1.7:8081;
  4. server 172.16.1.7:8082;
  5. server 172.16.1.7:8083;
  6. }
  7. proxy_cache_path /soft/cache levels=1:2 keys_zone=code_cache:10m max_size=10g inactive=60m use_temp_path=off;
  8. server {
  9. listen 80;
  10. server_name cache.bgx.com;
  11. location / {
  12. proxy_pass http://cache;
  13. proxy_cache code_cache;
  14. proxy_cache_valid 200 304 12h;
  15. proxy_cache_valid any 10m;
  16. add_header Nginx-Cache "$upstream_cache_status";
  17. proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
  18. include proxy_params;
  19. }
  20. }
  21. location ~ /purge(/.*) {
  22. allow 127.0.0.1;
  23. allow 10.0.0.0/24;
  24. deny all;
  25. proxy_cache_purge code_cache $host$1$is_args$args;
  26. }
  27. # 检测配置重新加载
  28. [root@nginx conf.d]# /server/nginx/sbin/nginx -t
  29. [root@nginx conf.d]# /server/nginx/sbin/nginx -s reload

4.使用浏览器访问建立缓存
06.Nginx代理缓存服务 - 图5
5.通过访问purge/url地址,删除对应的缓存
06.Nginx代理缓存服务 - 图6
6.再次刷新就会因为缓存内容已清理,而出现404错误
06.Nginx代理缓存服务 - 图7

5.指定页面不缓存

1.如何配置指定部分页面不进行proxy_Cache缓存

  1. [root@lb01 ~]# cat /etc/nginx/conf.d/proxy_cache.conf
  2. upstream cache{
  3. server 172.16.1.7:8081;
  4. server 172.16.1.7:8082;
  5. server 172.16.1.7:8083;
  6. }
  7. proxy_cache_path /soft/cache levels=1:2 keys_zone=code_cache:10m max_size=10g inactive=60m use_temp_path=off;
  8. server {
  9. listen 80;
  10. server_name cache.bgx.com;
  11. #如果请求文件如下,则设定nocache为1
  12. if ($request_uri ~ ^/(url3|login|register|password)) {
  13. set $nocache 1;
  14. }
  15. location / {
  16. proxy_pass http://cache;
  17. proxy_cache code_cache;
  18. proxy_cache_valid 200 304 12h;
  19. proxy_cache_valid any 10m;
  20. proxy_cache_key $host$uri$is_args$args;
  21. proxy_no_cache $nocache $arg_nocache $arg_comment; #不缓存变量为nocache
  22. proxy_no_cache $http_pargma $http_authorization; #不缓存http参数以及http认证
  23. add_header Nginx-Cache "$upstream_cache_status";
  24. proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
  25. include proxy_params;
  26. }
  27. }
  28. #先清理所有缓存
  29. [root@nginx ~]# rm -rf /soft/cache/*
  30. #无论如何请求url3都无法命中
  31. [root@nginx ~]# curl -s -I http://192.168.69.112/url3.html|grep "Nginx-Cache"
  32. Nginx-Cache: MISS
  33. [root@nginx ~]# curl -s -I http://192.168.69.112/url3.html|grep "Nginx-Cache"
  34. Nginx-Cache: MISS
  35. [root@nginx ~]# curl -s -I http://192.168.69.112/url3.html|grep "Nginx-Cache"
  36. Nginx-Cache: MISS

6.缓存日志记录

通过日志记录proxy_cache命中情况与对应url
1.修改nginx的log_format格式,增加”$upstream_cache_status”,该变量包含如下几种状态

MISS 未命中,请求被传送到后端 HIT 缓存命中,通过缓存返回数据 EXPIRED 缓存已经过期请求被传送到后端 UPDATING 正在更新缓存,将使用旧的应答 STALE 后端将得到过期的应答

  1. [root@lb01 ~]# vim /etc/nginx/nginx.conf
  2. http {
  3. log_format main '$http_user_agent' '$request_uri' '$remote_addr - $remote_user [$time_local] "$request" '
  4. '$status $body_bytes_sent "$http_referer" '
  5. '"$http_user_agent" "$http_x_forwarded_for"' '"$upstream_cache_status"';
  6. }

2.在server标签中添加对应的access日志

  1. server {
  2. ...
  3. access_log /var/log/nginx/proxy_cache.log main;
  4. ...
  5. }

3.使用curl访问, 最后检查日志命令情况

  1. [root@lb01 ~]# tail /var/log/nginx/proxy_cache.log
  2. 10.0.0.1 - - [19/Apr/2018:11:48:43 -0400] "HEAD /url3.html HTTP/1.1" 200 0 "-" "curl/7.29.0" "-""MISS"
  3. 10.0.0.1 - - [19/Apr/2018:11:48:45 -0400] "HEAD /url2.html HTTP/1.1" 200 0 "-" "curl/7.29.