无RAID多硬盘下载服务器Nginx/Varnish静态热点缓存方案咨询
静态文件缓存同服务器部署方案(Nginx实现,优先RAM缓存)
不推荐使用Varnish:Varnish默认基于内存缓存,磁盘缓存需额外配置stevedore模块,对500MB~4GB级大文件的缓存稳定性不如Nginx,还会额外占用系统资源,用原生Nginx的proxy_cache模块即可实现所有需求,无需引入额外组件。
前置准备
- 11块数据盘统一挂载到
/data/disk1~/data/disk11,缓存盘(第12块)挂载到/data/cache_disk - 用tmpfs挂载RAM缓存路径,大小分配30G(128G内存剩余留作系统页缓存和进程占用),执行命令:
mount -t tmpfs -o size=30g tmpfs /dev/shm/nginx_ram_cache
如需开机自动挂载,将上述规则写入/etc/fstab即可。
问题1:高频访问数据自动缓存到第12块盘实现方案
Nginx的proxy_cache模块原生支持冷热数据自动淘汰,无需手动解析access.log统计热度,配置规则即可实现1小时内热点文件存RAM、24小时内热点文件存缓存盘的需求:
第一步:全局缓存配置(http块下添加)
http { # 基础性能优化,适配大文件下载场景 sendfile on; tcp_nopush on; aio on; directio 10m; # 大于10M的文件用直接IO,不占用系统页缓存 proxy_max_temp_file_size 4g; # 支持最大4G单文件缓存 # RAM层缓存配置:缓存1小时内访问的热点文件 proxy_cache_path /dev/shm/nginx_ram_cache levels=1:2 keys_zone=ram_cache:200m # 缓存索引内存占用,200m可存约20万个文件索引 max_size=30g inactive=1h # 1小时未访问的文件自动从RAM缓存清理 use_temp_path=off; # 磁盘层缓存配置(第12块盘):缓存24小时内访问的热点文件 proxy_cache_path /data/cache_disk/nginx_cache levels=1:2 keys_zone=disk_cache:1g # 1G内存可存约100万个文件索引 max_size=7t # 8T盘留1T冗余 inactive=24h # 24小时未访问的文件自动从缓存盘清理 use_temp_path=off; # 本地回源上游,走loopback网卡无带宽损耗 upstream local_data_source { server 127.0.0.1:8080; } }
第二步:配置本地数据盘源站服务(仅本地监听)
server { listen 127.0.0.1:8080; server_name _; root /data; # 按实际路径规则匹配11块数据盘的文件 location / { try_files $uri =404; } }
第三步:对外服务配置
所有对外IP都绑定到该server,同一个子域名绑定多IP后DNS轮询的请求都会走统一的缓存逻辑:
server { listen 192.168.1.10:80; # 原数据盘对应IP listen 192.168.1.11:80; # 缓存盘对应IP server_name subdomain1.xyzwebsite.com; # 按实际子域名修改 location / { # 优先命中RAM缓存,未命中自动查磁盘缓存 proxy_cache ram_cache; proxy_cache_valid 200 24h; # 正常下载的文件缓存24小时 proxy_cache_lock on; # 同个文件仅第一个请求回源,避免缓存击穿 proxy_cache_background_update on; # 缓存过期时后台异步更新,不阻塞用户请求 # 两级缓存都未命中时自动回源到本地数据盘 proxy_pass http://local_data_source; # 可选:返回缓存状态便于调试,生产环境可删除 add_header X-Cache-Status $upstream_cache_status; } }
配置后Nginx会自动将24小时内有访问的文件写入缓存盘,超过24小时无访问的文件自动清理,完全符合高频数据缓存的需求。如果需要自定义热度规则,可写shell脚本每日统计access.log中访问次数超过阈值的文件,手动拷贝到缓存盘路径即可。
问题2:缓存盘无文件时的回源实现
无需额外配置,上述方案已经自动覆盖该场景:
- 无论用户请求被DNS轮询分配到哪个IP,Nginx都会先查RAM缓存,再查磁盘缓存,两级缓存都未命中时自动回源到本地11块数据盘的服务
- 回源走本地loopback网卡,不会占用公网带宽,延迟在毫秒级,用户无感知
- 回源拉取的文件会自动写入两级缓存,后续相同请求直接从缓存返回,不需要再次回源
如果需要明确区分数据盘IP和缓存盘IP的流量,也可以拆分两个server配置:
# 数据盘IP对应服务:直接读本地数据盘,不走缓存 server { listen 192.168.1.10:80; server_name subdomain1.xyzwebsite.com; root /data; location / { try_files $uri =404; } } # 缓存盘IP对应服务:走两级缓存+自动回源 server { listen 192.168.1.11:80; server_name subdomain1.xyzwebsite.com; location / { proxy_cache ram_cache; proxy_cache_valid 200 24h; proxy_pass http://127.0.0.1:8080; } }
内容的提问来源于stack exchange,提问作者Muhammad Arsalan Siddiqui
相关产品推荐
相关产品推荐

