在生产环境中使用时,务必先经过测试环境测试,测试通过后再上生产环境避免造成生产事故,若配置不当,可能引发性能、安全或逻辑等问题甚至造成生产事故
随着业务快速增长,我们的文件存储服务器 /home/data/files2
磁盘使用率已飙升至 95%,触发了严重预警,准备扩容
核心需求:
/data2/app/files2
http://a.域名.com/files2/a.txt
)我们采用 主备式多路径存储架构,利用Nginx的 try_files
和命名location功能,实现:“先查旧盘,找不到自动查新盘,用户端完全无感”
使用技术 nginx命名location
示例
location @name { ... }
官方文档原文是这样解释的:The “@” prefix defines a named
location. Such a location is not used for a regular
request processing, but instead used for request redirection.
They cannot be nested, and cannot contain nested locations.
大概意思:“@”前缀定义了一个命名位置。这样的位置不用于常规请求处理,而是用于请求重定向。它们不能嵌套,也不能包含嵌套位置。
nginx
server { listen 80;
server_name a.域名.com;
# 主存储位置(旧硬盘)
location ~* ^/files2/ {alias /home/data/files2/;
try_files $uri @newfile_storage;
}
# 备用存储位置(新硬盘)
location @newfile_storage {
alias /data2/app/files2/;
try_files $uri =404;
}
}
nginx
location ~*^/files2/ {
root /home/data;
try_files $uri $uri/@filestorage1;
}
# 多级目录查找
location @filestorage1 {
alias /data2/app/files2/1/;
try_files $uri $uri/@filestorage2;
}
location @filestorage2 {
alias /data2/app/files2/2/;
try_files $uri $uri/@filestorage3;
}
location @filestorage3 {
alias /data3/app/files3/;
try_files $uri $uri /=404;
}
nginx
location ~* ^/files2/ {
alias /home/data/files2/;
try_files $uri @newfile_storage;
}
~* ^/files2/:不区分大小写匹配/files2/路径
alias:映射到物理路径
try_files:优先查找主存储,找不到则跳转命名位置径@
newfile_storage
2. 命名location(新存储)
ngin
location @newfile_storage {
alias /data2/app/files2/;
try_files $uri =404;
}
@newfile_storage:内部标记,外部无法直接访问
=404:最终未找到返回404
# 重新加载配置
nginx -s reload
# 迁移后验证
#迁移一个文件到新目录
mv 2023-01-video.png /data2/app/files2/
#验证访问这个文件是否还能访问的到
curl -I http://a.domain.com/files2/2023-01-video.png
优势 | 说明 |
---|---|
零代码改动 | 程序仍写入原目录,无需任何修改 |
URL永久有效 | 业务链接地址不变 |
客户端无感知 | 体验无缝 |
易扩展 | 可扩展数多存储节点 |
安全可控 | 无需开放额外端口或服务 |
存储扩容不应成为业务瓶颈。通过Nginx的 try_files
+ named location
机制,实现了:“程序不改、URL不变、迁移无感、扩展灵活”
适合系统做低成本、高可用的存储横向扩容。