Nginx系列-负载均衡

news2024/9/23 19:20:18

文章目录

  • 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 对此的支持有所变化,但在某些版本或配置中,下划线可能会导致解析或处理问题。

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaEE----Servlet过滤器

前言 在现代Web开发中,Servlet技术是Java EE(Jakarta EE)的核心部分。随着Web应用复杂性的增加,Servlet过滤器(Filter)提供了一种灵活的方法来对请求和响应进行处理 Servlet过滤器是一种特殊的Java对象&a…

C语言钥匙迷宫2.0

目录 开头程序程序的流程图程序游玩的效果结尾 开头 大家好&#xff0c;我叫这是我58。废话不多说&#xff0c;咱们直接开始。 程序 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <string.h> #include <Windows.h> enum color {Y,B,R …

Linux 开机自动挂载共享文件设置

选择一个要共享的文件 点击确定 -> 确定 启动虚拟机 执行下面的命令 /YumSource 是我选择的共享文件夹&#xff0c;自行替换自已选择的文件夹 mkdir -p /mnt/hgfs cat >> /etc/fstab << EOF .host:/YumSource /mnt/hgfs fuse.vmhgfs-fuse allow_other defaul…

探索生成式AI在文档处理中的应用:llm Whisperer

在现代科技的快速发展中&#xff0c;生成式人工智能&#xff08;Generative AI&#xff09;正逐渐改变我们处理文档的方式。虽然许多生成式AI模型在处理文档时表现出色&#xff0c;但面对复杂文档时&#xff0c;大多数开源模型仍显得力不从心。甚至连GPT-4在某些情况下也会遇到…

性能测试-性能监控分析与调优(三)《实战-CPU瓶颈分析、内存问题分析、gc、tomcat性能调优,数据库监控-redis\mysql》

性能监控 使用命令监控 cpu瓶颈分析 top命令 在进行性能测试时使用top命令&#xff0c;界面如下 上图可以看出 - CPU 概况区&#xff1a; %Cpu(s): - us&#xff08;用户进程占用CPU的百分比&#xff09;, 和 sy&#xff08;系统进程占用CPU的百分比&#xff09; 的数…

【16】暴力递归改dp(上)

目录 一.机器人问题 二.最少硬币问题 一.机器人问题 题目&#xff1a;N表示位置1-N&#xff0c;S表示机器人开始位置&#xff0c;e表示结尾位置&#xff0c;k表示机器人必须走k步&#xff0c;问一共有多少种方法&#xff1f; 情况&#xff1a; 如果第1个位置&#xff0c;下次…

交通感知与车路协同系统-计算机毕设Java|springboot实战项目

&#x1f34a;作者&#xff1a;计算机毕设残哥 &#x1f34a;简介&#xff1a;毕业后就一直专业从事计算机软件程序开发&#xff0c;至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长&#xff1a;按照需求定制化开发项目、 源…

PHP—MySQL(PHP连接数据库)

目录 【学习目标、重难点知识】 【学习目标】 【重难点知识】 二、PHP 和 MySQL 的合作方式 三、PHP连接数据库 3.1、MySQLi拓展 ​编辑 3.2、建立与数据库的连接 &#xff08;4&#xff09;创建SQL语句 &#xff08;5&#xff09;获取结果 &#xff08;6&#xff09…

STM32(二):GPIO

GPIO(General Purpose Input Output)通用输入输出口 1.可配置为8种输入输出模式&#xff0c;引脚电平:0V~3.3V&#xff0c;部分引脚可容忍5V&#xff0c;输出模式下可控制端口输出高低电平&#xff0c;用以驱动LED、控制蜂鸣器、模拟通信协议输出时序等&#xff0c;输入模式下…

在vscode使用markdown格式、自动补齐、以及快捷键

在扩展中搜索markdown all in one&#xff0c;下载使用即可。

人工智能在网络安全中的三大支柱

人工智能 (AI) 席卷了网络安全行业&#xff0c;各种供应商都在努力将 AI 融入其解决方案中。但 AI 与安全之间的关系不仅仅在于实现 AI 功能&#xff0c;还在于攻击者和防御者如何利用该技术改变现代威胁形势。它还涉及如何开发、更新和保护这些 AI 模型。如今&#xff0c;网络…

【qt】基于tcp的服务端编写

实现服务端&#xff0c;连接后拿到客户端ip地址和端口号 ui设计 修改对应行编辑对象名&#xff0c;修改客户端ip为clientip,客户端端口号为clientport 代码实现 1.网络通信需要加network 2.包含头文件 3.定义一个QTcpserver变量&#xff0c;并初始化 4.服务端监听&#…

字符串String概述,遍历字符串

String的注意点 字符串的内容是不会发生改变的&#xff0c;它的对象在创建后不能被更改 string是Java定义好的一个类&#xff0c;定义在java.long包中&#xff0c;所以使用的时候不需要导入包。 Java程序中的所有字符串文字&#xff08;例如“abcdefg”&#xff09;&#xf…

【Go语言初探】(二)、项目文件结构和GOPATH设置

一、go语言项目文件结构 由go/bin、go/src和go/pkg三个子文件夹组成&#xff0c;见下图&#xff1a; 实际项目&#xff1a; 二、gopath路径变量设置 在项目中创建main.go文件后&#xff0c;IDE会提示设置GOPATH路径&#xff1a; 点击“configure GOPATH”&#xff0c;设置GOP…

酒项目加密封装步骤;linux查看IP地址,查看MAC地址, 查看CPU序列号

线上酒项目为例 目录 线上酒项目为例 第一步 第二步 linux查看IP地址 查看MAC地址 方法1: 方法2: 方法3&#xff1a; 查看CPU序列号 为什么不用物理机的不同虚拟机的cpu序列号是相同&#xff0c;给我们的各个系统都是相同的 第一步 在maven模块分层上进行加密&#x…

15:【stm32】时钟树

时钟树 1、时钟树1.1&#xff1a;简要的介绍1.2&#xff1a;基本结构1.2.1&#xff1a;stm32的内部结构1.2.2&#xff1a;树的关键节点1.2.3&#xff1a;系统时钟的来源 2、RCC标准库编程2.1&#xff1a;片上外设的复位与释放2.2&#xff1a;时钟系统配置2.3&#xff1a;时钟树…

算法:DFS之记忆化搜索

目录 记忆化搜索 题目一&#xff1a;不同路径 题目二&#xff1a;最长递增子序列 题目三&#xff1a;猜数字大小II 题目四&#xff1a;矩阵中的最长递增路径 记忆化搜索 说到记忆化搜索&#xff0c;首先就需要引入斐波那契数这道题&#xff0c;非常经典&#xff0c;可以很…

第44课 Scratch入门篇:无限画中画

无限画中画 故事背景: 无止境的显示一幅画。 程序原理: 利用多张基本一样的图,不停循环显示,产生视觉上的错觉,原理很简单,只是一种实现方式而已。 开始编程 1、删除预设的猫咪角色,上传以后在那个无限循环的图片,大小为 480*360 2、接下来复制造型,使用选择工具…

.net 8.0 下 Blazor 通过 SignalR 与 Winform 交互

定义一个Hub using Microsoft.AspNetCore.SignalR;namespace Beatrane.Connect.Blazor {public class DeviceHub : Hub{public async Task SendMessage(string user, string message){await Clients.All.SendAsync("ReceiveMessage", user, message);}public async …

静态分析、动态调试与重打包:去除Android APK烦人广告

最近&#xff0c;一直使用的某款APP&#xff0c;广告越来越多&#xff0c;更令人发指的是&#xff0c;广告弹框最后都变成无法关闭的形式&#xff0c;不使用会员压根没法正常使用。应用市场广大用户的评论说出了我们的心声。 虽说充会员可以免广告&#xff0c;这点小钱&#xf…