Nginx 缓存数据

Nginx 常用来负载均衡, 用来多个服务端反向代理内部服务器组从而获取到内部网络资源对外提供服务,
后续还有些静态资源就需要考虑多地缓存而不走直接后端流量.

常见比如网状反向服务架构, 多个对外服务Nginx同时转发到内网单机情况; 需要缓存内网资源到外部访问服务器本地, 后续资源不走内部服务器.

假设目前内网机已经部署好对外静态资源服务端, 这时候则需要在可以被对外访问得服务器上安装配置 Nginx:

1
2
# 安装好 NGINX 服务
sudo apt install -y nginx

之后这里就是假设需求: 目前需要 .mp4|.mkv|.avi|.wmv 这些视频文件十分庞大且占用流量十分多,
所以在对外服务器上需要将内网服务器的资源缓存, 并且后续超时时间设定为 6 个月才重新更新缓存.

这里编写配置来处理这方面设置即可:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
http {
# 设定 video_cache 的缓存, 路径是 /var/nginx/cache
# keys_zone 设定 key 名称和名称占用, 1m 可以存放 8000 个KEY
# max_size 设定目录最大空间
# use_temp_path 表示是否为临时文件缓存
# inactive 则是设定多久没有访问则清理缓存
proxy_cache_path /var/nginx/cache levels=1:2
keys_zone=video_cache:1024m
max_size=200g
inactive=256d
use_temp_path=off;


# 这里就是具体的服务编写
server {
# 其他访问设定, 略


# 拦截 .mp4|.mkv|.avi|.wmv 访问文件
location ~ .*\.(mp4|mkv|avi|wmv)$ {

# 内网转发的地址, 注意这里不能带 '/' 来做转发代理
proxy_pass http://10.0.0.1:8080;

# 设定缓存区
proxy_cache video_cache;

# 设定缓存锁和锁周期
proxy_cache_lock on;
proxy_cache_lock_age 200s;

# 缓存key进行md5哈希保存
proxy_cache_key $uri$is_args$args;

# 设定什么情况下进行缓存存储触发
# 状态码所有的缓存 256 天
proxy_cache_valid 200 302 256d;

# 追加代理缓存
add_header Nginx-Cache "$upstream_cache_status";

# 关闭日志
access_log off;

# 服务器连接的超时时间
proxy_connect_timeout 600;

# 连接成功后等候后端服务器响应时间
proxy_read_timeout 600;

# 后端服务器数据回传时间
proxy_send_timeout 600;

# 缓冲区的大小
proxy_buffer_size 1024k;

# 第一个参数为每个连接设置缓冲区的数量, 第二个参数为每块缓冲区的大小
proxy_buffers 4 4096k;

#其他代理转发配置
}
}
}

后续这里需要先创建缓存并授权给 Nginx 处理, 最后重启下访问服务确认是否缓存本地:

1
2
3
sudo mkdir /var/nginx/cache
sudo chown -R www-data:www-data /var/nginx/cache
sudo systemctl restart nginx.service

可以尝试访问内网的视频文件, 确认是否会在对外服务器生成缓存并且观察后续访问是否会触发访问内网模式.

需要注意因为做缓存校验和写入流程, 所以访问视频流的时候会出现首次访问卡顿的情况, 这是因为他在校验本地并落地到缓存数据,

proxy_cache_lock|proxy_cache_lock_age 必须设定好, 否则会出现无缓存的情况.