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
。
- 默认值为
- 根据请求的 URI 设置变量
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. 图片请求处理示例
假设以下请求路径:
普通请求
- 请求路径:
/server/api/v1/data
$uri
不匹配/images/
,$use_image_node = 0
。- 转发到
http://allNode
(负载均衡到127.0.0.1:5006
或127.0.0.1:5008
)。
- 请求路径:
图片相关请求
- 请求路径:
/server/images/123.jpg
$uri
匹配/images/
,$use_image_node = 1
。- 转发到
http://imageNode
(固定到127.0.0.1:5006
)。
- 请求路径:
6. 总结
通过 map
配置和动态变量 $backend
,实现了请求路径的智能分流:
- 普通请求均衡分发到
allNode
。 - 图片相关请求专门转发到
imageNode
,避免了因负载均衡导致的文件访问问题。
版权声明:本文为YES开发框架网发布内容,转载请附上原文出处连接
post 张国生