介绍

跨多个应用程序实例的负载平衡是一种用于优化资源利用率,最大化吞吐量,减少延迟和确保容错配置的常用技术。可以将Nginx用作非常有效的HTTP负载平衡器,以将流量分配到多个应用程序服务器,并使用Nginx改善Web应用程序的性能,可伸缩性和可靠性。

负载均衡

什么是负载均衡,单从字面理解可以解释为N台服务器平均分担负载,不会因为某台服务器负载高宕机而出现某台服务器闲置的情况。那么负载均衡的前提就是要有多台服务器才能实现,目的是达到整个系统的高性能和高可用性。

Nginx负载均衡介绍

严格地说,Nginx仅仅是作为Nginx Proxy反向代理使用的,因为这个反向代理功能表现的效果是负载均衡集群的效果,所以我们称之为Nginx负载均衡。

Nginx负载均衡组件

实现Nginx负载均衡的组件主要有两个:

  • ngx_http_upstream_module

负载均衡模块,可以实现网站的负载均衡功能及节点的健康检查

  • ngx_http_proxy_module

proxy代理模块,用于把请求转发给服务器节点或upstream服务器池

http_upstream模块

upstream模块介绍

upstream模块允许Nginx定义一组或多组节点服务器组,使用时可以通过proxy_pass代理方式把网站的请求发送到事先定义好的对应upstream组的名字上,具体写法为:

proxy_pass http://server_pool_name

其中server_pool_name就是一个upstream节点服务器组名字。

upstream典配
upstream server_pool_name {
server 192.168.0.2; #这行标签和下行是等价的
server 192.168.0.3:80 weight=1 max_fails=1 fail_timeout=10s; #这行标签和上一行是等价的,此行多余的部分就是默认配置,不写也可以。
server 192.168.0.4:80 weight=1 max_fails=2 fail_timeout=20s backup; #server最后面可以加很多参数,具体参数作用看下文的表格
}
upstream模块参数
  • server

负载后面的RS配置,可以是ip或者域名。

  • weight

请求服务器的权重。默认值为1,越大表示接受的请求比例越大。

  • max_fails

nginx 尝试连接后端主机失败的次数。

这个数值需配合proxy_net_upstream,fastcgi_next_upstream和memcached_next_upstream这三个参数来使用的。

当nginx接收后端服务器返回这三个参数定义的状态码时,会将这个请求转发给正常工作的后端服务器,例如404,502,503

  • fail_timeout

在max_fails定义的失败次数后,距离下次检查的时间间隔,默认10s

  • backup

热备配置,标志这台服务器作为备份服务器,若主服务器全部宕机了,就会向它转发请求

  • down

表示这个服务器永不可用,可配合ip_hash使用

  • 举例
upstream web_pools {
server 192.168.0.3:80 weight=5;
server 192.168.0.4:80 max_fail=5 fail_timeout=10s;// 当5次连续检查失败后,间隔10s后重新检测。
server 192.168.0.5:80 backup; // 指定备份服务器。作用:等上面服务器全部不可访问时就向它转发请求。
}

http_proxy模块

proxy_pass指令介绍

proxy_pass指令属于ngx_http_proxy_module模块,此模块可以将请求转发到另一台服务器。在实际的反向代理工作中,会通过location功能匹配指定的URI,然后把接收到的符合匹配URI的请求通过proxy_pass抛给定义好的upstream节点池,就location指令具体如何配置和使用,会在后续文章中专题介绍,敬请期待。

        location / {
proxy_pass http://upstream_name;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
http proxy模块参数
  • proxy_set_header

设置http请求header项传给后端服务器节点。例如,可以实现让代理后端的服务器节点获取访问客户端用户真实的IP地址

  • client_body_buffer_size

用于指定客户端请求主题缓冲区大小

  • proxy_connect_timeout

表示反向代理与后端节点服务器连接的超时时间,即发起握手等候响应的超时时间

  • proxy_send_timeout

表示代理后端服务器的数据回传时间,即在规定时间之内,后端服务器必须传完所有的数据,否则,nginx将断开这个连接

  • proxy_read_timeout

设置nginx从代理的后端服务器获取信息的时间,表示连接建立成功后,nginx等待后端服务器的响应时间,其实是nginx在后端排队等候处理的时间

  • proxy_buffer_size

设置缓冲区大小,默认该缓冲区大小等于指令proxy_buffers设置的大小

  • proxy_buffers

设置缓冲区的数量和大小,nginx从代理的后端服务器获取的响应信息,会放置在缓冲区

  • proxy_busy_buffers_size

用于设置系统很忙时可以使用的proxy_buffers大小,官方推荐的大小为proxy_bufer*2

  • proxy_temp_file_write_size

指定proxy缓存临时文件的大小

Nginx负载均衡调度算法

Nginx负载均衡是通过upstream模块来实现的,内置实现了三种负载策略,配置还是比较简单的。官网负载均衡配置说明:http://nginx.org/en/docs/http/load_balancing.html

round-robin(轮询)

默认调度算法,按照客户端请求逐一分配到不同的后端服务器,宕机的服务器会自动从节点服务器池中剔除。

upstream myapp1 {
server srv1.example.com;
server srv2.example.com;
server srv3.example.com;
}

注意:对于服务器性能不同的集群,该算法容易引发资源分配不合理等问题。

least-connected(最少连接)

最少连接允许在某些请求需要较长时间才能完成的情况下更公平地控制应用程序实例上的负载。使用最少连接的负载平衡,nginx将尝试不使繁忙的应用程序服务器因过多的请求而过载,而是将新的请求分配给不太繁忙的服务器。可以将nginx用作非常有效的HTTP负载平衡器,以将流量分配到多个应用程序服务器,并使用nginx改善Web应用程序的性能,可伸缩性和可靠性

upstream myapp1 {
least_conn;
server srv1.example.com;
server srv2.example.com;
server srv3.example.com;
}

ip-hash

每个请求按访问 IP 的hash结果分配,每个访客固定访问一个后端服务器,可解决session不共享的问题。

upstream myapp1 {
ip_hash;
server srv1.example.com;
server srv2.example.com;
server srv3.example.com;
}

参考

结语

欢迎关注微信公众号『码仔zonE』,专注于分享Java、云计算相关内容,包括SpringBoot、SpringCloud、微服务、Docker、Kubernetes、Python等领域相关技术干货,期待与您相遇!

Nginx进阶使用-负载均衡原理及配置实例的更多相关文章

  1. 干货 | Nginx负载均衡原理及配置实例

    一个执着于技术的公众号 Nginx系列导读 给小白的 Nginx 10分钟入门指南 Nginx编译安装及常用命令 完全卸载nginx的详细步骤 Nginx 配置文件详解 理解正向代理与反向代理的区别 ...

  2. Nginx几种负载均衡算法及配置实例

    本文装载自: https://yq.aliyun.com/articles/114683 Nginx负载均衡(工作在七层"应用层")功能主要是通过upstream模块实现,Ngin ...

  3. Nginx 反向代理 负载均衡 虚拟主机配置

    Nginx 反向代理 负载均衡 虚拟主机配置 通过本章你将学会利用Nginx配置多台虚拟主机,清楚代理服务器的作用,区分正向代理和反向代理的区别,搭建使用Nginx反向搭理和负载均衡,了解Nginx常 ...

  4. 【转】Nginx 反向代理 负载均衡 虚拟主机配置

    原文:http://www.cnblogs.com/itdragon/p/8059000.html Nginx 反向代理 负载均衡 虚拟主机配置 通过本章你将学会利用Nginx配置多台虚拟主机,清楚代 ...

  5. Nginx+keepalived实现负载均衡高可用配置

    1. 什么是负载均衡高可用 nginx作为负载均衡器,所有请求都到了nginx,可见nginx处于非常重点的位置,如果nginx服务器宕机后端web服务将无法提供服务,影响严重. 为了屏蔽负载均衡服务 ...

  6. 【nginx】nginx:利用负载均衡原理实现代码的热部署和灰度发布

    事情起因很简单,代码的改动量很大.而且刚接手服务器,对原有的代码进行了一定程度的重构.虽然在测试服务器上做了较多的测试工作,但是直接将代码送入生产环境还是不放心,万一配置出问题服务直接崩溃怎么解?万一 ...

  7. HAProxy负载均衡原理及企业级实例部署haproxy集群

    一 HAProxy简介   HAProxy是一种高效.可靠.免费的高可用及负载均衡解决方案,非常适合于高负载站点的七层数据请求.客户端通过HAProxy代理服务器获得站点页面,而代理服务器收到客户请求 ...

  8. Nginx 反向代理 负载均衡 虚拟主机

    Nginx 反向代理 负载均衡 虚拟主机配置 通过本章你将学会利用Nginx配置多台虚拟主机,清楚代理服务器的作用,区分正向代理和反向代理的区别,搭建使用Nginx反向搭理和负载均衡,了解Nginx常 ...

  9. Nginx 负载均衡原理简介与负载均衡配置详解

    Nginx负载均衡原理简介与负载均衡配置详解   by:授客  QQ:1033553122   测试环境 nginx-1.10.0 负载均衡原理 客户端向反向代理发送请求,接着反向代理根据某种负载机制 ...

随机推荐

  1. 《Python编程第4版 上》高清PDF|百度网盘免费下载|Python基础编程

    <Python编程第4版 上>高清PDF|百度网盘免费下载|Python基础编程 提取码:8qbi  当掌握Python的基础知识后,你要如何使用Python?Python编程(第四版)为 ...

  2. 最基本的Tkinter界面操作

    1.创建应用程序主窗口对象 root = Tk() 2.在主窗口中,添加各种可视化组件 btn1 = Button(root) btn1["text"] = "点我&qu ...

  3. 【JMicro】微服务开发及使用

    JMicro是一个用Java语言实现的开源微服务全家桶, 源码地址:https://github.com/mynewworldyyl/jmicro, Demo地址:http://124.70.152. ...

  4. PHP is_link() 函数

    定义和用法 The is_link() 函数检查指定的文件是否是一个连接. 如果文件是一个连接,该函数返回 TRUE. 语法 is_link(file) 参数 描述 file 必需.规定要检查的文件. ...

  5. Skill 解决 Design Library 被识别成 Technology Library 的问题

    https://www.cnblogs.com/yeungchie/ code procedure(ycTechLibToDesign(libName attachLibName) prog((lib ...

  6. CF Contest 526 G. Spiders Evil Plan 长链剖分维护贪心

    LINK:Spiders Evil Plan 非常巧妙的题目. 选出k条边使得这k条边的路径覆盖x且覆盖的边的边权和最大. 类似于桥那道题还是选择2k个点 覆盖x那么以x为根做长链剖分即可. 不过这样 ...

  7. SqlServer 查询的几种方式以及数字函数、时间函数的应用总结(回归基础)

    --语法:select * from 表名 *表示查询所有字段数据 select * from Class select * from Student select * from RankingLis ...

  8. 004_go语言中的常量

    代码演示 package main import "fmt" import "math" const s string = "constant&quo ...

  9. Python | 面试的常客,经典的生产消费者模式

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是Python专题的第23篇文章,我们来聊聊关于多线程的一个经典设计模式. 在之前的文章当中我们曾经说道,在多线程并发的场景当中,如果我 ...

  10. Go语言入门系列(四)之map的使用

    本系列前面的文章: Go语言入门系列(一)之Go的安装和使用 Go语言入门系列(二)之基础语法总结 Go语言入门系列(三)之数组和切片 1. 声明 map是一种映射,可以将键(key)映射到值(val ...