首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >​Nginx路径魔术师:一个URL访问多目录的黑科技​ ​**— nginx实战命名location实现跨目录链式文件查找**​

​Nginx路径魔术师:一个URL访问多目录的黑科技​ ​**— nginx实战命名location实现跨目录链式文件查找**​

作者头像
Python运维开发
发布2025-09-29 14:15:37
发布2025-09-29 14:15:37
6500
代码可运行
举报
文章被收录于专栏:Python运维开发Python运维开发
运行总次数:0
代码可运行

在生产环境中使用时,务必先经过测试环境测试,测试通过后再上生产环境避免造成生产事故,若配置不当,可能引发性能、安全或逻辑等问题甚至造成生产事故

📢 背景:存储告急由于每个文件都提供了url地址链接,将文件迁移走肯定是不行的,如何扩容且不中断服务

随着业务快速增长,我们的文件存储服务器 /home/data/files2 磁盘使用率已飙升至 95%,触发了严重预警,准备扩容

核心需求

  • ✅ 新增一块4TB硬盘挂载至 /data2/app/files2
  • ✅ 迁移部分历史文件到新盘
  • ✅ 文件无论放在哪里原有访问URL不能变(如 http://a.域名.com/files2/a.txt
  • ✅ 不能让客户端有访问波动
  • ✅ 不能影响未迁移文件的正常访问
  • ✅ 支持未来持续横向扩展
  • 不重启服务、不改代码、不停机迁移

🔧 方案:Nginx智能路由实现无缝扩容

我们采用 主备式多路径存储架构,利用Nginx的 try_files 和命名location功能,实现:“先查旧盘,找不到自动查新盘,用户端完全无感”

使用技术 nginx命名location

代码语言:javascript
代码运行次数:0
运行
复制
示例 
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

代码语言:javascript
代码运行次数:0
运行
复制
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

代码语言:javascript
代码运行次数:0
运行
复制
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;
}
代码语言:javascript
代码运行次数:0
运行
复制

🔍 配置解析:

1. 主入口location

nginx

代码语言:javascript
代码运行次数:0
运行
复制
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
代码语言:javascript
代码运行次数:0
运行
复制

# 重新加载配置
nginx -s reload

# 迁移后验证

代码语言:javascript
代码运行次数:0
运行
复制
#迁移一个文件到新目录
mv  2023-01-video.png /data2/app/files2/
#验证访问这个文件是否还能访问的到
curl -I http://a.domain.com/files2/2023-01-video.png

方案优势总结

优势

说明

零代码改动

程序仍写入原目录,无需任何修改

URL永久有效

业务链接地址不变

客户端无感知

体验无缝

易扩展

可扩展数多存储节点

安全可控

无需开放额外端口或服务

代码语言:javascript
代码运行次数:0
运行
复制

结语

存储扩容不应成为业务瓶颈。通过Nginx的 try_files + named location 机制,实现了:“程序不改、URL不变、迁移无感、扩展灵活”

适合系统做低成本、高可用的存储横向扩容。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-08-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python运维开发 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 📢 背景:存储告急由于每个文件都提供了url地址链接,将文件迁移走肯定是不行的,如何扩容且不中断服务?
  • 🔧 方案:Nginx智能路由实现无缝扩容
    • ✅ 实现目标架构流程图
  • 🛠️ 实战配置:
    • 新增一块盘的情况
    • 新增多块盘的情况
  • 🔍 配置解析:
    • 1. 主入口location
    • # 迁移后验证
  • 方案优势总结
  • 结语
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档