代理服务器对比HA,NGINX

一、代理服务器优缺点:HAProxy、Nginx、LVS、Apache

比较

HAProxy

Nginx

LVS

Apache

简介

高可用、负载均衡且基于TCP和HTTP应用的代理,支持高并发,多集群反代。

高性能http和反向代理服务器、邮件代理服务器,支持高并发,轻量级Web,低系统资源消耗。

Linux虚拟服务器,常用VS/NAT、VS/TUN和VS/DR,三种模式负载均衡。

高性能Web服务器,支持代理,市场份额很高。

优点缺点

1、抗负载能力强,负载均衡速度高。

2、支持session保持,Cookie引导,可通过url检测后端服务器健康状态。

3、也可做MySQL、Email等负载均衡。

4、一般不做Web服务器的Cache。

1、抗负载能力强。

2、http、https、Emai协议功能较好,处理相应请求快。

3、Web能力强,配置简单,支持缓存功能、适用动静分离,低内存消耗。

4、不支持session直接保持,但可通过ip_hash解决,通过端口对后端服务器健康检查。

1、抗负载能力强。

2、通过vrrp转发(仅分发)效率高,流量通过内核处理,没有流量产生。(理论)

3、相当稳定可靠。

4、不支持正则,不能做动静分离,配置略复杂,需要IP略多。

1、Web处理能力强,市场份额很高。(不过后期Nginx在Web方面越来越好,份额也在增长)

2、Rewrite强大,并支持很多模块,扩展很方便。

3、Bug少,历史久,比较稳定。

4、处理动态请求比Nginx好。

支持算法

1、轮循

Round-robin

2、带权轮循

Weight-round-robin

3、原地址保持)

Source

4、RI请求URL

rdp-cookie(根据cookie)

1、轮循

Round-robin

2、带权轮循

Weight-round-robn

3、Ip哈希

Ip-hash

1、rr(轮循)

2、wrr(带权轮循)

3、lc(最小连接)、

4、wlc(权重最小连接)

通过相关模块实现代理

官网

www.haproxy.com

nginx.org

www.linuxvirtualserver.org

http://www.apache.org/

是否免费

免费

免费

免费

免费

虚拟主机

支持

支持

不支持 

支持

七层(常用)

七层(常用)

四层(常用)

不常用

七层重量级,四层轻量级

七层重量级,四层轻量级

四层重量级

功能略差

热备

Keepalived+其它

Keepalived+其它

Keepalived+其它

Keepalived+其它

负载均衡参考标准

1、效率,并发处理能力、处理数据能力。

2、成本、需求、平台。

二、代理服务器有软件和硬件之分:

①、硬件:有比较昂贵的F5和Array等商用的负载均衡器,它的优点就是有专业的维护团队来对这些服务进行维护、缺点就是花销太大,所以对于规模较小的网络服务来说暂时还没有需要使用
②、软件:类似于Nginx/LVS/HAProxy的基于Linux的开源免费的负载均衡软件,这些都是通过软件级别来实现,所以费用非常低廉。

三、对比必有优缺点

Nginx的优点是:

1、工作在网络的7层之上,可以针对http应用做一些分流的策略,比如针对域名、目录结构,它的正则规则比HAProxy更为强大和灵活,这也是它目前广泛流行的主要原因之一,Nginx单凭这点可利用的场合就远多于LVS了。

2、Nginx对网络稳定性的依赖非常小,理论上能ping通就就能进行负载功能,这个也是它的优势之一;相反LVS对网络稳定性依赖比较大,这点本人深有体会;

3、Nginx安装和配置比较简单,测试起来比较方便,它基本能把错误用日志打印出来。LVS的配置、测试就要花比较长的时间了,LVS对网络依赖比较大。

3、可以承担高负载压力且稳定,在硬件不差的情况下一般能支撑几万次的并发量,负载度比LVS相对小些。

4、Nginx可以通过端口检测到服务器内部的故障,比如根据服务器处理网页返回的状态码、超时等等,并且会把返回错误的请求重新提交到另一个节点,不过其中缺点就是不支持url来检测。比如用户正在上传一个文件,而处理该上传的节点刚好在上传过程中出现故障,Nginx会把上传切到另一台服务器重新处理,而LVS就直接断掉了,如果是上传一个很大的文件或者很重要的文件的话,用户可能会因此而不满。

5、Nginx不仅仅是一款优秀的负载均衡器/反向代理软件,它同时也是功能强大的Web应用服务器。LNMP也是近几年非常流行的web架构,在高流量的环境中稳定性也很好。
6、Nginx现在作为Web反向加速缓存越来越成熟了,速度比传统的Squid服务器更快,可以考虑用其作为反向代理加速器。
7、Nginx可作为中层反向代理使用,这一层面Nginx基本上无对手,唯一可以对比Nginx的就只有lighttpd了,不过lighttpd目前还没有做到Nginx完全的功能,配置也不那么清晰易读,社区资料也远远没Nginx活跃。
8、Nginx也可作为静态网页和图片服务器,这方面的性能也无对手。还有Nginx社区非常活跃,第三方模块也很多。
淘宝的前端使用的Tengine就是基于nginx做的二次开发定制版。

Nginx的缺点是:

1、Nginx仅能支持http、https和Email协议,这样就在适用范围上面小些,这个是它的缺点。

2、对后端服务器的健康检查,只支持通过端口来检测,不支持通过url来检测。不支持Session的直接保持,但能通过ip_hash来解决

LVS:使用Linux内核集群实现一个高性能、高可用的负载均衡服务器,它具有很好的可伸缩性(Scalability)、可靠性(Reliability)和可管理性(Manageability)。

LVS的优点是:

1、抗负载能力强、是工作在网络4层之上仅作分发之用,没有流量的产生,这个特点也决定了它在负载均衡软件里的性能最强的,对内存和cpu资源消耗比较低。
2、配置性比较低,这是一个缺点也是一个优点,因为没有可太多配置的东西,所以并不需要太多接触,大大减少了人为出错的几率。
3、工作稳定,因为其本身抗负载能力很强,自身有完整的双机热备方案,如LVS+Keepalived,不过我们在项目实施中用得最多的还是LVS/DR+Keepalived。
4、无流量,LVS只分发请求,而流量并不从它本身出去,这点保证了均衡器IO的性能不会收到大流量的影响。
5、应用范围比较广,因为LVS工作在4层,所以它几乎可以对所有应用做负载均衡,包括http、数据库、在线聊天室等等。

LVS的缺点是:

1、软件本身不支持正则表达式处理,不能做动静分离;而现在许多网站在这方面都有较强的需求,这个是Nginx/HAProxy+Keepalived的优势所在。
2、如果是网站应用比较庞大的话,LVS/DR+Keepalived实施起来就比较复杂了,特别后面有Windows Server的机器的话,如果实施及配置还有维护过程就比较复杂了,相对而言,Nginx/HAProxy+Keepalived就简单多了。

HAProxy的特点是:

1、HAProxy也是支持虚拟主机的。
2、HAProxy的优点能够补充Nginx的一些缺点,比如支持Session的保持,Cookie的引导;同时支持通过获取指定的url来检测后端服务器的状态。
3、HAProxy跟LVS类似,本身就只是一款负载均衡软件;单纯从效率上来讲HAProxy会比Nginx有更出色的负载均衡速度,在并发处理上也是优于Nginx的。
4、HAProxy支持TCP协议的负载均衡转发,可以对MySQL读进行负载均衡,对后端的MySQL节点进行检测和负载均衡,大家可以用LVS+Keepalived对MySQL主从做负载均衡。
5、HAProxy负载均衡策略非常多,HAProxy的负载均衡算法现在具体有如下8种:
① roundrobin,表示简单的轮询,这个不多说,这个是负载均衡基本都具备的;
② static-rr,表示根据权重,建议关注;
③ leastconn,表示最少连接者先处理,建议关注;
④ source,表示根据请求源IP,这个跟Nginx的IP_hash机制类似,我们用其作为解决session问题的一种方法,建议关注;
⑤ ri,表示根据请求的URI;
⑥ rl_param,表示根据请求的URl参数’balance url_param’ requires an URL parameter name;
⑦ hdr(name),表示根据HTTP请求头来锁定每一次HTTP请求;
⑧ rdp-cookie(name),表示根据据cookie(name)来锁定并哈希每一次TCP请求。

四、总结

1、Nginx工作在网络的7层,所以它可以针对http应用本身来做分流策略,比如针对域名、目录结构等,相比之下LVS并不具备这样的功能,所以Nginx单凭这点可利用的场合就远多于LVS了;但Nginx有用的这些功能使其可调整度要高于LVS,所以经常要去触碰触碰,触碰多了,人为出问题的几率也就会大。

2、Nginx对网络稳定性的依赖较小,理论上只要ping得通,网页访问正常,Nginx就能连得通,这是Nginx的一大优势!Nginx同时还能区分内外网,如果是同时拥有内外网的节点,就相当于单机拥有了备份线路;LVS就比较依赖于网络环境,目前来看服务器在同一网段内并且LVS使用direct方式分流,效果较能得到保证。另外注意,LVS需要向托管商至少申请多一个ip来做Visual IP,貌似是不能用本身的IP来做VIP的。要做好LVS管理员,确实得跟进学习很多有关网络通信方面的知识,就不再是一个HTTP那么简单了。

3、Nginx安装和配置比较简单,测试起来也很方便,因为它基本能把错误用日志打印出来。LVS的安装和配置、测试就要花比较长的时间了;LVS对网络依赖比较大,很多时候不能配置成功都是因为网络问题而不是配置问题,出了问题要解决也相应的会麻烦得多。

4、Nginx也同样能承受很高负载且稳定,但负载度和稳定度差LVS还有几个等级:Nginx处理所有流量所以受限于机器IO和配置;本身的bug也还是难以避免的。

5、Nginx可以检测到服务器内部的故障,比如根据服务器处理网页返回的状态码、超时等等,并且会把返回错误的请求重新提交到另一个节点。目前LVS中 ldirectd也能支持针对服务器内部的情况来监控,但LVS的原理使其不能重发请求。比如用户正在上传一个文件,而处理该上传的节点刚好在上传过程中出现故障,Nginx会把上传切到另一台服务器重新处理,而LVS就直接断掉了,如果是上传一个很大的文件或者很重要的文件的话,用户可能会因此而恼火。

6、Nginx对请求的异步处理可以帮助节点服务器减轻负载,假如使用apache直接对外服务,那么出现很多的窄带链接时apache服务器将会占用大 量内存而不能释放,使用多一个Nginx做apache代理的话,这些窄带链接会被Nginx挡住,apache上就不会堆积过多的请求,这样就减少了相当多的资源占用。这点使用squid也有相同的作用,即使squid本身配置为不缓存,对apache还是有很大帮助的。

7、Nginx能支持http、https和email(email的功能比较少用),LVS所支持的应用在这点上会比Nginx更多。在使用上,一般最前端所采取的策略应是LVS,也就是DNS的指向应为LVS均衡器,

五、参数说明

HAPorxy:

配置文件以及案例:

 haproxy 的配置文件分为四个部分:

     全局配置:

        global:  全局配置段

     代理配置:

        default: 默认配置—–>所有在backend、frontend、linsten中相同内容可以在此定义;

        frontend:前段配置—–>定义前端套接字,接受客户端请求;

        backend: 后端配置—–>定义后端分配规则,与后端服务器交互;

        listen:  绑定配置—–>直接将指定的客户端与后端特定服务器绑定到一起;

eg:

global

    log    127.0.0.1 local2  #通过syslog服务的local2输出日志信息

chroot      /var/lib/haproxy  #指定工作目录

#性能相关

    maxconn 4096  #单个进程的最大连接数

    #maxpipes      #haproxy使用pipe完成基于内核的tcp报文重组,默认为maxconn/4

    #noepoll:在Linux系统上禁用epoll机制;

    #nokqueue:在BSD系统上禁用kqueue机制;

    #nopoll:禁用poll机制;

    #nosepoll:在Linux禁用启发式epoll机制;

    #nosplice:禁止在Linux套接字上使用内核tcp重组

    #…

    uid 99        #所属运行的用户uid,默认nobod

    gid 99        #所属运行的用户组,默认nobody

    daemon        #后台运行

    nbproc 2      #工作进程数量

    #user        haproxy   #同uid

    #group       haproxy   #同gid 

    pidfile /var/run/haproxy.pid

    #description     #当前实例描述信息

defaults

    log global

    log 127.0.0.1 local2 err #使用本机上的syslog服务的local2 设备记录错误信息[err warning info debug]

    mode http          #工作模式在7层,tcp是4层

    option httplog     #使用http日志类别,默认是不记录http请求的

    option httpclose   #每次请求完毕后主动关闭http通道式

    option forwardfor  #如果后端服务器需要获得客户端的真实IP需要配置次参数,将可以从Http Header中获得客户端IP

    option redispatch  #当serverId对应的服务器挂掉后,强制定向到其他健康的服务器

    retries 3          #设置尝试次数,3次连接失败则认为服务器不可用

    maxconn 2048       #最大连接数

    contimeout 500    #连接超时

    clitimeout 5000   #客户端超时

    srvtimeout 5000   #服务器超时

    timeout check 2000         #心跳检测超时

    listen status 0.0.0.0:8080     #定义状态名字和监听端口

    stats uri /haproxy-status  #查看haproxy服务器状态地址

    stats auth admin:renzhiyuan#查看状态页面的用户名和密码

    stats hide-version         #隐藏haproxy版本信息

    stats refresh 30s          #每5秒刷新一次状态页面

    listen web_server 0.0.0.0:80   #定义后端名字和监听端口

    mode http                  #采用7层模式

    balance roundrobin         #负载均衡算法,这里是轮叫

    cookie SERVERID  #允许插入serverid到cookie中,serverid后面可以定义

    option httpchk GET /index.html #健康检测

    server web1 x.x.x.x:80 weight 3 check inter 500 fall 3  

    server web2 x.x.x.x:80 weight 2 check inter 500 fall 3

    server web3 x.x.x.x:80 weight 2 check inter 500 fall 3

    #server:    #server来设置后端服务器

    #webx:      #HAProxy名称,将在日志中显示

    #x.x.x.x:80 #后端IP和端口

    #weight     #权重值,权重值越大,分配的任务几率越高

    #check      #健康检测,inter 500健康检测间隔是500毫秒

    #fall       #检测多少次,认为服务器是不可用.

    
    

Haproxy是一款免费、稳定、高效的轻量级负载均衡软件,现将其配置文件参数作如下说明:

global #全局配置参数

        log 127.0.0.1 local3 info #日志级别

        maxconn 4096

        user haproxy

        group haproxy

        daemon #设置为后台进程

pidfile /usr/local/haproxy/haproxy.pid #进程的pid文件

defaults #默认配置,被frontend,backend,listen段继承使用

        log global

        mode http #Haproxy工作模式,四层工作模式为TCP

        option httplog

option forwardfor  #使后端服务器获取客户端的真实IP

option redispatch #如果cookie中写入ServerID而客户端不会刷新Cookie,那么当ServerID对应的服务器宕机后,将强制定向到其它健康的服务器上

option abortonclose #当服务器负载过高时,将自动关闭队列中处理时间较长的连接请求

cookie SERVERID #允许向cookie中插入SERVERID,服务器的SERVERID在后端使用cookie关键字定义

        retries 3               #服务器连接失败后的重试次数

        maxconn 2000            #每个进程的最大连接数

        timeout connect 5000    #连接最大超时时间,默认毫秒

        timeout client 30000 #客户端最大超时时间

        timeout server 30000 #服务端超时时间

listen haproxy_stats #定义Haproxy监控

        bind 0.0.0.0:8080

        mode http

        log global

        stats enable

        stats refresh 5s #页面刷新间隔为5s

        stats realm Haproxy\ Statistics

        stats uri /haproxy_stats #监控页面的URL

        stats hide-version

        stats auth haproxy:abc-123 #指定监控页面登陆的用户名和密码

frontend haproxy_web #定义客户端访问的前端服务器

        bind 0.0.0.0:80 #定义监听的套接字

        mode http

        log global

        option httplog #启用http日志

        option httpclose #每次请求完毕后,关闭http通道

acl php_web path_end .php  #定义一个名叫php_web的acl策略,当请求的url以.php结尾时会被匹配到

use_backend php_server if php_web #如果条件满足策略php_web时,则将请求交给后端的php_server服务器

        default_backend servers #设置默认的后端服务器组

backend servers #定义后端服务器组

        mode http

        option httpchk GET /index.html #开启对后端服务器的健康检查,通过检查index.html文件来判断服务器的健康状况

        balance roundrobin              #负载均衡算法为轮询,

        server web1 192.168.154.162:80 check inter 2000 rise 2 fall 3  #对后端服务器的健康状况检查间隔为2000毫秒,连续2次健康检查成功,则认为是有效的,连续3次健康检查失败,则认为服务器宕机

        server web2 192.168.154.156:80 check inter 2000 rise 2 fall 3

    原文作者:南城徐凤年
    原文地址: https://blog.csdn.net/AIGUO666666/article/details/121291302
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞