当前位置: 首页 > news >正文

Nginx系列-负载均衡

文章目录

  • Nginx系列-负载均衡
    • 1. 负载均衡基础
      • 1.1 负载均衡定义
      • 1.2 Nginx负载均衡原理
    • 2. 负载均衡策略
      • 2.1 轮询(Round Robin)
      • 2.2 加权轮询(Weighted Round Robin)
      • 2.3 IP哈希(IP Hash)
      • 2.4 最少连接(Least Connections)
      • 2.5 加权最少连接(Weighted Least Connections)
    • 3. 负载均衡策略验证

Nginx系列-负载均衡

1. 负载均衡基础

1.1 负载均衡定义

负载均衡是指将网络请求分散到多个服务器或网络节点上,以实现资源的优化使用和提高系统的响应速度。它不仅可以缓解单台服务器的压力,还可以提高系统的整体可用性和容错能力。

1.2 Nginx负载均衡原理

Nginx通过其内置的upstream模块来实现负载均衡。该模块允许你定义一组后端服务器,并根据一定的策略将客户端请求转发到这些服务器上。Nginx支持多种负载均衡策略,包括轮询、IP哈希、最少连接数等。

2. 负载均衡策略

Nginx支持多种负载均衡策略,以下是几种常用的策略:

2.1 轮询(Round Robin)

轮询是Nginx默认的负载均衡策略。它按照定义的服务器列表顺序逐个分配请求,循环往复。适用于服务器性能相当的情况。

upstream myUpstream {server backend1.example.com;server backend2.example.com;
}server {location / {proxy_pass http://myUpstream;}
}

2.2 加权轮询(Weighted Round Robin)

根据服务器的权重值分配请求,权重越高的服务器将获得更多的请求。通过给不同服务器设置不同的权重,可以合理分配负载,更好地利用服务器资源。

upstream myUpstream {server backend1.example.com weight=3;server backend2.example.com weight=1;
}server {location / {proxy_pass http://myUpstream;}
}

2.3 IP哈希(IP Hash)

根据客户端的IP地址进行哈希计算,将相同IP的请求始终分发到同一台后端服务器上。这样可以保证来自同一客户端的请求都会被发送到同一服务器,适用于需要会话保持或缓存一致性的应用场景。

upstream myUpstream {ip_hash;server backend1.example.com;server backend2.example.com;
}server {location / {proxy_pass http://myUpstream;}
}

2.4 最少连接(Least Connections)

该策略将请求发送给当前连接数最少的服务器。通过动态地追踪每个服务器的连接数,将请求分发给连接最少的服务器,以实现负载均衡。适用于处理连接时长不一致的场景,如长连接和短连接混合的情况。

upstream myUpstream {least_conn;server backend1.example.com;server backend2.example.com;
}server {location / {proxy_pass http://myUpstream;}
}

2.5 加权最少连接(Weighted Least Connections)

为每台服务器分配权重,并按照最少连接数进行负载均衡

upstream myUpstream {least_conn;server backend1.example.com weight=3;server backend2.example.com weight=1;
}server {location / {proxy_pass http://myUpstream;}
}

3. 负载均衡策略验证

配置如下:

#user  nobody;
worker_processes  1;
events {worker_connections  1024;
}
http {include       mime.types;default_type  application/octet-stream;sendfile        on;keepalive_timeout  65;upstream my_upstream {least_conn;server 192.168.10.116:8084;server 192.168.10.116:8085;}server {listen       80;server_name  localhost;location / {root   /usr/share/nginx/html;index  index.html index.htm;try_files $uri $uri/ /index.html;error_page 404 index.html;}#接口路径匹配location /api {proxy_pass http://my_upstream;}error_page   500 502 503 504  /50x.html;location = /50x.html {root   html;}}
}

配置好之后启动nginx,结果呕吼。。。

开始排查之路:

  1. 明确400错误是什么

HTTP 400 错误,也被称为“Bad Request”错误,是一个HTTP协议标准的响应状态码。它表示服务器无法理解或不能处理客户端发送的请求。这通常意味着请求的格式有误,或者请求中包含了服务器无法理解的参数。

  1. 查看nginx的日志,也没有看出什么问题,试着百度一下: nginx upstream 400,效果还不错,一共有两种解决方案,一种是设置请求头,一种是upstream的名称不要包含下划线,挨个验证呗

解决方案验证:

  1. upstream的名称不要包含下划线,修改upstream的名称
myUpstream

重启nginx,结果成功解决

  1. 设置请求头
proxy_set_header Host $host;

重启nginx,结果成功解决

  1. 原因总结

Nginx 的 upstream 名称带有下划线时出现 400 错误,主要原因与 HTTP 协议的规范有关。

在 HTTP 协议中,规范建议域名和其他标识符应该遵循某些规则。具体到 Nginx 的 upstream 名称,下划线 _ 并不是一个被广泛接受的字符。虽然 Nginx 对此的支持有所变化,但在某些版本或配置中,下划线可能会导致解析或处理问题。

特别说明: 关于这个的原因我也不太确定,我只是提供了我认可的一种解释

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 思科静态路由配置1
  • 实训日记day27
  • 热搜|“月薪4300一个月的存钱计划”,普通人如何实现财富自由?
  • C:每日一题:单身狗
  • 汇昌联信做拼多多店铺如何运营?
  • 微信小程序 for,if语法 事件对象,事件传参
  • 岗位信息采集全攻略:两种方法快速获取招聘信息
  • Mariadb数据库本机无密码登录的问题解决
  • Go语言排序艺术:sort包的精妙运用
  • 数据集与数据库:有什么区别?
  • C++ 之动手写 Reactor 服务器模型(一):网络编程基础复习总结
  • 浅谈C语言位段
  • springsecurity的学习(四):实现授权
  • 如何使用Wireshake解密Wi-Fi QoS Data报文?
  • 通过python搭建文件传输服务器;支持多台电脑之间互相传输文件(支持局域网或广域网)(应该也能用于虚拟机和宿主机之间)
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • android 一些 utils
  • CEF与代理
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • Golang-长连接-状态推送
  • IP路由与转发
  • java2019面试题北京
  • LintCode 31. partitionArray 数组划分
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • mysql中InnoDB引擎中页的概念
  • Spring框架之我见(三)——IOC、AOP
  • tweak 支持第三方库
  • v-if和v-for连用出现的问题
  • Vue2.0 实现互斥
  • vue脚手架vue-cli
  • 构建工具 - 收藏集 - 掘金
  • 基于web的全景—— Pannellum小试
  • 基于遗传算法的优化问题求解
  • 来,膜拜下android roadmap,强大的执行力
  • 力扣(LeetCode)21
  • 前端技术周刊 2019-01-14:客户端存储
  • 王永庆:技术创新改变教育未来
  • 白色的风信子
  • 分布式关系型数据库服务 DRDS 支持显示的 Prepare 及逻辑库锁功能等多项能力 ...
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • ​比特币大跌的 2 个原因
  • #QT(智能家居界面-界面切换)
  • (4)事件处理——(7)简单事件(Simple events)
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (ZT) 理解系统底层的概念是多么重要(by趋势科技邹飞)
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (力扣题库)跳跃游戏II(c++)
  • (三分钟)速览传统边缘检测算子
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .mkp勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET Core日志内容详解,详解不同日志级别的区别和有关日志记录的实用工具和第三方库详解与示例
  • .Net Memory Profiler的使用举例
  • .xml 下拉列表_RecyclerView嵌套recyclerview实现二级下拉列表,包含自定义IOS对话框...
  • // an array of int
  • [AR Foundation] 人脸检测的流程