首页 > 系统相关 >Nginx反向代理之 upstream 模块

Nginx反向代理之 upstream 模块

时间:2024-05-30 16:57:37浏览次数:30  
标签:hash 调度 server Nginx 算法 模块 upstream 服务器

upstream模块的内容应放于 nginx.conf 配置的 http{} 标签内,其默认的调度算法是rr (轮循 round-robin)

ngx_http_upstream_module模块官方文档

upstream 模块内部 server 标签参数说明#

提示:以上的参数和专业的 haproxy 参数类似,但不如 haproxy 的参数易懂。

upstream 模块调度算法#

调度算法一般分为两类:

第一类为静态调度算法,即负载均衡器根据自身设定的规则进行分配,不需要考虑后端节点服务器的情。例如:rr、wrr、ip_hash等都属于静态调度算法。

第二类为动态调度算法,即负载均衡器会根据后端节点的当前状态来决定是否分发请求,例如:连接数少的有限获得请求,响应时间短的优先获得请求。例如:least_conn、fair 等都属于动态调度算法。

常见的调度算法:

1)rr 轮循 (round robin 默认调度算法,静态调度算法)

  按客户端请求顺序把客户端的请求逐一分配到不同的后端节点服务器,这相当于 LVS 中的 rr 算法,如果后端节点服务器宕机(默认情况下nginx 只检测80端口)。宕机的服务器会自动从节点服务器池中剔除,以便客户端的用户访问不受影响。新的请求会分配给正产的服务器。

    upstream myapp1 {
        server 192.168.3.103;
        server 192.168.3.104;
     }

2)wrr (weight 权重轮循,静态调度算法)

  在 rr 轮循算法的基础上加上权重,即为权重轮循算法,当使用该算法时,权重和用户访问成正比,权重值越大,被转发的请求也就越多。可以根据服务器的配置和性能指定权重值大小,有效解决新旧服务器性能不均带来的请求分配问题。

    upstream myapp1 {
        server 192.168.3.103 weight=1;
        server 192.168.3.104 weight=2;
     }

3)ip_hash(静态调度算法)

  每个请求按客户端 IP 的 hash 结果分配,当新的请求到达时,先将其客户端IP通过哈希算法哈希出一个值,在随后的客户端请求中,客户 IP 的哈希值只要相同,就会被分配至同一台服务器,该调度算法可以解决动态网页的 session 共享问题,但有时会导致请求分配不均,即无法保证 1:1 的负载均衡,因为在国内大多数公司都是 NAT 上网模式,多个客户端会对应一个外部 IP,所以,这些客户端都会被分配到同一节点服务器,从而导致请求分配不均。LVS 负载均衡的 -P 参数、keepalived 配置里的 persistence_timeout 50 参数都类似这个 Nginx 里的 ip_hash 参数,其功能均为解决动态网页的 session 共享问题。注意:当负载调度算法为 ip_hash时,后端服务器在负载均衡调度中的状态不能有 weight 和 backup ,即使有也不会生效。

    upstream myapp1 {
        ip_hash;
        server 192.168.3.103;
        server 192.168.3.104;
     }

4)fair(动态调度算法)

  fair 调度算法会根据后端节点服务器的响应时间来分配请求,响应时间端的优先分配。这是更加智能的调度算法。此种算法可以依据页面大小和加载时间长短只能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。Nginx 本身是不支持 fair 调度算法的,如果需要使用这种调度算法,必须下载 Nginx 的相关模块 upstream_fair。

    upstream myapp1 {
        fair;
        server 192.168.3.103;
        server 192.168.3.104;
     }

5)least_conn (动态调度算法)

  least_conn 调度算法会根据后端节点的连接数来决定分配情况,哪个机器连接数少就分发。

    upstream myapp1 {
        least_conn;
        server 192.168.3.103;
        server 192.168.3.104;
     }

6)url_hash 算法

  url_hash 按访问 URL 的 hash 结果来分配请求,使每个 URL 定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率命中率。(多用于后端服务器为缓存时的场景下)Nginx 本身是不支持 rul_hash的,如果需要使用这种调度算法,必须安装 Nginx 的hash 模块软件包。

    upstream myapp1 {
        server 192.168.3.103;
        server 192.168.3.104;
        hash $request_uri;
        hash_method crc32;
     }

标签:hash,调度,server,Nginx,算法,模块,upstream,服务器
From: https://blog.csdn.net/cumtglad/article/details/139317117

相关文章

  • docker安装nginx
    1.拉取镜像dockerpullnginx  2.创建容器dockerrun--namemy-nginx-p80:80-dnginx3.找个文件夹创建以下目录,mkdir-p{conf,conf.d,html,logs}4.从创建的nginx容器中复制配置文件到本地目录9a2becc47dfc是你创建的nginx容器id,dockercp 容器ID:源位置目标位置......
  • BOSHIDA 如何选择适合自己应用的AC/DC电源模块?
    BOSHIDA如何选择适合自己应用的AC/DC电源模块?AC/DC电源模块是将交流电转换为直流电的设备,广泛应用于各种电子设备中。选择适合自己应用的AC/DC电源模块需要考虑多个因素。 一,需要考虑电源模块的功率。功率是一个衡量电源模块输出能力的重要指标,通常以瓦特(W)为单位。根据应用......
  • 深入理解和配置Nginx:从基础到高级
    深入理解和配置Nginx:从基础到高级Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3代理服务器。由于其稳定性、丰富的功能集、简单的配置和低资源消耗,Nginx已成为世界上最受欢迎的Web服务器之一。在这篇文章中,我们将详细介绍Nginx的配置文件结构,涵盖其核......
  • nginx命令
    先进入nginx.exe所在文件夹cdD:\nginx常用命令如下D:\nginx>startnginx---启动D:\nginx>nginx-sreload---重新加载配置D:\nginx>tasklist/fi"imagenameeqnginx.exe---查看nginx进程D:\nginx>nginx-sstop---启动杀掉nginx进程D:\nginx>taskkill/f/......
  • 在联网linux中编译nginx源码迁移到离线linux使用指南
    nginx没有预先编译好的npm包,通常需要通过编译源代码得到执行文件,下面介绍如何操作:1.找一台联网的linux服务器,安装必要的编译工具和依赖项sudoyumgroupinstall"DevelopmentTools"sudoyuminstallpcre-develzlib-developenssl-devel2.下载nginx源代码包wgethttp:/......
  • centos 7安装nginx
    1.安装nginx[root@dsc1~]#yuminstall-ynginx[root@dsc1~]#rpm-qa|grepnginxnginx-1.20.1-10.el7.x86_64nginx-filesystem-1.20.1-10.el7.noarch 2.启动systemctlstartnginxsystemctlstatusnginx 3.访问[root@dsc1~]#curl-I127.0.0.1HTTP/1.1200OKServer......
  • YOLOv10最新创新点改进系列:融合最新顶会提出的HCANet网络中卷积和注意力融合模块(CAFM
    YOLOv10全网最新创新点改进系列:融合最新顶会提出的HCANet网络中卷积和注意力融合模块(CAFM),有效提升小目标检测性能,大幅度拉升目标检测效果!遥遥领先!YOLOv10全网最新创新点改进系列:融合最新顶会提出的HCANet网络中卷积和注意力融合模块(CAFM-2024年4月开源),有效提升小目标检......
  • lua语言:模块热更新方案
    我们知道,lua通过package模块来管理模块的搜索和加载,当使用require首次成功加载一个模块后,模块(Table)会被存储在package.loaded中,之后的require行为会直接获取到已加载的模块缓存。如何在程序执行时,将对模块文件的修改热更新到程序中,同时确保运行时状态的正常。这是项目开发中常见......
  • Nginx R31 doc-17-debugging 调试
    前言大家好,我是老马。很高兴遇到你。我们为java开发者实现了java版本的nginxhttps://github.com/houbb/nginx4j如果你想知道servlet如何处理的,可以参考我的另一个项目:手写从零实现简易版tomcatminicat手写nginx系列如果你对nginx原理感兴趣,可以阅读:从零......
  • python基础 - 模块与包
    模块与包import包名.模块名importdemo.demo#前缀比较长,一般推荐from包名import模块名demo.demo.fun1(2)fromdemoimportdemodemo.fun1(3)fromdemo.demoimportfun1fun1(4)标准路径标准路径>当前路径>项目路径>其他标准路径importsysforoneinsy.path:pr......