热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

基于Nginx的负载均衡概述与实现

nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd

前言:

前面我们提到了LVS和Keepalived结合起来的高可用负载均衡,LVS根据原目ip地址及端口将其调度转发至后端 的某个主机,是一种四层的实现,因为LVS是四层的,所以不会受限于套接字或打开的文件数量。不过,如果我们想实现一些更高阶的功能,LVS就显得力不从心了,比如基于uri,COOKIE,header头部信息的负载均衡,此时我们就可以选择一些7层的负载均衡实现,比如Nginx或haproxy等。本次我们就先来讲讲Nginx的负载均衡。

  • LVS 2017-03/141927.htm
  • Keepalived 2017-03/141929.htm

正文:

其实,如果对LVS的各种类型和调度有清晰的认识,那么理解Nginx的负载均衡并没有什么难度,无非就是监听前端server的ip和端口,并指定后端可调用的服务器地址就好~虽然Nginx也有健康检测机制,但是只有在Nginx plus中才能能使用。不过如果后端服务的端口不存在Nginx倒也不会向其调用请求啦~那我们来具体说说。

uostream

ngin的负载均衡得用到upstream模块,它用来定义一个后端服务器组,即把所有后端的服务器整合在一起,然后通过proxy代理到这个服务器组。就能实现简单的http负载均衡了,upstream默认的调度方式是wrr(具体内容可参考LVS中的介绍),所以我们只用指定服务器的ip,如果端口不是默认80端口也可以单独指定,还有一些调度用到的参数,比如权重。如果只是干巴巴的介绍也很抽象,我们就根据配置来介绍吧。

http{
    ...
    upstream backserver {                  #backserver是一个自定义的名字,后面会调用
            server 172.16.53.101;          #第一个后端server
            server 172.16.53.102 ;          #第二个后端server
        }
    ...
    server {                               
        listen 80;
        server_name xiaofengfeng.cn;
        location / {
                proxy_pass      #代理到服务器组,此处只支持http/https
                index index.html;
        }
}

上面就是一个最简单的基于nginx的服务均衡配置了。upstream 的server后面还可以加许多参数,比如设置不同的权值weight=number,权值越大调用的次数越多。backup参数可以设置backup server,比如我们可以设置本机为backup server,当后端服务器都不能访问的时候,我们本机可以提供一个sorry 页面。

http{
    ...
    upstream backserver {
            server 172.16.53.101;
            server 172.16.53.102 ;
            server 127.0.0.1 backup;
              #指定本机回环地址为备用server,此处我们提供一个sorry server
        }
    server {
            listen 192.168.157.128:80;  #代理服务只监听前端服务的ip和端口
            server_name xiaofengfeng.cn;
            location / {
                    proxy_pass  http://backserver;
                    index index.html;
            }
    }
    server {
            listen 127.0.0.1:80;          #回环地址用来做sorry server
            server_name xiaofengfeng2.cn;
            location / {
                    root /var/nginx;
                    index index.html;
            }
    }
}

注:因为我们改变了监听的ip所以得重启nginx服务,而不是用nginx -s reload。

除了server配置选项还有其他一些常用的,比如我们可以改变其调用算法为wlc,即least_conn,就会根据后端服务器的连接数来调用。如果我们的一些用户信息,比如说session,COOKIE等保存在后端服务器本地,为了放置用户信息丢失,我们可以让一个用户的请求都发送到同一个后端服务器。ip_hash就可以实现这样的功能。来自同一个源IP地址的请求始终发往同一个upstream server。除了根据源地址hash,我们还可以指定特定的参数来作为hash的条件,比如,如果我们用uri作为hash条件,那么同一个uri的请求会发往同一台后端服务器。此时我们就要用到hash选项,比如:

hash $request_uri consistent

$request_uri是内置提供的变量,就是请求的uri咯,consistent是一致性哈希算法,这个倒是可以说道说道。我们知道哈希就是无论输入什么值,都会得到一个固定长度的散列值,我们对不同的uri求散列值,如果后端服务器有6台服务器,然后给他们进行编号0-6,然后用求的散列值对6做取余运算,就一定会得到0-6中的一个值,然后把这个分配给对应编号的服务器。不过,这个算法有个问题,如果某个服务器挂掉,我们就得重新以5来做取余运算,然后重新把所有过程从来一遍。所以就出现了上面的一致性哈希算法,我们现在先不关注后端有几台服务器,我们把0到2的32次方减一这个多个数字分布在一个圆环上,就上钟表上的0-12一样,0的地方就是12.然后我们对后端每个服务器的ip地址做哈希计算,得到的值在和2的32次方做取余运算,那么后端的这些服务器一定会分布在这个圆环上的某个点处,然后我们在对hash选项指定的内容,此处是uri做hash计算,得到的值在和2的32次方取余,所以这些uri也会分布在这个圆环上。然后我们规定,在这个圆环上分布的服务器,负责响应它到它下一个服务器的区间上分布的请求。此时当后端的某台服务器挂掉时,只会影响这台服务器后面的URI请求,而不会影响其他服务器,只用把属于这台服务器的请求,给它上一台就好,我们画个图说明下。

#

我们用方块表示后端服务器经过哈希计算的分布情况,用红色的线表示不同uri请求的分布情况,服务器1只用负责1到2之间的uri请求,以此类推,5只用负责5到1之间的uri请求,如右图所示,假如2号服务器挂掉了,我们就把所有属于2号服务器的请求分配给1号服务器~好啦~这就是一致性哈希算法~~~很重要哟,许多地方都有用到。

除了支持web服务的负载均衡,nginx还支持其他服务的负载均衡,此时我们就得用到另外d的模块stream和stream_proxy_module。不过这两个模块必须得是1.9.13以上的版本~并且默认stream并没有加载。得在编译时加入--with-stream选项,不过如果我们用的是预编译的rpm包安装的话,默认是有这个的~以下是/etc/nginx/nginx.conf

user  nginx;
worker_processes  1;
 
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
 
 
events {
    worker_connections  1024;
}
stream {
        upstream sshsrvs {
                server 192.168.10.130:22;
                server 192.168.10.131:22;
        }
 
        server {
                listen 172.16.100.6:22202;
                proxy_pass sshsrvs;
                proxy_timeout 60s;
                proxy_connect_timeout 10s;
        }
 
}

我们启动或者重启nginx,然后我们就可以通过22202 访问后端的ssh服务了,MySQL服务也类似~当然是轮询访问啦~和上面的web服务类似。

下面关于Nginx的文章您也可能喜欢,不妨参考下:

CentOS 7.2下编译安装PHP7.0.10+MySQL5.7.14+Nginx1.10.1  2016-09/134804.htm

Nginx实现集群的负载均衡配置过程详解 2017-02/140549.htm

Nginx高级应用--负载均衡与rewrite规则  2017-02/140476.htm

CentOS 6.4安装配置Nginx+Pcre+php-fpm 2013-08/88984.htm

Nginx安装配置使用详细笔记 2014-07/104499.htm

Nginx日志过滤 使用ngx_log_if不记录特定日志 2014-07/104686.htm

Nginx的500,502,504错误解决方法 2015-03/115507.htm

CentOS 7 编译安装Nginx1.10.2 脚本启动失败解决思路 2017-01/139794.htm

Nginx简单实现网站的负载均衡  2017-02/140351.htm

Nginx 的详细介绍:请点这里
Nginx 的下载地址:请点这里


推荐阅读
  • Nacos 0.3 数据持久化详解与实践
    本文详细介绍了如何将 Nacos 0.3 的数据持久化到 MySQL 数据库,并提供了具体的步骤和注意事项。 ... [详细]
  • Cookie学习小结
    Cookie学习小结 ... [详细]
  • HTTP(HyperTextTransferProtocol)是超文本传输协议的缩写,它用于传送www方式的数据。HTTP协议采用了请求响应模型。客服端向服务器发送一 ... [详细]
  • 为什么多数程序员难以成为架构师?
    探讨80%的程序员为何难以晋升为架构师,涉及技术深度、经验积累和综合能力等方面。本文将详细解析Tomcat的配置和服务组件,帮助读者理解其内部机制。 ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • 本文探讨了 Kafka 集群的高效部署与优化策略。首先介绍了 Kafka 的下载与安装步骤,包括从官方网站获取最新版本的压缩包并进行解压。随后详细讨论了集群配置的最佳实践,涵盖节点选择、网络优化和性能调优等方面,旨在提升系统的稳定性和处理能力。此外,还提供了常见的故障排查方法和监控方案,帮助运维人员更好地管理和维护 Kafka 集群。 ... [详细]
  • 2012年9月12日优酷土豆校园招聘笔试题目解析与备考指南
    2012年9月12日,优酷土豆校园招聘笔试题目解析与备考指南。在选择题部分,有一道题目涉及中国人的血型分布情况,具体为A型30%、B型20%、O型40%、AB型10%。若需确保在随机选取的样本中,至少有一人为B型血的概率不低于90%,则需要选取的最少人数是多少?该问题不仅考察了概率统计的基本知识,还要求考生具备一定的逻辑推理能力。 ... [详细]
  • 2016-2017学年《网络安全实战》第三次作业
    2016-2017学年《网络安全实战》第三次作业总结了教材中关于网络信息收集技术的内容。本章主要探讨了网络踩点、网络扫描和网络查点三个关键步骤。其中,网络踩点旨在通过公开渠道收集目标信息,为后续的安全测试奠定基础,而不涉及实际的入侵行为。 ... [详细]
  • Nginx不仅是一款轻量级的高性能Web服务器,还具备出色的负载均衡和反向代理功能。它支持复杂的正则匹配规则、动静内容分离以及灵活的URL重写功能,使得配置和管理更加便捷高效。此外,Nginx提供了多种负载均衡算法,如轮询、加权轮询、最少连接数等,以满足不同应用场景的需求。 ... [详细]
  • 在List和Set集合中存储Object类型的数据元素 ... [详细]
  • Keepalived 提供了多种强大且灵活的后端健康检查机制,包括 HTTP_GET、SSL_GET、TCP_CHECK、SMTP_CHECK 和 MISC_CHECK 等多种检测方法。这些健康检查功能确保了高可用性环境中的服务稳定性和可靠性。通过合理配置这些检查方式,可以有效监测后端服务器的状态,及时发现并处理故障,从而提高系统的整体性能和可用性。 ... [详细]
  • 第二章:Kafka基础入门与核心概念解析
    本章节主要介绍了Kafka的基本概念及其核心特性。Kafka是一种分布式消息发布和订阅系统,以其卓越的性能和高吞吐量而著称。最初,Kafka被设计用于LinkedIn的活动流和运营数据处理,旨在高效地管理和传输大规模的数据流。这些数据主要包括用户活动记录、系统日志和其他实时信息。通过深入解析Kafka的设计原理和应用场景,读者将能够更好地理解其在现代大数据架构中的重要地位。 ... [详细]
  • Sanic 是一个类似于 Flask 的 Python 3.5 Web 服务器,以其出色的写入速度而著称。与 Flask 不同,Sanic 支持异步请求处理,这使得它在处理高并发请求时表现更加出色。通过利用 Python 的异步特性,Sanic 能够显著提高应用程序的性能和响应能力,适用于构建高性能的异步 Web 应用。 ... [详细]
  • 本文介绍了一种利用PHP cURL库高效提取Sohu邮箱联系人列表的方法。通过设置错误报告级别、定义Cookie文件路径等关键步骤,确保了代码的稳定性和可靠性。经过实际测试,该方法在2012年3月24日被验证为有效,能够快速准确地获取联系人信息。此外,文章还提供了详细的代码示例和注意事项,帮助开发者更好地理解和应用这一技术。 ... [详细]
  • 构建高可用性Spark分布式集群:大数据环境下的最佳实践
    在构建高可用性的Spark分布式集群过程中,确保所有节点之间的无密码登录是至关重要的一步。通过在每个节点上生成SSH密钥对(使用 `ssh-keygen -t rsa` 命令并保持默认设置),可以实现这一目标。此外,还需将生成的公钥分发到所有节点的 `~/.ssh/authorized_keys` 文件中,以确保节点间的无缝通信。为了进一步提升集群的稳定性和性能,建议采用负载均衡和故障恢复机制,并定期进行系统监控和维护。 ... [详细]
author-avatar
ZERO-DOEN
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有