nginx集群中按照url规则指定节点访问


在项目开发中,需要指定特定节点进行访问。例如,在处理图片上传图片预览时,由于没有单独搭建文件服务器,需要将集群中的某个节点指定为图片服务器。用户上传的图片必须存储在指定节点,访问时也必须通过该节点。否则,负载均衡到其他节点会导致 404 错误。为了解决这个问题,可以通过配置Nginx来实现访问控制

C# 全选
upstream allNode {
	server 127.0.0.1:5006 weight=10;
	server 127.0.0.1:5008 weight=10;
}
upstream imageNode {
	server 127.0.0.1:5006 weight=10;
}

map $uri $use_image_node {
    default 0;
    ~*/images/$ 1;
}


map $use_image_node $backend {
    0 http://allNode;
    1 http://imageNode;
}

server {
  listen 9999;
  root D:\\webs\\demo\\pc;
  index index.html;
  location / {
    try_files $uri $uri/ /index.html;
  }

  gzip on;
  gzip_buffers 32 4K;
  gzip_comp_level 6;
  gzip_min_length 100;
  gzip_proxied any;
  gzip_types application/json text/plain text/xml text/css;
  gzip_vary on;
  gzip_http_version   1.0;
  gzip_disable "MSIE [1-6]\.(?!.*SV1)";

  # 设置上传文件的大小
  client_max_body_size 100m;

  
  # 后端服务
  location /server/ {
    proxy_read_timeout 2400;  # 秒 20分钟 请求超时
    # 添加头部信息
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-NginX-Proxy true;
    # This is necessary to pass the correct IP to be hashed
    real_ip_header X-Real-IP;
    proxy_connect_timeout 300;
	
    # 使用 rewrite 去掉 /server 前缀  (?i)代表忽略大小写
    rewrite ^(?i)/server(/.*)$ $1 break;
    # 使用动态变量转发请求
    proxy_pass $backend;
  }
}

以下是基于该 Nginx 配置文件的路由转发逻辑详细说明:


1. Upstream 配置

  • upstream allNode

    • 定义了一个名为 allNode 的后端服务器组。
    • 包含两个节点:
      • 127.0.0.1:5006,权重为 10。
      • 127.0.0.1:5008,权重为 10。
    • 用于处理一般的请求负载。
  • upstream imageNode

    • 定义了一个名为 imageNode 的后端服务器组。
    • 包含一个节点:
      • 127.0.0.1:5006,权重为 10。
    • 专门处理图片相关的请求。

2. 动态路由变量

  • map $uri $use_image_node

    • 根据请求的 URI 设置变量 $use_image_node
      • 默认值为 0
      • 如果 URI 匹配正则表达式 ~*/images/$(即以 /images/ 开头的请求路径),则 $use_image_node 设置为 1
  • map $use_image_node $backend

    • 根据 $use_image_node 的值,设置后端转发目标 $backend
      • $use_image_node = 0 时,转发到 http://allNode
      • $use_image_node = 1 时,转发到 http://imageNode

3. Server 配置

  • 基本配置

    • 监听端口:9999
    • 静态文件根目录:D:\\webs\\demo\\pc
    • 默认页面:index.html
    • 如果静态文件路径不存在,使用 try_files 将请求转发到 index.html
  • Gzip 压缩

    • 启用了 Gzip 压缩以优化传输效率。
    • 配置了压缩类型、缓冲区大小、最小长度、压缩级别等。
  • 上传文件限制

    • 设置了客户端上传文件的最大大小为 100m

4. 路由转发逻辑

  • location /server/
    • 用于处理所有以 /server/ 开头的请求。

    • 超时设置

      • 读取超时时间:2400 秒(20 分钟)。
      • 连接超时时间:300 秒。
    • 请求头设置

      • 添加了多种头部信息以支持代理转发和传递真实客户端 IP。
    • 请求路径重写

      • 使用 rewrite ^(?i)/server(/.*)$ $1 break;/server/ 前缀去掉,(?i)代表忽略大小写匹配。例如:
        • 请求路径 /server/api/v1 会被重写为 /api/v1
        • 请求路径 /SERVER/api/v1 会被重写为 /api/v1。如果不添加(?i),那么这里不会被替换
    • 动态后端选择

      • 使用 proxy_pass $backend; 动态选择后端目标。
        • 如果 $use_image_node = 0,转发到 http://allNode
        • 如果 $use_image_node = 1,转发到 http://imageNode

5. 图片请求处理示例

假设以下请求路径:

  1. 普通请求

    • 请求路径:/server/api/v1/data
    • $uri 不匹配 /images/$use_image_node = 0
    • 转发到 http://allNode(负载均衡到 127.0.0.1:5006127.0.0.1:5008)。
  2. 图片相关请求

    • 请求路径:/server/images/123.jpg
    • $uri 匹配 /images/$use_image_node = 1
    • 转发到 http://imageNode(固定到 127.0.0.1:5006)。

6. 总结

通过 map 配置和动态变量 $backend,实现了请求路径的智能分流:

  • 普通请求均衡分发到 allNode
  • 图片相关请求专门转发到 imageNode,避免了因负载均衡导致的文件访问问题。

 

 

 

版权声明:本文为YES开发框架网发布内容,转载请附上原文出处连接
张国生
上一篇:ASP.NET Core 接口返回文件类型文件名中文乱码
下一篇:安装华为电脑管家
评论列表

发表评论

评论内容
昵称:
关联文章

nginx按照url规则指定节点访问
Nginx部署
nginx初始配置优化
C#URL编码
业务模块访问系统表
nginx配置指南
支付宝获取用户信息时,提示 对不起,访问出错了 E004:AUTH_REDIRECT_URL_NOT_IN_WHITE
如何在 .NET 8 服务指定端口号启动:最佳实践与动态配置
使用nuget-server搭建私有Nuget包服务器后,nginx反向代理无法下载包
nginx配置http自动重定向到https
业务模块特殊URL配置
RabbitMQ的命名规则
EF Linq查找所有子节点或者所有父节点
YESWEB业务模块指定系统表
ASP.NET MVC和ASP.NET Core MVC获取当前URL/Controller/Action
CentOS7 nginx SSL证书申请并自动续期
nginx端口转发配置
CentOS安装nginx
.net使用Linq 判断两个集合是否有交的集合类
NSwag Swagger对接口按照名称排序

联系我们
联系电话:15090125178(微信同号)
电子邮箱:garson_zhang@163.com
站长微信二维码
微信二维码