使用nginx进行负载均衡

2023-05-16

1. nginx负载均衡介绍

nginx应用场景之一就是负载均衡。在访问量较多的时候,可以通过负载均衡,将多个请求分摊到多台服务器上,相当于把一台服务器需要承担的负载量交给多台服务器处理,进而提高系统的吞吐率;另外如果其中某一台服务器挂掉,其他服务器还可以正常提供服务,以此来提高系统的可伸缩性与可靠性。

下图为负载均衡示例图,当用户请求发送后,首先发送到负载均衡服务器,而后由负载均衡服务器根据配置规则将请求转发到不同的web服务器上。

image-20220430184503049

2. nginx负载均衡策略

以下截图为nginx官网文档

image-20220430184551926

nginx内置负载均衡策略主要分为三大类,分别是轮询、最少连接和ip hash

  • 最少连接

    请求分配给活动连接数最少的服务器,哪台服务器连接数最少,则把请求交给哪台服务器,由nginx统计服务器连接数

  • ip hash

    基于客户端ip的分配方式

2.1 轮询

以循环方式分发对应用服务器的请求,将请求平均分发到每台服务器上。

2.1.1 普通轮询方式

该方式是默认方式,轮询适合服务器配置相当,无状态且短平快的服务使用。另外在轮询中,如果服务器挂掉,会自动剔除该服务器。

http {
    # 定义转发分配规则
    upstream myapp1 {
        server srv1.com; # 要转发到的服务器,如ip、ip:端口号、域名、域名:端口号
        server srv2.com:8088;
        server 192.168.0.100:8088;
    }

    server {
        listen 80; # nginx监听的端口

        location / {
        	# 使用myapp1分配规则,即刚自定义添加的upstream节点
        	# 将所有请求转发到myapp1服务器组中配置的某一台服务器上
            proxy_pass http://myapp1; 
        }
    }
}

2.1.2 权重轮询方式

如果在 upstream 中配置的server参数后追加 weight 配置,则会根据配置的权重进行请求分发。此策略可以与least_conn和ip_hash结合使用,适合服务器的硬件配置差别比较大的情况。

# 定义转发分配规则
upstream myapp1 {
	server srv1.com weight=1; # 该台服务器接受1/6的请求量
	server srv2.com:8088 weight=2; # 该台服务器接受2/6的请求量
	server 192.168.0.100:8088 weight=3; # 该台服务器接受3/6的请求量;
}

2.2 最少连接

轮询算法是把请求平均的转发给各个后端,使它们的负载大致相同;但是,有些请求占用的时间很长,会导致其所在的后端负载较高。这种情况下,least_conn这种方式就可以达到更好的负载均衡效果,适合请求处理时间长短不一造成服务器过载的情况。

# 定义转发分配规则
upstream myapp1 {
	least_conn; # 把请求分派给连接数最少的服务器
	server srv1.com;
	server srv2.com:8088;
	server 192.168.0.100:8088;
}

2.3 ip hash

这个方法确保了相同的客户端的请求一直发送到相同的服务器,这样每个访客都固定访问一个后端服务器。如用户需要分片上传文件到服务器下,然后再由服务器将分片合并,这时如果用户的请求到达了不同的服务器,那么分片将存储于不同的服务器目录中,导致无法将分片合并,该场景则需要使用ip hash策略。

需要注意的是,ip_hash不能与backup同时使用,另外当有服务器需要剔除,必须手动down掉,此模式适合有状态服务,比如session。

# 定义转发分配规则
upstream myapp1 {
	ip_hash; # #保证每个请求固定访问一个后端服务器
	server srv1.com;
	server srv2.com:8088;
	server 192.168.0.100:8088;
}

3. nginx负载均衡搭建示例

该示例使用一台nginx作为负载均衡服务器,两台tomcat作为web服务器;可以把三个服务均在一台机器进行搭建,也可以使用虚拟机虚拟三台机器,然后进行测试。教程这里就只在一台机器进行搭建,采用默认的权重方式进行配置。

3.1 tomcat配置

将两台tomcat解压出来,配置完毕相应的端口,然后在webapps目录下创建test目录,然后在test目录中创建index.html文件,随便写入一些内容,两台tomcat中test目录下的index.html文件内容要区分开来,例如写入1111111 / 222222222,如下图所示。

image-20220430190133097

image-20220430190139573

3.2 nginx配置

首先进行nginx的安装,安装教程可以参考

https://blog.csdn.net/guo_ridgepole/article/details/124438127

安装完毕后,进入nginx目录下的conf目录,编辑 nginx.conf 文件,修改内容为在http节点下增加

upstream tomcat { # 该部分内容与 server 节点同级
	server tomcat服务的ip:tomcat服务的端口号;
	server tomcat服务的ip:tomcat服务的端口号;
}

server节点下的location /节点中,把默认的

location / {
	root   html;
	index  index.html index.htm;
}

修改为

location / {
	proxy_pass http://tomcat;
}

然后启动 两台tomcat与nginx服务,在浏览器输入nginx服务的地址:端口,不停刷新页面,就可以看到每次请求的服务器发生了改变。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用nginx进行负载均衡 的相关文章

随机推荐

  • 批处理脚本中切换目录

    一 场景 我要在bin main目录下操作v1文件 xff0c 然后在bin目录下操作v2文件 xff0c 但是最后v2文件没有被改写 xff0c 原因是你已经进入bin main 子目录下 xff0c 不能直接进入父目录bin 所以应该注
  • Linux下最强安卓模拟器,流畅又丝滑(附详细安装教程)此瓜保熟|Linux游戏党

    我打算完全从头开始 xff0c 写一个专门用于桌面办公的纯国产操作系统 xff0c 规避主流操作系统上影响用户体验的问题 xff0c 系统力求简洁 有兴趣加QQ群 xff1a 709652950 好东西让更多人发现 xff01 我找了整整两
  • python删除创建文件夹遇到的WindowsError: [Error 5]问题

    一 背景 实际操作中 xff0c 想删除一个文件夹并创建一个文件夹 xff0c 并定义了一个函数 xff0c 但总是遇到WindowsError Error 5 问题 xff0c 经过一番百度 xff0c 是说操作文件权限不够 xff0c
  • Windows下使用WinSW.NET4.exe 设置Nginx的开机自启(新版)

    WinSW NET4 exe 适合X64 xff1b WinSW NET2 exe 适合X86 对应的版本为 xff1a v2 9 0 一 下载地址 https github com winsw winsw releases 下载解压ngi
  • 并查集(Union-Find)算法详解

    并查集 xff08 Union Find xff09 是解决动态连通性问题的一类非常高效的数据结构 本文中 xff0c 我将尽我所能用最简单 xff0c 最清晰的逻辑展示出并查集的构造过程 xff0c 同时还将对其中的关键步骤给出相应的Py
  • apache 编码设置解决

    在windows操作系统上使用IE作为浏览器时 常常会发生这样的问题 xff1a 在浏览使用UTF 8编码的网页时 xff0c 浏览器无法自动侦测 xff08 即没有设定 自动选择 编码格式时 xff09 该页面所用的编码 即使网页已经声明
  • python 字符串相似度判断详解

    1 背景介绍 最近项目中要用到两个字符串相似度的求解算法 xff0c 来矫正ocr文本识别的结果 xff0c 进而提高识别的准确率 xff0c 通过矫正 xff08 相当于模糊查询 xff09 xff0c 识别准确率从65 上升到90 其结
  • 学习使用ffmpeg命令给视频添加一张设计好的背景图片

    学习使用ffmpeg命令给视频添加一张设计好的背景图片 效果如下命令如下 效果如下 未加背景图片之前 xff1a 加上背景图片之后 xff1a 命令如下 ffmpeg loop span class token number 1 span
  • html页面实现使用原生js点击按钮复制文本

    span class token operator lt span span class token operator span Doctype html span class token operator gt span span cla
  • 2.IOC概念及使用xml管理Bean

    1 IOC底层原理 1 1 什么是IOC xff08 1 xff09 控制反转缩写为IOC xff0c 把对象创建和对象之间的调用过程 xff0c 交给Spring管理 xff08 2 xff09 使用IOC目的 xff1a 为了降低耦合度
  • 3. 基于注解方式管理Bean

    1 什么是注解 xff08 1 xff09 注解是代码中的特殊标记 xff0c 格式为 xff1a 64 注解名称 属性名称 61 属性值 属性名称 61 属性值 xff08 2 xff09 注解可以作用在类 方法 属性上面 xff08 3
  • 4. Spring之AOP

    1 AOP基本概念 面向切面编程 利用AOP可以对业务逻辑的各个部分进行隔离 xff0c 从而使业务逻辑各部分之间的耦合度降低 xff0c 提高程序的可重用性 xff0c 同时提高开发效率 AOP主要意图为将日志记录 xff0c 性能统计
  • Python判断时间

    跟着下面这个代码即可学会 使用datetime 模块 39 39 39 pyinstaller使用方法 home leopader local bin pyinstaller i xxx ico xxx py 39 39 39 导入库dat
  • 1.windows11开启wsl2并安装Ubuntu 20.04

    1 开启wsl2 打开控制面板 xff0c 选择程序 启用或关闭Windows功能 xff0c 勾选 适用于Linux的Windows子系统还有虚拟机平台选项 设置wsl版本为wsl2 使用管理员身份 xff0c 打开cmd xff08 命
  • 3.美化shell

    1 安装zsh 默认的shell空值台比较丑 xff0c 在Linux中可以使用oh my zsh进行美化 使用oh my zsh前需要有zsh xff0c 先查看是否安装了zsh span class token function cat
  • 4.ubuntu20.04安装mysql5.7

    1 下载安装包 打开链接 https downloads mysql com archives community 选择相应版本进行下载 xff0c 这里mysql版本选择 5 7 35 xff0c 系统选择Ubuntu Linux xff
  • 5.ubuntu20.04安装redis

    1 下载并安装redis 安装gcc相关依赖 Ubuntu提供了一个build essential软件包 xff0c build essential的依赖包中包含了gcc和g 43 43 xff0c 因此在这里直接安装build essen
  • CentOS 7 安装 node.js

    1 下载node js安装包 打开 https nodejs org zh cn download 链接 xff0c 选择对应的版本进行下载 xff0c 这里选择16 14 2 可以下载到本地 xff0c 然后传到Linux系统中 xff0
  • Linux安装Nginx

    1 下载nginx 进入 http nginx org en download html 网址 分别有 Mainline version xff08 主线版 开发版 xff09 Stable version xff08 稳定版 xff09
  • 使用nginx进行负载均衡

    1 nginx负载均衡介绍 nginx应用场景之一就是负载均衡 在访问量较多的时候 xff0c 可以通过负载均衡 xff0c 将多个请求分摊到多台服务器上 xff0c 相当于把一台服务器需要承担的负载量交给多台服务器处理 xff0c 进而提