Nginx自建CDN 第三篇

前言

本篇主要讲了缓存状态的显示,当上游服务器关闭时提供缓存内容,以及提高缓存性能,跨多个硬盘拆分缓存

配置文件

先看完整的配置文件

proxy_cache_path /usr/local/nginx/caches/moec.top levels=1:2 keys_zone=laoxong:1m inactive=2h max_size=500m;
server {
 listen 80;
 listen [::]:80;
 listen 443 ssl http2;
 listen [::]:443 ssl http2;
 ssl_certificate /usr/local/nginx/conf/ssl/证书;
 ssl_certificate_key /usr/local/nginx/conf/ssl/证书Key;
 ssl_session_timeout 1d;
 ssl_session_cache builtin:1000 shared:SSL:10m;
 add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
 ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
 ssl_ciphers "TLS-CHACHA20-POLY1305-SHA256:TLS-AES-256-GCM-SHA384:TLS-AES-128-GCM-SHA256:EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+ECDSA+AES128:EECDH+aRSA+AES128:RSA+AES128:EECDH+ECDSA+AES256:EECDH+aRSA+AES256:RSA+AES256:EECDH+ECDSA+3DES:EECDH+aRSA+3DES:RSA+3DES:!MD5";

 ssl_prefer_server_ciphers on;

 ssl_stapling on;
 ssl_stapling_verify on;

 server_name 域名;
 access_log /usr/local/nginx/caches/backblazebimg.2002000.xyz_nginx.log combined;

 charset utf-8,gbk;
location / {
 proxy_ssl_name $host;
 proxy_ssl_server_name on;
 proxy_set_header Accept-Encoding "";
 proxy_pass https://域名;
 proxy_redirect off;
 proxy_set_header X-Real-IP $remote_addr;
 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 add_header laoXong-Cache-Status $upstream_cache_status;
 proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504;
 proxy_cache laoxong;
 proxy_cache_key $uri$is_args$args;
 proxy_cache_valid 200 304 30m;
 proxy_cache_valid 301 24h;
 proxy_cache_valid 500 502 503 504 0s;
 proxy_cache_valid any 1s;
 proxy_cache_min_uses 1;
 expires 12h;
 proxy_cache_lock on;
 proxy_cache_background_update on;
 }
 location ~ /purge(/.*) {
                allow              all;
                allow              127.0.0.1;
            #   deny               all;
                proxy_cache_purge laoxong $1$is_args$args;
 }
}

缓存状态的显示

配置为:add_header X-Cache-Status $upstream_cache_status;

在Header中x-cache-status后面显示的为缓存状态

返回的状态有

  • MISS - 在缓存中找不到响应,因此从原始服务器获取响应。然后缓存响应。
  • BYPASS- 响应是从原始服务器获取的,而不是从缓存中提供的,因为请求与proxy_cache_bypass指令匹配
  • EXPIRED - 缓存中的条目已过期。响应包含来自原始服务器的新内容。
  • STALE- 内容过时,因为源服务器未正确响应但proxy_cache_use_stale已配置。
  • UPDATING- 内容过时,因为条目当前正在更新以响应先前的请求,并且proxy_cache_use_stale updating已配置。
  • REVALIDATED- proxy_cache_revalidate指令已启用,NGINX验证当前缓存的内容是否仍然有效通过(If-Modified-SinceIf-None-Match`)。
  • HIT - 响应直接来自有效的缓存

提高缓存性能

proxy_cache_min_uses 规定缓存门槛,请求过多少次才缓存,不缓存低频请求,避免浪费。

proxy_cache_lock如果多个客户端求的文件不在缓存中,只有第一个这些请求是通过原始服务器的。其余请求等待满足该请求,然后从缓存中提取文件。
proxy_cache_lock_age “不能者止”,如果当前请求未能如期完成,就放行后续请求。
proxy_cache_lock_timeout 发生超时,同样放行,但不进行缓存。

跨多个硬盘拆分缓存

proxy_cache_path /path/to/hdd1 levels=1:2 keys_zone=my_cache_hdd1:10m
                 max_size=10g inactive=60m use_temp_path=off;
proxy_cache_path /path/to/hdd2 levels=1:2 keys_zone=my_cache_hdd2:10m
                 max_size=10g inactive=60m use_temp_path=off;

split_clients $request_uri $my_cache {
              50%          “my_cache_hdd1”;
              50%          “my_cache_hdd2”;
}

两个proxy_cache_path指令在两个不同的硬盘驱动器上定义了两个缓存my_cache_hdd1my_cache_hdd2split_clients 指定从一半的请求(结果50%)被缓存在my_cache_hdd1与另一半中my_cache_hdd2 $request_uri则表示使用请求URL定每个请求使用哪个缓存

其余配置

忽略Cache-Control

使用proxy_ignore_headers指令可以忽略Cache-Control(源站的缓存控制)

缓存POST请求

使用 proxy_cache_methods

proxy_cache_methods GET HEAD POST;

不使用缓存

使用proxy_cache_bypass

proxy_cache_bypass  字符串 ... ;

参考

如何配置Nginx的代理缓存

Nginx 学习笔记 (8) - 缓存加速指南 (proxy_cache)