Nginx负载均衡配置、流量分配

news/2025/3/14 19:31:19/文章来源:https://www.cnblogs.com/star8521/p/18772743

upstream指令的参数


upstream myserver {server localhost:8001 down;server localhost:8002 backup;server localhost:8003 max_conns=200 max_fails=3 fail_timeout=10;
}
max_conns:限制最大同时连接数 down:服务不可用,禁止访问此服务 backup:备用机,只有在其他服务器无法访问的时候才能访问到,不适用于hash负载均衡、随机负载均衡 max_fails:表示失败几次,则标记此服务不可用,默认值1 fail_timeout:在fail_timeout设置的时间段内,请求失败max_fails次后标记此服务不可用。fail_timeout默认值10。

负载均衡策略

轮循

按先后顺序逐个转发到各个服务。

upstream myserver {server localhost:8001;server localhost:8002;server localhost:8003;
}

加权轮循

轮循upstream内的服务,按配置的权重比例分配请求。

upstream myserver {# weight设置权重server localhost:8001 weight=1;server localhost:8002 weight=5;server localhost:8003 weight=2;
}

ip哈希

根据客户端的ip地址计算出一个哈希值,根据哈希值不同将请求转发到不同的服务上,来自同一个ip的请求总是被分配到同一的服务上。

upstream myserver {ip_hash;server localhost:8001;server localhost:8002;server localhost:8003;
}

uri哈希

根据请求的uri计算哈希值,根据哈希值不同将请求转发到不同的服务上,相同uri的请求总是被分配到同一个服务上。

upstream myserver {hash $request_uri;server localhost:8001;server localhost:8002;server localhost:8003;
}

最少连接

将请求分配到连接最少的服务上。

upstream myserver {least_conn;server localhost:8001;server localhost:8002;server localhost:8003;
}

随机

将请求随机转发。

upstream myserver {random;server localhost:8001;server localhost:8002;server localhost:8003;
}

流量分配

Cookie

我们希望根据用户的身份来决定他们是否接入新版本。这时,可以通过浏览器的 Cookie 来实现基于用户的新版本发布。例如,我们在应用中设置了一个名为 is_v2 的 Cookie,标记用户是否参与新版本的新版本测试。

upstream v1server {server localhost:8001;
}
upstream v2server {server localhost:8101;
}
server {listen 80;server_name example.com;location / {if ($http_cookie ~* "is_v2=1") {proxy_pass http://v2server;}proxy_pass http://v1server;}
}
在上面的配置中,如果用户的 Cookie 中有 is_v2=1 的标记,Nginx 会将该用户的请求路由到新版本的服务(localhost:8101);否则,用户的请求会继续访问旧版本的服务(localhost:8001)。这种方式适合用于定向测试和用户分组。

请求头

根据请求中的用户 ID 判断是否将请求路由到新版本环境。这可以通过 Nginx 的 Lua 模块和 Redis 来实现。

upstream v1server {server localhost:8001;
}
upstream v2server {server localhost:8101;
}
server {listen 80;server_name example.com;location / {access_by_lua_block {local redis = require "resty.redis"local red = redis:new()local ok, err = red:connect("redis_host", redis_port)if not ok thenngx.log(ngx.ERR, "failed to connect to Redis: ", err)ngx.exit(500)endlocal user_id = ngx.req.get_headers()["X-User-ID"]local is_v2 = red:get("v2:" .. user_id)if is_v2 == "1" thenngx.var.upstream = "v2server"end}proxy_pass http://v1server;}
}
在上面的示例中,我们连接到 Redis,并根据请求中的用户 ID 判断是否将请求路由到新版本环境。ngx.var.upstream 变量用于动态设置上游地址,从而实现新版本环境的路由。

请求参数

根据请求中的某个参数值决定路由到哪个版本。

upstream myserver {server localhost:8000;
}
upstream v1server {server localhost:8001;
}
upstream v2server {server localhost:8101;
}
server {listen 80;server_name example.com;location / {set $group "myserver";if ($query_string ~* "isv2=1") {set $group v2server;}if ($query_string ~* "isv2=0") {set $group v1server;}proxy_pass http://$group;}
}
在上面的配置中,我们根据请求参数 isv2 的值来决定路由到哪个版本。如果参数值为 1,则路由到v2版本;如果参数值为 0,则路由到v1版本,默认路由到默认服务。
来源:https://www.iwmyx.cn/nginxfzjhpz.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/898822.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sqlserver 的视图创建

首先,什么是视图?视图是一种数据库对象,是从一个或者多个数据表或视图中导出的虚表,视图的结构和数据是对数据表进行查询的结果,只存放视图的定义,不存放视图对应的数据; 其结构和和数据是建立在对表的查询基础上,故表中的数据发生变化,从视图中查询出的数据也随之改变…

day:21 python——判断语句

一.if语句 (1)单分支: 格式: if 判断条件: 执行语句块 else: 执行语句块2 备注:判断条件 if中可以使用比较运算符,<,!=,==,>=,<=在学习自动化中也可以用if语句断言, 案例1: a=10 if a != 10: print("你中奖了") else: print("谢谢惠顾"…

clickhouse 开启认证

配置文件说明 默认路径:/etc/clickhouse-server/users.xml 密码存储类型 明文密码(不推荐) <password>qwerty</password> <!-- 直接明文存储 --> SHA256 哈希 <password_sha256_hex>5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d15…

二分查找--java进阶day06

1.二分查找 https://kdocs.cn/l/ciMkwngvaWfz?linkname=150996908 二分查找:每一次查找都从中间的元素查起,根据比较的大小来折半,以此类推,直到最后找到该数2.二分查找的前提 确保查找的数组是排好序的数组,否则就会出错 如下图,假设我们要找的是200,箭头指向88,发现…

Fastjson 和Jackson 兼容性问题

起因是因为java类里面多层嵌套验证发现APIFOX调用接口验证无法生效 发现是因为没有赋值嵌套类 经过查看属性填充的源码,requestbody传参,用的是Fastjson的注解但是走到了AbstractJackson2HttpMessageConverter类的readJavaType方法 一查发现可能有不兼容的问题,Jackson 需要…

modelsim保存波形图为图片报错:image file format bmp is unknown

在波形窗口依次点击 File-->Export-->Image 如果版本低于2020.2,会报错:解决方案为: 在命令框输入:package require Img 解决方案来自Why cant I export the wave image in bmp format in the ModelSim-Intel FPGA Edition and Questa-Intel FPGA Edition simulator?…

第十二课(2024年)基准测试与评估

来看一下讲师认为的理想的开发过程Deploy的Absolute的意思:部署阶段的评测指标是绝对的,之前的阶段都是从若干个模型中选择最好的,但最后一个阶段就只剩下一个模型了,我们必须要让这个模型的准确率达到一个设定的绝对阈值 Publish的Standardized和Reproducible:标准化和可…

【向量模型】 开源通用向量模型BGE (BAAI General Embedding)

BGE(BAAI General Embedding)是北京智源人工智能研究院(BAAI)推出的开源文本向量模型, 专门用于将文本转换为高维向量表示(即 Embedding),其核心目标是提升文本检索、语义匹配等任务的性能。1. BGE 的核心特点 总结 BGE 是专为检索任务优化的开源 Embedding 模型,优…

根据前序遍历和后序遍历计数二叉树

我们知道,对于一个二叉树,如果我们我们知道他的前(或后)序遍历和中序遍历,那就可以直接构造还原出完整的二叉树。中序遍历很重要。 那么给定一个树的前序遍历和后序遍历,能不能构造出这个树呢?一般是不行的,参考往期文章 https://www.cnblogs.com/ofnoname/p/16864200.…

使用Micrometer与prometheus集成监控jvm

1.简介Micrometer 是一个用于收集和报告指标的 Java 库,广泛用于 Spring Boot 和其他 Java 应用。它提供了对系统各项资源的监控支持,包括但不限于 JVM、内存、垃圾回收、线程池、HTTP 请求 等。Micrometer 支持与多种监控系统的集成,例如 Prometheus、InfluxDB、Datadog 等…

3.14 二重积分

1 1.1 概念引入1.2 分、匀、和、均 分割:把XOY平面分割成若干个小区域,相应的,把柱体分割成n个小的曲顶柱体 取近似:取某一小块的一个点,通过函数关系确定此点的高,体积就等于此处的面积*高 作和:把每一小块的体积加起来,作为曲顶柱体的体积 取极限:设λ,λ趋近于0,…

Livox MID-70连接及使用

一、Livox MID-70连接及使用 参考链接 1.ubuntu18.04安装下载 2.Ros下载 3.Livox_viewer下载 去官网下载livox_viewer,Windows和Linux版本都有。livox_viewer不需要SDK和ros_driver即可使用。 Ps:这里我们选择livox viewer1,不要选择版本2,否则可能面临一个硬件和驱动跟不上…