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-Since或
If-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_hdd1
和my_cache_hdd2
,split_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 字符串 ... ;