欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

马哥 45_02 _http反向代理及haproxy【攻城狮论坛の免费分享】 有大用


一、HAProxy简介



HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在时下的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。


HAProxy实现了一种事件驱动、单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户端(User-Space) 实现所有这些????任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以 使每个CPU时间片(Cycle)做更多的工作。


————百度百科






HAProxy是免费、极速且可靠的用于为TCP和基于HTTP应用程序提供高可用、负载均衡和代理服务的解决方案,尤其适用于高负载且需要持久连接或7层处理机制的web站点。


HAProxy目前主要有两个版本:


1.4——提供较好的弹性:衍生于1.2版本,并提供了额外的新特性,其中大多数是期待已久的。

客户端侧的长连接(client-side keep-alive)

TCP加速(TCP speedups)

响应池(response buffering)

RDP协议

基于源的粘性(source-based stickiness)

更好的统计数据接口(a much better stats interfaces)

更详细的健康状态检测机制(more verbose health checks)

基于流量的健康评估机制(traffic-based health)

支持HTTP认证

服务器管理命令行接口(server management from the CLI)

基于ACL的持久性(ACL-based persistence)

日志分析器


1.3——内容交换和超强负载:衍生于1.2版本,并提供了额外的新特性。

内容交换(content switching):基于任何请求标准挑选服务器池;?????

ACL:编写内容交换规则;

负载均衡算法(load-balancing algorithms):更多的算法支持;

内容探测(content inspection):阻止非授权协议;

透明代理(transparent proxy):在Linux系统上允许使用客户端IP直接连入服务器;

内核TCP拼接(kernel TCP splicing):无copy方式在客户端和服务端之间转发数据以实现数G级别的数据速率;

分层设计(layered design):分别实现套接字、TCP、HTTP处理以提供更好的健壮性、更快的处理机制及便捷的演进能力;

快速、公平调度器(fast and fair scheduler):为某些任务指定优先级可实现理好的QoS;

会话速率限制(session rate limiting):适用于托管环境;



支持的平台及OS:

x86、x86_64、Alpha、SPARC、MIPS及PARISC平台上的Linux 2.4;

x86、x86_64、ARM (ixp425)及PPC64平台上的Linux2.6;

UltraSPARC 2和3上的Sloaris 8/9;

Opteron和UltraSPARC平台上的Solaris 10;

x86平台上的FreeBSD 4.1-8;

i386, amd64, macppc, alpha, sparc64和VAX平台上的OpenBSD 3.1-current;


若要获得最高性能,需要在Linux 2.6或打了epoll补丁的Linux 2.4上运行haproxy 1.2.5以上的版本。haproxy 1.1l默认使用的polling系统为select(),其处理的文件数达数千个时性能便会急剧下降。1.2和1.3版本默认的为poll(),在有些操作系统上可会也会有性能方面的问题,但在Solaris上表现相当不错。HAProxy 1.3在Linux 2.6及打了epoll补丁的Linux 2.4上默认使用epoll,在FreeBSD上使用kqueue,这两种机制在任何负载上都能提供恒定的性能表现。


在较新版本的Linux 2.6(>=2.6.27.19)上,HAProxy还能够使用splice()系统调用在接口间无复制地转发任何数据,这甚至可以达到10Gbps的性能。


基于以上事实,在x86或x86_64平台上,要获取最好性能的负载均衡器,建议按顺序考虑以下方案。

Linux 2.6.32及之后版本上运行HAProxy 1.4;

打了epoll补丁的Linux 2.4上运行HAProxy 1.4;

FreeBSD上运行HAProxy 1.4;

Solaris 10上运行HAProxy 1.4;



性能


HAProxy借助于OS上几种常见的技术来实现性能的最大化。

单进程、事件驱动模型显著降低了上下文切换的开销及内存占用。

O(1)事件检查器(event checker)允许其在高并发连接中对任何连接的任何事件实现即时探测。

在任何可用的情况下,单缓冲(single buffering)机制能以不复制任何数据的方式完成读写操作,这会节约大量的CPU时钟周期及内存带宽;

借助于Linux 2.6 (>= 2.6.27.19)上的splice()系统调用,HAProxy可以实现零复制转发(Zero-copy forwarding),在Linux 3.5及以上的OS中还可以实现零复制启动(zero-starting)?????;

MRU内存分配器在固定大小的内存池中可实现即时内存分配,这能够显著减少创建一个会话的时长;

树型存储:侧重于使用作者多年前开发的弹性二叉树,实现了以O(log(N))的低开销来保持计时器命令、保持运行队列命令及管理轮询及最少连接队列;

优化的HTTP首部分析:优化的首部分析功能避免了在HTTP首部分析过程中重读任何内存区域?????;

精心地降低了昂贵的系统调用,大部分工作都在用户空间完成,如时间读取、缓冲聚合及文件描述符的启用和禁用等;


所有的这些细微之处的优化实现了在中等规模负载之上依然有着相当低的CPU负载,甚至于在非常高的负载场景中,5%的用户空间占用率和95%的系统空间占用率也是非常普遍的现象,这意味着HAProxy进程消耗比系统空间消耗低20倍以上。因此,对OS进行性能调优是非常重要的。即使用户空间的占用率提高一倍,其CPU占用率也仅为10%,这也解释了为何7层处理对性能影响有限这一现象。由此,在高端系统上HAProxy的7层性能可轻易超过硬件负载均衡设备。


在生产环境中,在7层处理上使用HAProxy作为昂贵的高端硬件负载均衡设备故障时的紧急解决方案也时长可见。硬件负载均衡设备在“报文”级别处理请求,这在支持跨报文请求(request across multiple packets)有着较高的难度,并且它们不缓冲任何数据,因此有着较长的响应时间。对应地,软件负载均衡设备使用TCP缓冲,可建立极长的请求,且有着较大的响应时间。


可以从三个因素来评估负载均衡器的性能:

会话率

会话并发能力

数据率



二、配置HAProxy


2.1 配置文件格式


HAProxy的配置处理3类来主要参数来源:

——最优先处理的命令行参数,

——“global”配置段,用于设定全局配置参数;

——proxy相关配置段,如“defaults”、“listen”、“frontend”和“backend”;


2.2 时间格式


一些包含了值的参数表示时间,如超时时长。这些值一般以毫秒为单位,但也可以使用其它的时间单位后缀。

us: 微秒(microseconds),即1/1000000秒;

ms: 毫秒(milliseconds),即1/1000秒;

s: 秒(seconds);

m: 分钟(minutes);

h:小时(hours);

d: 天(days);


2.3 例子


下面的例子配置了一个监听在所有接口的80端口上HTTP proxy服务,它转发所有的请求至后端监听在127.0.0.1:8000上的"server"。


global

        daemon

        maxconn 25600


    defaults

        mode http

        timeout connect 5000ms

        timeout client 50000ms

        timeout server 50000ms


    frontend http-in

        bind *:80

        default_backend servers


    backend servers

        server server1 127.0.0.1:8080 maxconn 32


2.4 全局配置


“global”配置中的参数为进程级别的参数,且通常与其运行的OS相关。


 * 进程管理及安全相关的参数

   - chroot <jail dir>:修改haproxy的工作目录至指定的目录并在放弃权限之前执行chroot()操作,可以提升haproxy的安全级别,不过需要注意的是要确保指定的目录为空目录且任何用户均不能有写权限;

   - daemon:让haproxy以守护进程的方式工作于后台,其等同于“-D”选项的功能,当然,也可以在命令行中以“-db”选项将其禁用;

   - gid <number>:以指定的GID运行haproxy,建议使用专用于运行haproxy的GID,以免因权限问题带来风险;

   - group <group name>:同gid,不过指定的组名;

   - log  <address> <facility> [max level [min level]]:定义全局的syslog服务器,最多可以定义两个;

   - log-send-hostname [<string>]:在syslog信息的首部添加当前主机名,可以为“string”指定的名称,也可以缺省使用当前主机名;

   - nbproc <number>:指定启动的haproxy进程个数,只能用于守护进程模式的haproxy;默认只启动一个进程,鉴于调试困难等多方面的原因,一般只在单进程仅能打开少数文件描述符的场景中才使用多进程模式;

   - pidfile:

   - uid:以指定的UID身份运行haproxy进程;

   - ulimit-n:设定每进程所能够打开的最大文件描述符数目,默认情况下其会自动进行计算,因此不推荐修改此选项;

   - user:同uid,但使用的是用户名;

   - stats:

   - node:定义当前节点的名称,用于HA场景中多haproxy进程共享同一个IP地址时;

   - description:当前实例的描述信息;


 * 性能调整相关的参数

   - maxconn <number>:设定每个haproxy进程所接受的最大并发连接数,其等同于命令行选项“-n”;“ulimit -n”自动计算的结果正是参照此参数设定的;

   - maxpipes <number>:haproxy使用pipe完成基于内核的tcp报文重组,此选项则用于设定每进程所允许使用的最大pipe个数;每个pipe会打开两个文件描述符,因此,“ulimit -n”自动计算时会根据需要调大此值;默认为maxconn/4,其通常会显得过大;

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

   - nokqueue:在BSE系统上禁用kqueue机制;

   - nopoll:禁用poll机制;

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

   - nosplice:禁止在Linux套接字上使用内核tcp重组,这会导致更多的recv/send系统调用;不过,在Linux 2.6.25-28系列的内核上,tcp重组功能有bug存在;

   - spread-checks <0..50, in percent>:在haproxy后端有着众多服务器的场景中,在精确的时间间隔后统一对众服务器进行健康状况检查可能会带来意外问题;此选项用于将其检查的时间间隔长度上增加或减小一定的随机时长;

   - tune.bufsize <number>:设定buffer的大小,同样的内存条件小,较小的值可以让haproxy有能力接受更多的并发连接,较大的值可以让某些应用程序使用较大的cookie信息;默认为16384,其可以在编译时修改,不过强烈建议使用默认值;

   - tune.chksize <number>:设定检查缓冲区的大小,单位为字节;更大的值有助于在较大的页面中完成基于字符串或模式的文本查找,但也会占用更多的系统资源;不建议修改;

   - tune.maxaccept <number>:设定haproxy进程内核调度运行时一次性可以接受的连接的个数,较大的值可以带来较大的吞吐率,默认在单进程模式下为100,多进程模式下为8,设定为-1可以禁止此限制;一般不建议修改;

   - tune.maxpollevents  <number>:设定一次系统调用可以处理的事件最大数,默认值取决于OS;其值小于200时可节约带宽,但会略微增大网络延迟,而大于200时会降低延迟,但会稍稍增加网络带宽的占用量;

   - tune.maxrewrite <number>:设定为首部重写或追加而预留的缓冲空间,建议使用1024左右的大小;在需要使用更大的空间时,haproxy会自动增加其值;

   - tune.rcvbuf.client <number>:

   - tune.rcvbuf.server <number>:设定内核套接字中服务端或客户端接收缓冲的大小,单位为字节;强烈推荐使用默认值;

   - tune.sndbuf.client:

   - tune.sndbuf.server:


 * Debug相关的参数

   - debug

   - quiet


2.5 代理


代理相关的配置可以如下配置段中。


 - defaults <name>

 - frontend <name>

 - backend  <name>

 - listen   <name>


 “defaults”段用于为所有其它配置段提供默认参数,这配置默认配置参数可由下一个“defaults”所重新设定。


 “frontend”段用于定义一系列监听的套接字,这些套接字可接受客户端请求并与之建立连接。


 “backend”段用于定义一系列“后端”服务器,代理将会将对应客户端的请求转发至这些服务器。


 “listen”段通过关联“前端”和“后端”定义了一个完整的代理,通常只对TCP流量有用。


 所有代理的名称只能使用大写字母、小写字母、数字、-(中线)、_(下划线)、.(点号)和:(冒号)。此外,ACL名称会区分字母大小写。




三、配置文件中的关键字参考


3.1 balance


balance <algorithm> [ <arguments> ]

balance url_param <param> [check_post [<max_wait>]]


定义负载均衡算法,可用于“defaults”、“listen”和“backend”。<algorithm>用于在负载均衡场景中挑选一个server,其仅应用于持久信息不可用的条件下或需要将一个连接重新派发至另一个服务器时。支持的算法有:


roundrobin:基于权重进行轮叫,在服务器的处理时间保持均匀分布时,这是最平衡、最公平的算法。此算法是动态的,这表示其权重可以在运行时进行调整,不过,在设计上,每个后端服务器仅能最多接受4128个连接;

static-rr:基于权重进行轮叫,与roundrobin类似,但是为静态方法,在运行时调整其服务器权重不会生效;不过,其在后端服务器连接数上没有限制;

leastconn:新的连接请求被派发至具有最少连接数目的后端服务器;在有着较长时间会话的场景中推荐使用此算法,如LDAP、SQL等,其并不太适用于较短会话的应用层协议,如HTTP;此算法是动态的,可以在运行时调整其权重;

source:将请求的源地址进行hash运算,并由后端服务器的权重总数相除后派发至某匹配的服务器;这可以使得同一个客户端IP的请求始终被派发至某特定的服务器;不过,当服务器权重总数发生变化时,如某服务器宕机或添加了新的服务器,许多客户端的请求可能会被派发至与此前请求不同的服务器;常用于负载均衡无cookie功能的基于TCP的协议;其默认为静态,不过也可以使用hash-type修改此特性;

uri:对URI的左半部分(“问题”标记之前的部分)或整个URI进行hash运算,并由服务器的总权重相除后派发至某匹配的服务器;这可以使得对同一个URI的请求总是被派发至某特定的服务器,除非服务器的权重总数发生了变化;此算法常用于代理缓存或反病毒代理以提高缓存的命中率;需要注意的是,此算法仅应用于HTTP后端服务器场景;其默认为静态算法,不过也可以使用hash-type修改此特性;

url_param:通过<argument>为URL指定的参数在每个HTTP GET请求中将会被检索;如果找到了指定的参数且其通过等于号“=”被赋予了一个值,那么此值将被执行hash运算并被服务器的总权重相除后派发至某匹配的服务器;此算法可以通过追踪请求中的用户标识进而确保同一个用户ID的请求将被送往同一个特定的服务器,除非服务器的总权重发生了变化;如果某请求中没有出现指定的参数或其没有有效值,则使用轮叫算法对相应请求进行调度;此算法默认为静态的,不过其也可以使用hash-type修改此特性;

hdr(<name>):对于每个HTTP请求,通过<name>指定的HTTP首部将会被检索;如果相应的首部没有出现或其没有有效值,则使用轮叫算法对相应请求进行调度;其有一个可选选项“use_domain_only”,可在指定检索类似Host类的首部时仅计算域名部分(比如通过www.magedu.com来说,仅计算magedu字符串的hash值)以降低hash算法的运算量;此算法默认为静态的,不过其也可以使用hash-type修改此特性;

rdp-cookie

rdp-cookie(name):


3.2 bind


bind [<address>]:<port_range> [, ...]

bind [<address>]:<port_range> [, ...] interface <interface>


此指令仅能用于frontend和listen区段,用于定义一个或几个监听的套接字。


<address>:可选选项,其可以为主机名、IPv4地址、IPv6地址或*;省略此选项、将其指定为*或0.0.0.0时,将监听当前系统的所有IPv4地址;

<port_range>:可以是一个特定的TCP端口,也可是一个端口范围(如5005-5010),代理服务器将通过指定的端口来接收客户端请求;需要注意的是,每组监听的套接字<address:port>在同一个实例上只能使用一次,而且小于1024的端口需要有特定权限的用户才能使用,这可能需要通过uid参数来定义?????;

<interface>:指定物理接口的名称,仅能在Linux系统上使用;其不能使用接口别名,而仅能使用物理接口名称,而且只有管理有权限指定绑定的物理接口;


3.3 mode


mode { tcp|http|health }


设定实例的运行模式或协议。当实现内容交换时,前端和后端必须工作于同一种模式(一般说来都是HTTP模式),否则将无法启动实例。


tcp:实例运行于纯TCP模式,在客户端和服务器端之间将建立一个全双工的连接,且不会对7层报文做任何类型的检查;此为默认模式,通常用于SSL、SSH、SMTP等应用;

http:实例运行于HTTP模式,客户端请求在转发至后端服务器之前将被深度分析,所有不与RFC格式兼容的请求都会被拒绝;

health:实例工作于health模式,其对入站请求仅响应“OK”信息并关闭连接,且不会记录任何日志信息;此模式将用于响应外部组件的健康状态检查请求;目前业讲,此模式已经废弃,因为tcp或http模式中的monitor关键字可完成类似功能;


3.4 hash-type


hash-type <method>


定义用于将hash码映射至后端服务器的方法;其不能用于frontend区段;可用方法有map-based和consistent,在大多数场景下推荐使用默认的map-based方法。


map-based:hash表是一个包含了所有在线服务器的静态数组。其hash值将会非常平滑,会将权重考虑在列,但其为静态方法,对在线服务器的权重进行调整将不会生效,这意味着其不支持慢速启动。此外,挑选服务器是根据其在数组中的位置进行的,因此,当一台服务器宕机或添加了一台新的服务器时,大多数连接将会被重新派发至一个与此前不同的服务器上,对于缓存服务器的工作场景来说,此方法不甚适用。

consistent:hash表是一个由各服务器填充而成的树状结构;基于hash键在hash树中查找相应的服务器时,最近的服务器将被选中。此方法是动态的,支持在运行时修改服务器权重,因此兼容慢速启动的特性。添加一个新的服务器时,仅会对一小部分请求产生影响,因此,尤其适用于后端服务器为cache的场景。不过,此算法不甚平滑,派发至各服务器的请求未必能达到理想的均衡效果,因此,可能需要不时的调整服务器的权重以获得更好的均衡性。


3.5 log


log global

log <address> <facility> [<level> [<minlevel>]]


为每个实例启用事件和流量日志,因此可用于所有区段。每个实例最多可以指定两个log参数,不过,如果使用了“log global”且"global"段已经定了两个log参数时,多余了log参数将被忽略。


global:当前实例的日志系统参数同"global"段中的定义时,将使用此格式;每个实例仅能定义一次“log global”语句,且其没有任何额外参数;

<address>:定义日志发往的位置,其格式之一可以为<IPv4_address:PORT>,其中的port为UDP协议端口,默认为514;格式之二为Unix套接字文件路径,但需要留心chroot应用及用户的读写权限;

<facility>:可以为syslog系统的标准facility之一;

<level>:定义日志级别,即输出信息过滤器,默认为所有信息;指定级别时,所有等于或高于此级别的日志信息将会被发送;


3.6 maxconn


maxconn <conns>


设定一个前端的最大并发连接数,因此,其不能用于backend区段。对于大型站点来说,可以尽可能提高此值以便让haproxy管理连接队列,从而避免无法应答用户请求。当然,此最大值不能超出“global”段中的定义。此外,需要留心的是,haproxy会为每个连接维持两个缓冲,每个缓冲的大小为8KB,再加上其它的数据,每个连接将大约占用17KB的RAM空间。这意味着经过适当优化后,有着1GB的可用RAM空间时将能维护40000-50000并发连接。


如果为<conns>指定了一个过大值,极端场景下,其最终占据的空间可能会超出当前主机的可用内存,这可能会带来意想不到的结果;因此,将其设定了一个可接受值方为明智决定。其默认为2000。


3.7 default_backend


default_backend <backend>


在没有匹配的"use_backend"规则时为实例指定使用的默认后端,因此,其不可应用于backend区段。在"frontend"和"backend"之间进行内容交换时,通常使用"use-backend"定义其匹配规则;而没有被规则匹配到的请求将由此参数指定的后端接收。


<backend>:指定使用的后端的名称;


使用案例:


use_backend     dynamic  if  url_dyn

use_backend     static   if  url_css url_img extension_img

default_backend dynamic


3.8 server


server <name> <address>[:port] [param*]


为后端声明一个server,因此,不能用于defaults和frontend区段。


<name>:为此服务器指定的内部名称,其将出现在日志及警告信息中;如果设定了"http-send-server-name",它还将被添加至发往此服务器的请求首部中;

<address>:此服务器的的IPv4地址,也支持使用可解析的主机名,只不过在启动时需要解析主机名至相应的IPv4地址;

[:port]:指定将连接请求所发往的此服务器时的目标端口,其为可选项;未设定时,将使用客户端请求时的同一相端口;

[param*]:为此服务器设定的一系参数;其可用的参数非常多,具体请参考官方文档中的说明,下面仅说明几个常用的参数;


服务器或默认服务器参数:

backup:设定为备用服务器,仅在负载均衡场景中的其它server均不可用于启用此server;

check:启动对此server执行健康状态检查,其可以借助于额外的其它参数完成更精细的设定,如:

inter <delay>:设定健康状态检查的时间间隔,单位为毫秒,默认为2000;也可以使用fastinter和downinter来根据服务器端状态优化此时间延迟;

rise <count>:设定健康状态检查中,某离线的server从离线状态转换至正常状态需要成功检查的次数;

fall <count>:确认server从正常状态转换为不可用状态需要检查的次数;

cookie <value>:为指定server设定cookie值,此处指定的值将在请求入站时被检查,第一次为此值挑选的server将在后续的请求中被选中,其目的在于实现持久连接的功能;

maxconn <maxconn>:指定此服务器接受的最大并发连接数;如果发往此服务器的连接数目高于此处指定的值,其将被放置于请求队列,以等待其它连接被释放;

maxqueue <maxqueue>:设定请求队列的最大长度;

observe <mode>:通过观察服务器的通信状况来判定其健康状态,默认为禁用,其支持的类型有“layer4”和“layer7”,“layer7”仅能用于http代理场景;

redir <prefix>:启用重定向功能,将发往此服务器的GET和HEAD请求均以302状态码响应;需要注意的是,在prefix后面不能使用/,且不能使用相对地址,以免造成循环;例如:

server srv1 172.16.100.6:80 redir http://imageserver.magedu.com check

weight <weight>:权重,默认为1,最大值为256,0表示不参与负载均衡;

检查方法:    #不能用于frontend段

option httpchk

option httpchk <uri>

option httpchk <method> <uri>

option httpchk <method> <uri> <version>:不能用于frontend段,例如:


backend https_relay

    mode tcp

    option httpchk OPTIONS * HTTP/1.1\r\nHost:\ www.magedu.com

    server apache1 192.168.1.1:443 check port 80




使用案例:

server first  172.16.100.7:1080 cookie first  check inter 1000

server second 172.16.100.8:1080 cookie second check inter 1000


#capture  捕获相关信息,捕获的结果主要是为了记录日志的

3.9 capture request header        #捕获请求报文头部

capture request header <name> len <length>


捕获并记录指定的请求首部最近一次出现时的第一个值,仅能用于“frontend”和“listen”区段。(因为到了backend就不是请求了)


捕获的首部值使用花括号{}括起来后添加进日志中。如果需要捕获多个首部值,它们将以指定的次序出现在日志文件中,并以竖线“|”作为分隔符。不存在的首部记录为空字符串,最常需要捕获的首部包括在虚拟主机环境中使用的“Host”、上传请求首部中的“Content-length”、快速区别真实用户(ie chrome这些浏览器)和网络机器人(百度 spider等)的“User-agent”,(curl中的 User-agent 就是 lb curl????? )以及代理环境中记录真实请求来源的“X-Forward-For”。( X-Forward-For就是将前端用户请求的地址转发至后端服务器上去,方便它记录日志的,在nginx上用的是X-Real-IP,功用近似 )


<name>:要捕获的首部的名称,此名称不区分字符大小写,但建议与它们出现在首部中的格式相同,比如大写首字母。需要注意的是,记录在日志中的是首部对应的值,而非首部名称。

<length>:指定记录首部值时所记录的精确长度,超出的部分将会被忽略。


可以捕获的请求首部的个数没有限制,但每个捕获最多只能记录64个字符。为了保证同一个frontend中日志格式的统一性,首部捕获仅能在frontend中定义。


3.10 capture response header        #捕获响应报文头部


capture response header <name> len <length>


捕获并记录响应首部,其格式和要点同请求首部。


3.11 stats enable        #状态启用,统计启用,启用gui接口,观察状态监控界面的


启用基于程序编译时默认设置的统计报告,不能用于“frontend”区段(因为我们监控的是,主要显示的是后端real server的相关状况的) (用在defaults listen backend上,,一般用在listen backend上)。只要没有另外的其它设定,它们就会使用如下的配置:


  - stats uri   : /haproxy?stats        #通过哪个路径去访问这个状态

  - stats realm : "HAProxy Statistics"        #默认情况下不需要认证,直接打开,,,,,,,状态观察,而且还能够甚至去关闭某一个real server的这种运行状态,很显然不能让其它用户随意查看,所以我们应该让它认证              realm(翻译为领域;场所;王国,但是这里是提示信息的意思?)

 <realm> is the name of the HTTP Basic Authentication realm reported to
          the browser. The browser uses it to display it in the pop-up
          inviting the user to enter a valid username and password.


  - stats auth  : no authentication        #进行认证的,,,, 帐号 密码

  - stats scope : no restriction        #只在哪个范围内限定


尽管“stats enable”一条就能够启用统计报告,但还是建议设定其它所有的参数,以免其依赖于默认设定而带来非期后果。下面是一个配置案例。


  backend public_www        #backend的名称是public_www     

    server websrv1 172.16.100.11:80        #只有一个server,没有定义健康状态检查的功能

    stats enable    #启用状态统计

    stats hide-version    #隐藏版本号

    stats scope   .        #表示只对当前状态????当前目录????当前区域????启用认证功能

    stats uri     /haproxyadmin?stats            #访问路径/haproxyadmin?stats

    stats realm   Haproxy\ Statistics             #如里需要用户认证的话,给用户提示的信息,,,,,为了保持空格,要使用反斜杠转义,否则空格有别的意义

    stats auth    statsadmin:password        #用户名密码

    stats auth    statsmaster:password        #又一个用户名密码



3.12 stats hide-version            #隐藏版本号


stats hide-version


启用统计报告并隐藏HAProxy版本报告(如果不隐藏的话,别人看到haproxy版本,易在网上搜到漏洞),不能用于“frontend”区段。默认情况下,统计页面会显示一些有用信息,包括HAProxy的版本号,然而,向所有人公开HAProxy的精确版本号是非常有风险的,因为它能帮助恶意用户快速定位版本的缺陷和漏洞。尽管“stats hide-version”一条就能够启用统计报告,但还是建议设定其它所有的参数,以免其依赖于默认设定而带来非期后果。具体请参照“stats enable”一节的说明。


3.13 stats realm


stats realm <realm>


启用统计报告并高精认证领域,不能用于“frontend”区段。haproxy在读取realm时会将其视作一个单词,因此,中间的任何空白字符都必须使用反斜线进行转义。此参数仅在与“stats auth”配置使用时有意义。


<realm>:实现HTTP基本认证时显示在浏览器中的领域名称,用于提示用户输入一个用户名和密码。


尽管“stats realm”一条就能够启用统计报告,但还是建议设定其它所有的参数,以免其依赖于默认设定而带来非期后果。具体请参照“stats enable”一节的说明。


3.14 stats scope


stats scope { <name> | "." }


启用统计报告并限定报告的区段,不能用于“frontend”区段。当指定此语句时,统计报告将仅显示其列举出区段的报告信息,所有其它区段的信息将被隐藏。如果需要显示多个区段的统计报告,此语句可以定义多次。需要注意的是,区段名称检测仅仅是以字符串比较的方式进行,它不会真检测指定的区段是否真正存在??????。


<name>:可以是一个“listen”、“frontend”或“backend”区段的名称,而“.”则表示stats scope语句所定义的当前区段。


尽管“stats scope”一条就能够启用统计报告,但还是建议设定其它所有的参数,以免其依赖于默认设定而带来非期后果。下面是一个配置案例。


backend private_monitoring

    stats enable

    stats uri     /haproxyadmin?stats

    stats refresh 10s


3.15 stats auth


stats auth <user>:<passwd>


启用带认证的统计报告功能并授权一个用户帐号,其不能用于“frontend”区段。


<user>:授权进行访问的用户名;

<passwd>:此用户的访问密码,明文格式;


此语句将基于默认设定启用统计报告功能,并仅允许其定义的用户访问,其也可以定义多次以授权多个用户帐号。可以结合“stats realm”参数在提示用户认证时给出一个领域说明信息。在使用非法用户访问统计功能时,其将会响应一个“401 Forbidden”页面。其认证方式为HTTP Basic认证,密码传输会以明文方式进行,因此,配置文件中也使用明文方式存储以说明其非保密信息故此不能相同于其它关键性帐号的密码。


尽管“stats auth”一条就能够启用统计报告,但还是建议设定其它所有的参数,以免其依赖于默认设定而带来非期后果。


3.16 stats admin        #默认打开图形界面以后,它是不能操作后端服务器的,意味着我们不能关闭后端服务器,这里提供admin功能就可以关闭了


stats admin { if | unless } <cond>        #假如 或假如不满足,我们就启动管理接口


在指定的条件满足时启用统计报告页面的管理级别功能,它允许通过web接口启用或禁用服务器,不过,基于安全的角度考虑,统计报告页面应该尽可能为只读的。此外,如果启用了HAProxy的多进程模式,启用此管理级别将有可能导致异常行为。


目前来说,POST请求方法被限制于仅能使用缓冲区减去保留部分之外的空间,因此,服务器列表不能过长??????,否则,此请求将无法正常工作??????。因此,建议一次仅调整少数几个服务器。下面是两个案例,第一个限制了仅能在本机打开报告页面时启用管理级别功能,第二个定义了仅允许通过认证的用户使用管理级别功能。


backend stats_localhost

    stats enable

    stats admin if LOCALHOST        #假如通过本机来连接的话,我们就允许启用管理接口


backend stats_auth

    stats enable

    stats auth  haproxyadmin:password

    stats admin if TRUE        #假如为真,满足条件了,(上一行提供的帐号和密码是对的),我们就允许启用管理接口


3.17 option httplog        #一般在反向代理web的时候,要开启


option httplog [ clf ]


启用记录HTTP请求、会话状态和计时器的功能。    #在日志中记录更丰富的信息,请求的是哪个资源,哪个uri,什么时间请求的,当前会话状态是什么等


clf:使用CLF格式来代替HAProxy默认的HTTP格式,通常在使用仅支持CLF格式的特定日志分析器时才需要使用此格式。


默认情况下,日志输入格式非常简陋,因为其仅包括源地址、目标地址和实例名称,而“option httplog”参数将会使得日志格式变得丰富许多,其通常包括但不限于HTTP请求、连接计时器、会话状态、连接数、捕获的首部及cookie、“frontend”、“backend”及服务器名称,当然也包括源地址和端口号等。


3.18 option logasap        #启用或禁用提前将HTTP请求记入日志,提前啥意思,见下图

     no option logasap


提前记录就是请求刚进来就进行记录了,这样记录有个坏处(我们记录的时候,通常记录什么时候进来,多长时间响应的,中间有个时长,响应信息是什么,别人的请求到底是不是正确的,,,后端还没返回,就记录日志了,,,,无法知道是正常的还是错误的请求或响应,,,)(提前记录好处,可以实现不用将日志信息在缓存保存太长时间,就能够写到磁盘上去的,,用户请求较大对象时,提前日志会带来性能上的提升的,)

image.png

option logasap

no option logasap


启用或禁用提前将HTTP请求记入日志,不能用于“backend”区段。


默认情况下,HTTP请求是在请求结束时进行记录以便能将其整体传输时长和字节数记入日志,由此,传较大的对象时,其记入日志的时长可能会略有延迟。“option logasap”参数能够在服务器发送complete首部时即时记录日志,只不过,此时将不记录整体传输时长和字节数。此情形下,捕获“Content-Length”响应首部来记录传输的字节数是一个较好选择。下面是一个例子。


  listen http_proxy 0.0.0.0:80

      mode http

      option httplog

      option logasap        #在listen上,            在backend上不可以用

      log 172.16.100.9 local2        #日志定位到 172.16.100.9上,而且使用local2这个facility来记录日志



3.19 option forwardfor        #将用户的请求转发至后端back server的时候,,如下图,可以给请求首部加个X-Forward-For首部,,X-Forward-For后面记录的是远程客户端的ip地址,,,当然haproxy代理的自己的地址也有,在ip首部当中?????????,,,,X-Forward-For记录在http首部当中????

一般我们应该加到后端去,让后端能够记录真实的请求者是谁,,,,不能的话,你会发现记录都是来自于代理服务器的,,,,,,,但是假如请求来自于haproxy代理自己,就没必要加X-Forward-For了,

image.png


option forwardfor [ except <network> ] [ header <name> ] [ if-none ]


# except <network>除了来自于哪个网络的,我们就不记了。


允许在发往服务器的请求首部中插入“X-Forwarded-For”首部。


<network>:可选参数,当指定时,源地址为匹配至此网络中的请求都禁用此功能。

<name>:可选参数,可使用一个自定义的首部,如“X-Client”来替代“X-Forwarded-For”。有些独特的web服务器的确需要用于一个独特的首部。

if-none:仅在此首部不存在时才将其添加至请求报文问道中。


HAProxy工作于反向代理模式,其发往服务器的请求中的客户端IP均为HAProxy主机的地址而非真正客户端的地址,这会使得服务器端的日志信息记录不了真正的请求来源,“X-Forwarded-For”首部则可用于解决此问题。HAProxy可以向每个发往服务器的请求上添加此首部,并以客户端IP为其value。


需要注意的是,HAProxy工作于隧道模式,其仅检查每一个连接的第一个请求,因此,仅第一个请求报文被附加此首部。如果想为每一个请求都附加此首部,请确保同时使用了“option httpclose”、“option forceclose”和“option http-server-close”几个option。


下面是一个例子。


frontend www

    mode http

    option forwardfor except 127.0.0.1        #来自于自己(127.0.0.1)的,就不用记了


3.20 errorfile        #当发生错误的时候,返回状态码了


errorfile <code> <file>


在用户请求不存在的页面时,返回一个页面文件给客户端而非由haproxy生成的错误代码;可用于所有段中。


<code>:指定对HTTP的哪些状态码返回指定的页面;这里可用的状态码有200、400、403、408、500、502、503和504;

<file>:指定用于响应的页面文件;


例如:

errorfile 400 /etc/haproxy/errorpages/400badreq.http        #当请求发生400错误时,返回400badreq.http错误页面,,提供更友好的出错信息页面,不然的话,是由haproxy自己生成错误状态码

errorfile 403 /etc/haproxy/errorpages/403forbid.http

errorfile 503 /etc/haproxy/errorpages/503sorry.http


3.21 errorloc 和 errorloc302     #请求错误时,重定向至某URL


errorloc <code> <url>

errorloc302 <code> <url>



请求错误时,返回一个HTTP重定向至某URL的信息;可用于所有配置段中。


<code>:指定对HTTP的哪些状态码返回指定的页面;这里可用的状态码有200、400、403、408、500、502、503和504;

<url>:Location首部中指定的页面位置的具体路径,可以是在当前服务器上的页面的相对路径,也可以使用绝对路径;需要注意的是,如果URI自身错误时产生某特定状态码信息的话,有可能会导致循环定向;


需要留意的是,这两个关键字都会返回302状态吗,这将使得客户端使用同样的HTTP方法获取指定的URL,对于非GET法的场景(如POST)来说会产生问题,因为返回客户的URL是不允许使用GET以外的其它方法的。如果的确有这种问题,可以使用errorloc303来返回303状态码给客户端。


3.22 errorloc303


errorloc303 <code> <url>


请求错误时,返回一个HTTP重定向至某URL的信息给客户端;可用于所有配置段中。


<code>:指定对HTTP的哪些状态码返回指定的页面;这里可用的状态码有400、403、408、500、502、503和504;

<url>:Location首部中指定的页面位置的具体路径,可以是在当前服务器上的页面的相对路径,也可以使用绝对路径;需要注意的是,如果URI自身错误时产生某特定状态码信息的话,有可能会导致循环定向;


例如:


backend webserver

  server 172.16.100.6 172.16.100.6:80 check maxconn 3000 cookie srv01

  server 172.16.100.7 172.16.100.7:80 check maxconn 3000 cookie srv02

  errorloc 403 /etc/haproxy/errorpages/sorry.htm        #errorloc是重定向,301或302的返回信息,,,,,,,,,,,errorfile是返回的是200的信息????

  errorloc 503 /etc/haproxy/errorpages/sorry.htm






一个配置示例:

#---------------------------------------------------------------------

# Global settings

#---------------------------------------------------------------------

global

    # to have these messages end up in /var/log/haproxy.log you will

    # need to:

    #

    # 1) configure syslog to accept network log events.  This is done

    #    by adding the '-r' option to the SYSLOGD_OPTIONS in

    #    /etc/sysconfig/syslog

    #

    # 2) configure local2 events to go to the /var/log/haproxy.log

    #   file. A line like the following can be added to

    #   /etc/sysconfig/syslog

    #

    #    local2.*                       /var/log/haproxy.log

    #

    log         127.0.0.1 local2


    chroot      /var/lib/haproxy

    pidfile     /var/run/haproxy.pid

    maxconn     4000

    user        haproxy

    group       haproxy

    daemon


defaults

    mode                    http

    log                     global

    option                  httplog

    option                  dontlognull

    option http-server-close

    option forwardfor       except 127.0.0.0/8

    option                  redispatch

    retries                 3

    timeout http-request    10s

    timeout queue           1m

    timeout connect         10s

    timeout client          1m

    timeout server          1m

    timeout http-keep-alive 10s

    timeout check           10s

    maxconn                 30000


listen stats

    mode http

    bind 0.0.0.0:1080

    stats enable

    stats hide-version

    stats uri     /haproxyadmin?stats

    stats realm   Haproxy\ Statistics

    stats auth    admin:admin

    stats admin if TRUE



frontend http-in        #向外提供服务的80端口

    bind *:80

    mode http

    log global

    option httpclose

    option logasap

    option dontlognull

    capture request  header Host len 20

    capture request  header Referer len 60

    default_backend servers


frontend healthcheck        #可以检查后端服务器的健康状况

    bind :1099

    mode http

    option httpclose

    option forwardfor

    default_backend servers


backend servers        #后端服务器2个

balance roundrobin        #rr,最公平的算法

    server websrv1 192.168.10.11:80 check maxconn 2000

    server websrv2 192.168.10.12:80 check maxconn 2000

    





负载均衡MySQL服务的配置示例


#---------------------------------------------------------------------

# Global settings

#---------------------------------------------------------------------

global

    # to have these messages end up in /var/log/haproxy.log you will

    # need to:

    #

    # 1) configure syslog to accept network log events.  This is done

    #    by adding the '-r' option to the SYSLOGD_OPTIONS in

    #    /etc/sysconfig/syslog

    #

    # 2) configure local2 events to go to the /var/log/haproxy.log

    #   file. A line like the following can be added to

    #   /etc/sysconfig/syslog

    #

    #    local2.*                       /var/log/haproxy.log

    #

    log         127.0.0.1 local2


    chroot      /var/lib/haproxy

    pidfile     /var/run/haproxy.pid

    maxconn     4000

    user        haproxy

    group       haproxy

    daemon


defaults

    mode                    tcp

    log                     global

    option                  httplog

    option                  dontlognull

    retries                 3

    timeout http-request    10s

    timeout queue           1m

    timeout connect         10s

    timeout client          1m

    timeout server          1m

    timeout http-keep-alive 10s

    timeout check           10s

    maxconn                 600


listen stats

    mode http

    bind 0.0.0.0:1080

    stats enable

    stats hide-version

    stats uri     /haproxyadmin?stats

    stats realm   Haproxy\ Statistics

    stats auth    admin:admin

    stats admin if TRUE



frontend mysql

    bind *:3306

    mode tcp

    log global

    default_backend mysqlservers


backend mysqlservers

    balance leastconn

    server dbsrv1 192.168.10.11:3306 check port 3306 intval 2 rise 1 fall 2 maxconn 300

    server dbsrv2 192.168.10.12:3306 check port 3306 intval 2 rise 1 fall 2 maxconn 300





如下图,配置规划

一个haproxy,两个后端web server,haproxy和两个web server,在同一个交换机上,使用同一个地址来交换????????,我们为了隐藏后面的web server,haproxy上也可以用两个网卡,一个网卡1面对外网用户,另一个网卡2直接跟两个 web server进行通信,这两个 web server指向网卡2就可以了,这类似于NAT模型,,,其实工作在NAT模型下或者类似于DR的模型下,(对于七层反向代理来讲)它们的意义都是一样的,,,,,甚至于使用一块网卡的方式,还不安全,,,因为一块网卡时,所有的主机(haproxy,和两个web server)都要使用公网地址????所以建议使用两块网卡的机制 

image.png

所有raid?????的方式来组建?




haproxy,可以源码编译安装,也可以rpm包安装

红帽6.4上自带haproxy的rpm包,6.3之前都没有,红帽5上也没有,,所以红帽5上自己编译安装,或者下载别人做好的rpm包进行安装

红帽6.4上通通可以使用系统自带的yum install就ok了,

马哥已经做好了红帽5的rpm包,而且样例都封装进去了,可以拿来直接用了,,所以简单修改,就可以直接用了



在haproxy主机上 192.168.0.60         马哥的ip当然不是 192.168.0.60,马哥删掉它,是删掉其中一张网卡设备吗

image.png

image.png


在haproxy主机上 192.168.0.60       

[root@master ~]# vim /etc/udev/rules.d/70-persistent-net.rules        #我这边只有一个,不用删

# This file was automatically generated by the /lib/udev/write_net_rules

# program, run by the persistent-net-generator.rules rules file.

#

# You can modify it, as long as you keep each rule on a single

# line, and change only the value of the NAME= key.


# PCI device 0x1022:0x2000 (pcnet32)

SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0c:29:03:74:88", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"



在haproxy主机上 192.168.0.60       

[root@master ~]# shutdown -h now    #关机


Broadcast message from root@master.magedu.com

        (/dev/pts/0) at 17:17 ...


The system is going down for halt NOW!

[root@master ~]#


在haproxy主机上 192.168.0.60     #添加网卡  (在关机状态下)

image.png

网络连接使用Host-only的方式

image.png


在haproxy主机上 192.168.0.60   启动电脑

在haproxy主机上 192.168.0.60  

[root@master ~]# ifconfig

eth0      Link encap:Ethernet  HWaddr 00:0C:29:03:74:88

          inet addr:192.168.0.60  Bcast:192.168.0.255  Mask:255.255.255.0

          inet6 addr: fe80::20c:29ff:fe03:7488/64 Scope:Link

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

          RX packets:68 errors:0 dropped:0 overruns:0 frame:0

          TX packets:69 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:1000

          RX bytes:7942 (7.7 KiB)  TX bytes:8057 (7.8 KiB)

          Interrupt:19 Base address:0x2000


lo        Link encap:Local Loopback

          inet addr:127.0.0.1  Mask:255.0.0.0

          inet6 addr: ::1/128 Scope:Host

          UP LOOPBACK RUNNING  MTU:65536  Metric:1

          RX packets:0 errors:0 dropped:0 overruns:0 frame:0

          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:0

          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)


[root@master ~]#

[root@master ~]# ifup eth1        #没有网卡  ifup????这是什么命令?

/sbin/ifup: 没有发现 eth1 配置。

用法:ifup <device name>

[root@master ~]#

[root@master ~]# ifconfig -a    #看到了 eth1

eth0      Link encap:Ethernet  HWaddr 00:0C:29:03:74:88

          inet addr:192.168.0.60  Bcast:192.168.0.255  Mask:255.255.255.0

          inet6 addr: fe80::20c:29ff:fe03:7488/64 Scope:Link

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

          RX packets:107 errors:0 dropped:0 overruns:0 frame:0

          TX packets:95 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:1000

          RX bytes:11401 (11.1 KiB)  TX bytes:11657 (11.3 KiB)

          Interrupt:19 Base address:0x2000


eth1      Link encap:Ethernet  HWaddr 00:0C:29:03:74:92

          BROADCAST MULTICAST  MTU:1500  Metric:1

          RX packets:0 errors:0 dropped:0 overruns:0 frame:0

          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:1000

          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

          Interrupt:19 Base address:0x2080


lo        Link encap:Local Loopback

          inet addr:127.0.0.1  Mask:255.0.0.0

          inet6 addr: ::1/128 Scope:Host

          UP LOOPBACK RUNNING  MTU:65536  Metric:1

          RX packets:0 errors:0 dropped:0 overruns:0 frame:0

          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:0

          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)


[root@master ~]#

在haproxy主机上 192.168.0.60   

[root@master ~]# ifconfig eth1 192.168.10.7/24 up    #启动eth1

[root@master ~]#

[root@master ~]# ifconfig

eth0      Link encap:Ethernet  HWaddr 00:0C:29:03:74:88

          inet addr:192.168.0.60  Bcast:192.168.0.255  Mask:255.255.255.0

          inet6 addr: fe80::20c:29ff:fe03:7488/64 Scope:Link

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

          RX packets:242 errors:0 dropped:0 overruns:0 frame:0

          TX packets:158 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:1000

          RX bytes:23755 (23.1 KiB)  TX bytes:19255 (18.8 KiB)

          Interrupt:19 Base address:0x2000


eth1      Link encap:Ethernet  HWaddr 00:0C:29:03:74:92    #启来了

          inet addr:192.168.10.7  Bcast:192.168.10.255  Mask:255.255.255.0

          inet6 addr: fe80::20c:29ff:fe03:7492/64 Scope:Link

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

          RX packets:0 errors:0 dropped:0 overruns:0 frame:0

          TX packets:6 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:1000

          RX bytes:0 (0.0 b)  TX bytes:468 (468.0 b)

          Interrupt:19 Base address:0x2080


lo        Link encap:Local Loopback

          inet addr:127.0.0.1  Mask:255.0.0.0

          inet6 addr: ::1/128 Scope:Host

          UP LOOPBACK RUNNING  MTU:65536  Metric:1

          RX packets:0 errors:0 dropped:0 overruns:0 frame:0

          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:0

          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)


[root@master ~]#




在第一个后端服务器 (使用apache ) 192.168.0.61

[root@slave ~]# netstat -tnlp

Active Internet connections (only servers)

Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name

tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN      1761/rpcbind

tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      2106/sshd

tcp        0      0 127.0.0.1:631               0.0.0.0:*                   LISTEN      1840/cupsd

tcp        0      0 0.0.0.0:44567               0.0.0.0:*                   LISTEN      1783/rpc.statd

tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      2625/master

tcp        0      0 :::3306                     :::*                        LISTEN      2588/mysqld

tcp        0      0 :::111                      :::*                        LISTEN      1761/rpcbind

tcp        0      0 :::80                       :::*                        LISTEN      2676/httpd    #80 apache开着

tcp        0      0 :::22                       :::*                        LISTEN      2106/sshd

tcp        0      0 ::1:631                     :::*                        LISTEN      1840/cupsd

tcp        0      0 ::1:25                      :::*                        LISTEN      2625/master

tcp        0      0 :::35873                    :::*                        LISTEN      1783/rpc.statd

[root@slave ~]#

[root@slave ~]# ifconfig

eth0      Link encap:Ethernet  HWaddr 00:0C:29:B4:40:A4

          inet addr:192.168.0.61  Bcast:192.168.0.255  Mask:255.255.255.0

          inet6 addr: fe80::20c:29ff:feb4:40a4/64 Scope:Link

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

          RX packets:414 errors:0 dropped:0 overruns:0 frame:0

          TX packets:179 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:1000

          RX bytes:45660 (44.5 KiB)  TX bytes:18337 (17.9 KiB)

          Interrupt:19 Base address:0x2000


lo        Link encap:Local Loopback

          inet addr:127.0.0.1  Mask:255.0.0.0

          inet6 addr: ::1/128 Scope:Host

          UP LOOPBACK RUNNING  MTU:65536  Metric:1

          RX packets:27 errors:0 dropped:0 overruns:0 frame:0

          TX packets:27 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:0

          RX bytes:2376 (2.3 KiB)  TX bytes:2376 (2.3 KiB)


[root@slave ~]#

#改下网卡

image.png

改成Host-only

image.png


#ifconfig

image.png

#ifconfig eth0 192.168.10.11/24     #把 192.168.0.61改ip地址为192. 168.10.11


# route add default gw 192.168.10.7    #加网关,192.168.10.7 是haproxy的网卡2的地址


在第二个后端服务器 (使用apache ) 192.168.0.62

#改下网卡

image.png

改成Host-only

image.png

#ifconfig

image.png

#ifconfig eth0 192.168.10.12/24     #把 192.168.0.62改ip地址为192. 168.10.12


# route add default gw 192.168.10.7    #加网关,192.168.10.7 是haproxy的网卡2的地址




在haproxy主机上 192.168.0.60       

[root@master ~]# ping 192.168.10.11    #可以ping通 (第一个后端服务器 (使用apache ) 192.168.0.61 改为了  192.168.10.11)

PING 192.168.10.11 (192.168.10.11) 56(84) bytes of data.

64 bytes from 192.168.10.11: icmp_seq=1 ttl=64 time=0.679 ms

64 bytes from 192.168.10.11: icmp_seq=2 ttl=64 time=0.822 ms

64 bytes from 192.168.10.11: icmp_seq=3 ttl=64 time=0.265 ms

[root@master ~]# ping 192.168.10.12  #可以ping通 (第二个后端服务器 (使用apache ) 192.168.0.62 改为了  192.168.10.12)

PING 192.168.10.12 (192.168.10.12) 56(84) bytes of data. 

64 bytes from 192.168.10.12: icmp_seq=1 ttl=64 time=2.15 ms

64 bytes from 192.168.10.12: icmp_seq=2 ttl=64 time=0.296 ms

64 bytes from 192.168.10.12: icmp_seq=3 ttl=64 time=0.289 ms


[root@master ~]# curl -I http://192.168.10.11        #没问题 (第一个后端服务器 (使用apache ) 192.168.0.61 改为了  192.168.10.11)

PING 192.168.10.11 (192.168.10.11) 56(84) bytes of data.

HTTP/1.1 200 OK

Date: Mon, 10 May 2021 10:16:25 GMT

Server: Apache/2.2.15 (Red Hat)

Last-Modified: Fri, 30 Apr 2021 02:33:56 GMT

ETag: "60009-1a-5c127718c4a06"

Accept-Ranges: bytes

Content-Length: 26

Connection: close

Content-Type: text/html; charset=UTF-8


[root@master ~]# curl -I http://192.168.10.12       #没问题 ( 第二个后端服务器 ( 使用apache ) 192.168.0.62 改为了  192.168.10.12 )

HTTP/1.1 200 OK

Date: Mon, 10 May 2021 10:16:26 GMT

Server: Apache/2.2.15 (Red Hat)

Last-Modified: Fri, 30 Apr 2021 02:19:36 GMT

ETag: "60025-1a-5c1273e4ac4af"

Accept-Ranges: bytes

Content-Length: 26

Connection: close

Content-Type: text/html; charset=UTF-8


[root@master ~]#


在haproxy主机上 192.168.0.60  

[root@master ~]# mount /dev/cdrom /media/cdrom/

mount: block device /dev/sr0 is write-protected, mounting read-only

[root@master ~]# yum install haproxy -y



[root@master ~]# yum install haproxy -y        #我这边系统没有自带 haproxy

已加载插件:product-id, search-disabled-repos, security, subscription-manager

This system is not registered with an entitlement server. You can use subscription-manager to register.

设置安装进程

No package haproxy available.

错误:无须任何处理

[root@master ~]#

#马哥 那边系统自带有 haproxy

image.png

image.png

马哥装的是haproxy  1.4.22-3.el6 haproxy.i686



在haproxy主机上 192.168.0.60

http://mirrors.aliyun.com/centos-vault/6.4/updates/i386/Packages/

http://mirrors.aliyun.com/centos-vault/6.4/os/i386/Packages/haproxy-1.4.22-3.el6.i686.rpm 

在haproxy主机上 192.168.0.60

[root@master ~]# wget http://mirrors.aliyun.com/centos-vault/6.4/os/i386/Packages/haproxy-1.4.22-3.el6.i686.rpm

--2021-05-11 12:26:51--  http://mirrors.aliyun.com/centos-vault/6.4/os/i386/Packages/haproxy-1.4.22-3.el6.i686.rpm

正在解析主机 mirrors.aliyun.com... 221.230.245.241, 221.229.169.241, 222.186.18.240, ...

正在连接 mirrors.aliyun.com|221.230.245.241|:80... 已连接。

已发出 HTTP 请求,正在等待回应... 200 OK

长度:451804 (441K) [application/x-redhat-package-manager]

正在保存至: “haproxy-1.4.22-3.el6.i686.rpm”


100%[======================================>] 451,804     --.-K/s   in 0.07s


2021-05-11 12:26:51 (5.84 MB/s) - 已保存 “haproxy-1.4.22-3.el6.i686.rpm” [451804/451804])


[root@master ~]# mount /dev/cdrom /media/cdrom/

mount: block device /dev/sr0 is write-protected, mounting read-only

[root@master ~]# yum localinstall -y haproxy-1.4.22-3.el6.i686.rpm

image.png


[root@master ~]# rpm -ql haproxy

/etc/haproxy    #配置文件目录

/etc/haproxy/haproxy.cfg        #主配置文件

/etc/logrotate.d/haproxy        #自动做日志滚动

/etc/rc.d/init.d/haproxy        #服务脚本

/usr/bin/halog

/usr/sbin/haproxy

/usr/share/doc/haproxy-1.4.22    #以下一堆帮助

/usr/share/doc/haproxy-1.4.22/CHANGELOG

/usr/share/doc/haproxy-1.4.22/LICENSE

/usr/share/doc/haproxy-1.4.22/README

/usr/share/doc/haproxy-1.4.22/acl-content-sw.cfg

/usr/share/doc/haproxy-1.4.22/acl.fig

/usr/share/doc/haproxy-1.4.22/architecture.txt

/usr/share/doc/haproxy-1.4.22/configuration.txt

/usr/share/doc/haproxy-1.4.22/content-sw-sample.cfg

/usr/share/doc/haproxy-1.4.22/cttproxy-src.cfg

/usr/share/doc/haproxy-1.4.22/design-thoughts

/usr/share/doc/haproxy-1.4.22/design-thoughts/backends-v0.txt

/usr/share/doc/haproxy-1.4.22/design-thoughts/backends.txt

/usr/share/doc/haproxy-1.4.22/design-thoughts/be-fe-changes.txt

/usr/share/doc/haproxy-1.4.22/design-thoughts/buffers.fig

/usr/share/doc/haproxy-1.4.22/design-thoughts/config-language.txt

/usr/share/doc/haproxy-1.4.22/design-thoughts/cttproxy-changes.txt

/usr/share/doc/haproxy-1.4.22/design-thoughts/how-it-works.txt

/usr/share/doc/haproxy-1.4.22/design-thoughts/http_load_time.url

/usr/share/doc/haproxy-1.4.22/design-thoughts/sess_par_sec.txt

/usr/share/doc/haproxy-1.4.22/gpl.txt

/usr/share/doc/haproxy-1.4.22/haproxy-en.txt

/usr/share/doc/haproxy-1.4.22/haproxy-fr.txt

/usr/share/doc/haproxy-1.4.22/haproxy.1

/usr/share/doc/haproxy-1.4.22/haproxy.cfg

/usr/share/doc/haproxy-1.4.22/internals

/usr/share/doc/haproxy-1.4.22/internals/connect-status.txt

/usr/share/doc/haproxy-1.4.22/internals/connection-header.txt

/usr/share/doc/haproxy-1.4.22/internals/connection-scale.txt

/usr/share/doc/haproxy-1.4.22/internals/header-parser-speed.txt

/usr/share/doc/haproxy-1.4.22/internals/header-tree.txt

/usr/share/doc/haproxy-1.4.22/internals/http-cookies.txt

/usr/share/doc/haproxy-1.4.22/internals/http-docs.txt

/usr/share/doc/haproxy-1.4.22/internals/http-parsing.txt

/usr/share/doc/haproxy-1.4.22/internals/naming.txt

/usr/share/doc/haproxy-1.4.22/internals/repartition-be-fe-fi.txt

/usr/share/doc/haproxy-1.4.22/internals/stats-v2.txt

/usr/share/doc/haproxy-1.4.22/internals/stream-sock-states.fig

/usr/share/doc/haproxy-1.4.22/internals/todo.cttproxy

/usr/share/doc/haproxy-1.4.22/lgpl.txt

/usr/share/doc/haproxy-1.4.22/queuing.fig

/usr/share/doc/haproxy-1.4.22/tarpit.cfg

/usr/share/doc/haproxy-1.4.22/url-switching.cfg

/usr/share/haproxy

/usr/share/haproxy/400.http    #以下几个错误页面

/usr/share/haproxy/403.http

/usr/share/haproxy/408.http

/usr/share/haproxy/500.http

/usr/share/haproxy/502.http

/usr/share/haproxy/503.http

/usr/share/haproxy/504.http

/usr/share/haproxy/README

/usr/share/man/man1/haproxy.1.gz

/var/lib/haproxy

[root@master ~]#


[root@master ~]# man haproxy

Cannot open the message catalog "man" for locale "zh_CN.UTF-8"

(NLSPATH="/usr/share/locale/%l/LC_MESSAGES/%N")


Formatting page, please wait...

HAPROXY(1)                                                          HAPROXY(1)


NAME

       HAProxy - fast and reliable http reverse proxy and load balancer


SYNOPSIS

       haproxy  -f  <configuration file>  [-n maxconn]  [-N maxconn] [-d] [-D]

       [-q] [-V] [-c] [-p <pidfile>] [-s] [-l] [-dk] [-ds] [-de]  [-dp]  [-db]

       [-m <megs>] [{-sf|-st} pidlist...]

        # -f 指定配置文件 /etc/haproxy 下的配置文件?????

        #-n maxconn   最大连接数,总的最大连接数

        #-N maxconn   最大连接数,每个listener的最大连接数  -N* listener的个数=-n

        #-d 前台运行,用于调试的

        #-D 后台运行,用于守护进程模式的,在配置文件中使用daemon也是可以的吧????

        #-q quiet 静默模式,

        #-V 详细模式

        #-c check 检查模式,检查配置文件是不是有语法错误的

        #-p pid 指定pid

        #

        #

        #

DESCRIPTION

       HAProxy  is  a  TCP/HTTP reverse proxy which is particularly suited for

       high availability environments. Indeed, it can:

        - route HTTP requests depending on statically assigned cookies ;

        - spread the load among several servers while assuring server

          persistence through the use of HTTP cookies ;

        - switch to backup servers in the event a main one fails ;

        - accept connections to special ports dedicated to service

          monitoring ;

        - stop accepting connections without breaking existing ones ;

        - add/modify/delete HTTP headers both ways ;

        - block requests matching a particular pattern ;

        - hold clients to the right application server depending on

          application cookies

        - report detailed status as HTML pages to authenticated users from an

          URI intercepted from the application.


       It needs very little resource. Its event-driven architecture allows  it

       to  easily  handle thousands of simultaneous connections on hundreds of

       instances without risking the system’s stability.


OPTIONS

       -f <configuration file>

              Specify configuration file path.


       -n <maxconn>

              Set the high limit for the total number of simultaneous  connec-

              tions.


       -N <maxconn>

              Set  the  high limit for the per-listener number of simultaneous

              connections.


       -d     Start in foregreound with  debugging  mode  enabled.   When  the

              proxy  runs in this mode, it dumps every connections, disconnec-

              tions, timestamps, and HTTP headers to stdout. This should NEVER

              be  used in an init script since it will prevent the system from

              starting up.


       -D     Start in daemon mode.


       -q     Disable messages on output.


       -V     Displays messages on output even when -q or ’quiet’  are  speci-

              fied.  Some  information  about pollers and config file are dis-

              played during startup.


       -c     Only checks config file and exits with code 0 if  no  error  was

              found, or exits with code 1 if a syntax error was found.


       -p <pidfile>

              Ask  the  process  to  write down each of its children’s pids to

              this file in daemon mode.


       -s     Show statistics (only if  compiled  in).   Statistics  are  only

              available  if compiled in with the ’STATTIME’ option.  It’s only

              used during code optimization phases, and will soon disappear.


       -l     Show even more statistics (implies ’-s’).


       -dk    Disable use of kqueue(). kqueue() is available only on BSD  sys-

              tems.


       -ds    Disable use of speculative epoll(). epoll() is available only on

              Linux 2.6 and some custom Linux 2.4 systems.


       -de    Disable use of epoll(). epoll() is available only on  Linux  2.6

              and some custom Linux 2.4 systems.


       -dp    Disables use of poll(). select() might be used instead.


       -db    Disables background mode (stays in foreground, useful for debug-

              ging).  For debugging, the ’-db’ option is  very  useful  as  it

              temporarily  disables  daemon  mode  and multi-process mode. The

              service can then be stopped by simply pressing  Ctrl-C,  without

              having to edit the config nor run full debug.


       -m <megs>

              Enforce a memory usage limit to a maximum of <megs> megabytes.


       -sf <pidlist>

              Send  FINISH  signal  to  the pids in pidlist after startup. The

              processes which receive this signal will wait for  all  sessions

              to  finish  before  exiting. This option must be specified last,

              followed by any number of PIDs.  Technically  speaking,  SIGTTOU

              and SIGUSR1 are sent.


       -st <pidlist>

              Send  TERMINATE signal to the pids in pidlist after startup. The

              processes which receive this signal will wait immediately termi-

              nate, closing all active sessions. This option must be specified

              last, followed by any  number  of  PIDs.  Technically  speaking,

              SIGTTOU and SIGTERM are sent.


LOGGING

..........................................



在haproxy主机上 192.168.0.60

红帽6上使用syslogng 的方式来记录日志????

[root@master haproxy]# yum list all | grep syslog        #好多都是远程的syslog,即 rsyslog

rsyslog.i686                           5.8.10-12.el6                       @anaconda-RedHatEnterpriseLinux-201805250237.i386/6.10

rsyslog-gnutls.i686                    5.8.10-12.el6                       Base

rsyslog-gssapi.i686                    5.8.10-12.el6                       Base

rsyslog-mysql.i686                     5.8.10-12.el6                       Base

rsyslog-pgsql.i686                     5.8.10-12.el6                       Base

rsyslog-relp.i686                      5.8.10-12.el6                       Base

rsyslog7.i686                          7.4.10-7.el6                        Base

rsyslog7-gnutls.i686                   7.4.10-7.el6                        Base

rsyslog7-gssapi.i686                   7.4.10-7.el6                        Base

rsyslog7-mysql.i686                    7.4.10-7.el6                        Base

rsyslog7-pgsql.i686                    7.4.10-7.el6                        Base

rsyslog7-relp.i686                     7.4.10-7.el6                        Base

sblim-cmpi-syslog.i686                 0.8.0-1.el6                         Base

[root@master haproxy]#

[root@master haproxy]# rpm -ql rsyslog

/etc/logrotate.d/syslog

/etc/pki/rsyslog

/etc/rc.d/init.d/rsyslog    #脚本

/etc/rsyslog.conf    #配置文件

/etc/rsyslog.d

/etc/sysconfig/rsyslog   #也是配置文件???

/lib/rsyslog

/lib/rsyslog/imfile.so

/lib/rsyslog/imklog.so

/lib/rsyslog/immark.so

/lib/rsyslog/impstats.so

/lib/rsyslog/imptcp.so

/lib/rsyslog/imtcp.so

/lib/rsyslog/imudp.so

/lib/rsyslog/imuxsock.so

/lib/rsyslog/lmnet.so

/lib/rsyslog/lmnetstrms.so

/lib/rsyslog/lmnsd_ptcp.so

/lib/rsyslog/lmregexp.so

/lib/rsyslog/lmstrmsrv.so

/lib/rsyslog/lmtcpclt.so

/lib/rsyslog/lmtcpsrv.so

/lib/rsyslog/lmzlibw.so

/lib/rsyslog/ommail.so

/lib/rsyslog/omprog.so

/lib/rsyslog/omruleset.so

/lib/rsyslog/omtesting.so

/lib/rsyslog/omuxsock.so

/lib/rsyslog/pmlastmsg.so

/sbin/rsyslogd

/usr/share/doc/rsyslog-5.8.10

/usr/share/doc/rsyslog-5.8.10/AUTHORS

/usr/share/doc/rsyslog-5.8.10/COPYING

/usr/share/doc/rsyslog-5.8.10/COPYING.ASL20

/usr/share/doc/rsyslog-5.8.10/COPYING.LESSER

/usr/share/doc/rsyslog-5.8.10/ChangeLog

/usr/share/doc/rsyslog-5.8.10/NEWS

/usr/share/doc/rsyslog-5.8.10/README

/usr/share/doc/rsyslog-5.8.10/bugs.html

/usr/share/doc/rsyslog-5.8.10/build_from_repo.html

/usr/share/doc/rsyslog-5.8.10/contributors.html

/usr/share/doc/rsyslog-5.8.10/debug.html

/usr/share/doc/rsyslog-5.8.10/dev_queue.html

/usr/share/doc/rsyslog-5.8.10/droppriv.html

/usr/share/doc/rsyslog-5.8.10/expression.html

/usr/share/doc/rsyslog-5.8.10/features.html

/usr/share/doc/rsyslog-5.8.10/generic_design.html

/usr/share/doc/rsyslog-5.8.10/gssapi.html

/usr/share/doc/rsyslog-5.8.10/history.html

/usr/share/doc/rsyslog-5.8.10/how2help.html

/usr/share/doc/rsyslog-5.8.10/im3195.html

/usr/share/doc/rsyslog-5.8.10/imfile.html

/usr/share/doc/rsyslog-5.8.10/imgssapi.html

/usr/share/doc/rsyslog-5.8.10/imklog.html

/usr/share/doc/rsyslog-5.8.10/impstats.html

/usr/share/doc/rsyslog-5.8.10/imptcp.html

/usr/share/doc/rsyslog-5.8.10/imrelp.html

/usr/share/doc/rsyslog-5.8.10/imsolaris.html

/usr/share/doc/rsyslog-5.8.10/imtcp.html

/usr/share/doc/rsyslog-5.8.10/imuxsock.html

/usr/share/doc/rsyslog-5.8.10/index.html

/usr/share/doc/rsyslog-5.8.10/install.html

/usr/share/doc/rsyslog-5.8.10/ipv6.html

/usr/share/doc/rsyslog-5.8.10/licensing.html

/usr/share/doc/rsyslog-5.8.10/log_rotation_fix_size.html

/usr/share/doc/rsyslog-5.8.10/manual.html

/usr/share/doc/rsyslog-5.8.10/mmsnmptrapd.html

/usr/share/doc/rsyslog-5.8.10/modules.html

/usr/share/doc/rsyslog-5.8.10/multi_ruleset.html

/usr/share/doc/rsyslog-5.8.10/netstream.html

/usr/share/doc/rsyslog-5.8.10/ns_gtls.html

/usr/share/doc/rsyslog-5.8.10/ns_ptcp.html

/usr/share/doc/rsyslog-5.8.10/omlibdbi.html

/usr/share/doc/rsyslog-5.8.10/ommail.html

/usr/share/doc/rsyslog-5.8.10/ommysql.html

/usr/share/doc/rsyslog-5.8.10/omoracle.html

/usr/share/doc/rsyslog-5.8.10/omrelp.html

/usr/share/doc/rsyslog-5.8.10/omruleset.html

/usr/share/doc/rsyslog-5.8.10/omsnmp.html

/usr/share/doc/rsyslog-5.8.10/omstdout.html

/usr/share/doc/rsyslog-5.8.10/omudpspoof.html

/usr/share/doc/rsyslog-5.8.10/omuxsock.html

/usr/share/doc/rsyslog-5.8.10/pmlastmsg.html

/usr/share/doc/rsyslog-5.8.10/property_replacer.html

/usr/share/doc/rsyslog-5.8.10/queues.html

/usr/share/doc/rsyslog-5.8.10/queues_analogy.html

/usr/share/doc/rsyslog-5.8.10/rainerscript.html

/usr/share/doc/rsyslog-5.8.10/rsconf1_actionexeconlywhenpreviousissuspended.html

/usr/share/doc/rsyslog-5.8.10/rsconf1_actionresumeinterval.html

/usr/share/doc/rsyslog-5.8.10/rsconf1_allowedsender.html

/usr/share/doc/rsyslog-5.8.10/rsconf1_controlcharacterescapeprefix.html

/usr/share/doc/rsyslog-5.8.10/rsconf1_debugprintcfsyslinehandlerlist.html

/usr/share/doc/rsyslog-5.8.10/rsconf1_debugprintmodulelist.html

/usr/share/doc/rsyslog-5.8.10/rsconf1_debugprinttemplatelist.html

/usr/share/doc/rsyslog-5.8.10/rsconf1_dircreatemode.html

/usr/share/doc/rsyslog-5.8.10/rsconf1_dirgroup.html

/usr/share/doc/rsyslog-5.8.10/rsconf1_dirowner.html

/usr/share/doc/rsyslog-5.8.10/rsconf1_dropmsgswithmaliciousdnsptrrecords.html

/usr/share/doc/rsyslog-5.8.10/rsconf1_droptrailinglfonreception.html

/usr/share/doc/rsyslog-5.8.10/rsconf1_dynafilecachesize.html

/usr/share/doc/rsyslog-5.8.10/rsconf1_escape8bitcharsonreceive.html

/usr/share/doc/rsyslog-5.8.10/rsconf1_escapecontrolcharactersonreceive.html

/usr/share/doc/rsyslog-5.8.10/rsconf1_failonchownfailure.html

/usr/share/doc/rsyslog-5.8.10/rsconf1_filecreatemode.html

/usr/share/doc/rsyslog-5.8.10/rsconf1_filegroup.html

/usr/share/doc/rsyslog-5.8.10/rsconf1_fileowner.html

/usr/share/doc/rsyslog-5.8.10/rsconf1_generateconfiggraph.html

/usr/share/doc/rsyslog-5.8.10/rsconf1_gssforwardservicename.html

/usr/share/doc/rsyslog-5.8.10/rsconf1_gsslistenservicename.html

/usr/share/doc/rsyslog-5.8.10/rsconf1_gssmode.html

/usr/share/doc/rsyslog-5.8.10/rsconf1_includeconfig.html

/usr/share/doc/rsyslog-5.8.10/rsconf1_mainmsgqueuesize.html

/usr/share/doc/rsyslog-5.8.10/rsconf1_markmessageperiod.html

/usr/share/doc/rsyslog-5.8.10/rsconf1_moddir.html

/usr/share/doc/rsyslog-5.8.10/rsconf1_modload.html

/usr/share/doc/rsyslog-5.8.10/rsconf1_repeatedmsgreduction.html

/usr/share/doc/rsyslog-5.8.10/rsconf1_resetconfigvariables.html

/usr/share/doc/rsyslog-5.8.10/rsconf1_rulesetcreatemainqueue.html

/usr/share/doc/rsyslog-5.8.10/rsconf1_rulesetparser.html

/usr/share/doc/rsyslog-5.8.10/rsconf1_umask.html

/usr/share/doc/rsyslog-5.8.10/rscript_abnf.html

/usr/share/doc/rsyslog-5.8.10/rsyslog_conf.html

/usr/share/doc/rsyslog-5.8.10/rsyslog_conf_actions.html

/usr/share/doc/rsyslog-5.8.10/rsyslog_conf_examples.html

/usr/share/doc/rsyslog-5.8.10/rsyslog_conf_filter.html

/usr/share/doc/rsyslog-5.8.10/rsyslog_conf_global.html

/usr/share/doc/rsyslog-5.8.10/rsyslog_conf_modules.html

/usr/share/doc/rsyslog-5.8.10/rsyslog_conf_nomatch.html

/usr/share/doc/rsyslog-5.8.10/rsyslog_conf_output.html

/usr/share/doc/rsyslog-5.8.10/rsyslog_conf_templates.html

/usr/share/doc/rsyslog-5.8.10/rsyslog_high_database_rate.html

/usr/share/doc/rsyslog-5.8.10/rsyslog_mysql.html

/usr/share/doc/rsyslog-5.8.10/rsyslog_ng_comparison.html

/usr/share/doc/rsyslog-5.8.10/rsyslog_packages.html

/usr/share/doc/rsyslog-5.8.10/rsyslog_pgsql.html

/usr/share/doc/rsyslog-5.8.10/rsyslog_php_syslog_ng.html

/usr/share/doc/rsyslog-5.8.10/rsyslog_recording_pri.html

/usr/share/doc/rsyslog-5.8.10/rsyslog_reliable_forwarding.html

/usr/share/doc/rsyslog-5.8.10/rsyslog_secure_tls.html

/usr/share/doc/rsyslog-5.8.10/rsyslog_stunnel.html

/usr/share/doc/rsyslog-5.8.10/rsyslog_tls.html

/usr/share/doc/rsyslog-5.8.10/syslog_parsing.html

/usr/share/doc/rsyslog-5.8.10/syslog_protocol.html

/usr/share/doc/rsyslog-5.8.10/tls_cert_ca.html

/usr/share/doc/rsyslog-5.8.10/tls_cert_client.html

/usr/share/doc/rsyslog-5.8.10/tls_cert_errmsgs.html

/usr/share/doc/rsyslog-5.8.10/tls_cert_machine.html

/usr/share/doc/rsyslog-5.8.10/tls_cert_scenario.html

/usr/share/doc/rsyslog-5.8.10/tls_cert_server.html

/usr/share/doc/rsyslog-5.8.10/tls_cert_summary.html

/usr/share/doc/rsyslog-5.8.10/tls_cert_udp_relay.html

/usr/share/doc/rsyslog-5.8.10/troubleshoot.html

/usr/share/doc/rsyslog-5.8.10/v3compatibility.html

/usr/share/doc/rsyslog-5.8.10/v4compatibility.html

/usr/share/doc/rsyslog-5.8.10/v5compatibility.html

/usr/share/doc/rsyslog-5.8.10/version_naming.html

/usr/share/man/man5/rsyslog.conf.5.gz

/usr/share/man/man8/rsyslogd.8.gz

/var/lib/rsyslog

[root@master haproxy]#







[root@master haproxy]# vim /etc/rsyslog.conf

.................................................................................

local7.*                                                /var/log/boot.log        #这里加下一行

local2.*                                                /var/log/haproxy.log

.................................................................................

[root@master haproxy]# service rsyslog restart    #重启rsyslog 

关闭系统日志记录器:                                       [确定]

启动系统日志记录器:-r option only supported in compatibility modes 0 to 2 - ignored        #这个报错啥意思????

                                                           [确定]

[root@master haproxy]#

[root@master haproxy]# vim /etc/sysconfig/rsyslog

# Options for rsyslogd

# Syslogd options are deprecated since rsyslog v3.

# If you want to use them, switch to compatibility mode 2 by "-c 2"

# See rsyslogd(8) for more details

#SYSLOGD_OPTIONS="-c 5"

#SYSLOGD_OPTIONS="-c 5 -r"    #把这里5,改成2       -c 2 才兼容此前的syslog

SYSLOGD_OPTIONS="-c 2 -r"    #这里-r 表示remote,远程?  -c表示compatibility,兼容

[root@master haproxy]# service rsyslog restart  #重启rsyslog 

关闭系统日志记录器:                                       [确定]

启动系统日志记录器:                                       [确定]

[root@master haproxy]#


配置haproxy的配置文件

在haproxy主机上 192.168.0.60

[root@master ~]# cd /etc/haproxy/

[root@master haproxy]# ls

haproxy.cfg

[root@master haproxy]# cp haproxy.cfg haproxy.cfg.bak

[root@master haproxy]#

[root@master haproxy]# vim haproxy.cfg

#---------------------------------------------------------------------

# Example configuration for a possible web application.  See the

# full configuration options online.

#

#   http://haproxy.1wt.eu/download/1.4/doc/configuration.txt

#

#---------------------------------------------------------------------


#---------------------------------------------------------------------

# Global settings

#---------------------------------------------------------------------

global

    # to have these messages end up in /var/log/haproxy.log you will

    # need to:

    #

    # 1) configure syslog to accept network log events.  This is done

    #    by adding the '-r' option to the SYSLOGD_OPTIONS in

    #    /etc/sysconfig/syslog

    #

    # 2) configure local2 events to go to the /var/log/haproxy.log

    #   file. A line like the following can be added to

    #   /etc/sysconfig/syslog

    #

    #    local2.*                       /var/log/haproxy.log

    #

    log         127.0.0.1 local2    #现在可以记录到local2了,,但是我们没有定义级别


    chroot      /var/lib/haproxy

    pidfile     /var/run/haproxy.pid

    maxconn     4000    #够用了

    user        haproxy

    group       haproxy

    daemon


    # turn on stats unix socket

    stats socket /var/lib/haproxy/stats


#---------------------------------------------------------------------

# common defaults that all the 'listen' and 'backend' sections will

# use if not designated in their block

#---------------------------------------------------------------------

defaults

    mode                    http

    log                     global

    option                  httplog    #启用记录HTTP请求、会话状态和计时器的功能。

    option                  dontlognull    #不记录空信息

    option http-server-close        #启用http-server 服务端关闭??????

    option forwardfor       except 127.0.0.0/8        #来自于这个地址都不添加到 forwardfor

    option                  redispatch    #重新分发,我们不用管它了,

    retries                 3

    timeout http-request    10s

    timeout queue           1m

    timeout connect         10s

    timeout client          1m

    timeout server          1m

    timeout http-keep-alive 10s

    timeout check           10s

    maxconn                 3000


#---------------------------------------------------------------------

# main frontend which proxys to the backends

#---------------------------------------------------------------------

#frontend  main *:5000    #用不着?

 #   acl url_static       path_beg       -i /static /images /javascript /stylesheets

 #   acl url_static       path_end       -i .jpg .gif .png .css .js


 #   use_backend static          if url_static

 #   default_backend             app


#---------------------------------------------------------------------

# static backend for serving up images, stylesheets and such

#---------------------------------------------------------------------

#backend static    #用不着?

#    balance     roundrobin

 #   server      static 127.0.0.1:4331 check


#---------------------------------------------------------------------

# round robin balancing between the various backends

#---------------------------------------------------------------------

#backend app    #用不着?

 #   balance     roundrobin

 #   server  app1 127.0.0.1:5001 check

  #  server  app2 127.0.0.1:5002 check

  #  server  app3 127.0.0.1:5003 check

  #  server  app4 127.0.0.1:5004 check


#下面是照着马哥写的

listen stats        #listen是前端后端都指定了,没有后端也没关系,因为它是状态统计的显示信息,专门打开监控接口的,跟我们的后端服务没关系

        mode http      #可以不用写

        bind *:1080    #监听地址   

        stats enable    #启用基于程序编译时默认设置的统计报告

        stats hide-version

        stats uri     /haproxyadmin?stats        #ip地址之后,加上这个链接地址才能访问的

        stats realm   Haproxy\ Statistics        #认证窗口,显示这样一个realm信息

        stats auth    admin:admin                #帐号和密码

        stats admin if TRUE            #只要验证通过,就会打开管理配置接口了


frontend web        #定义前端

        bind *:80

        log global    #日志怎么记录

        option httpclose    #仅第一个请求报文被附加此首部。如果想为每一个请求都附加此首部,请确保同时使用了“option httpclose”、“option forceclose”和“option http-server-close”几个option。??????

        option logasap    #启用或禁用提前将HTTP请求记入日志,

        option dontlognull    #只记录空日志信息,可以不用管

        capture request  header Host len 20    #抓取请求首部的Host的话,还要抓取Host信息的前20个字节保留下来

        capture request  header Referer len 60    #抓取请求首部的Referer(请求是从哪个链接跳转而来的,上一个url)的前60个字节保留下来

        default_backend servers    #默认使用哪个后端服务器,要定义这个 severs

backend servers        #定义后端

        balance roundrobin #指定调度算法为rr

        server web1 192.168.10.11:80 check maxconn 4000           #第一个后端服务器  :80可省 可使用weight指定权重,不指的话,默认为1  check可以实现健康状况检查的, (使用check时还可以指定 rise 1 到正常时检查次数,,fall 2 到失败时检查次数,,intval 2 间隔多长时间 ) maxconn是所接受的最大连接数,不指的话,默认是2000个

        server web2 192.168.10.12:80 check maxconn 3000                #第二个后端服务器  :80可省


[root@master haproxy]# haproxy -c

HA-Proxy version 1.4.22 2012/08/09

Copyright 2000-2012 Willy Tarreau <w@1wt.eu>


Usage : haproxy [-f <cfgfile>]* [ -vdVD ] [ -n <maxconn> ] [ -N <maxpconn> ]

        # -f 指定配置文件

    

        [ -p <pidfile> ] [ -m <max megs> ]

        -v displays version ; -vv shows known build options.

        -d enters debug mode ; -db only disables background mode.

        -V enters verbose mode (disables quiet mode)

        -D goes daemon

        -q quiet mode : don't display messages

        -c check mode : only check config files and exit    #检查配置文件和退出

        -n sets the maximum total # of connections (2000)

        -m limits the usable amount of memory (in MB)

        -N sets the default, per-proxy maximum # of connections (2000)

        -p writes pids of all children to this file

        -de disables epoll() usage even when available

        -ds disables speculative epoll() usage even when available

        -dp disables poll() usage even when available

        -sf/-st [pid ]* finishes/terminates old pids. Must be last arguments.


[root@master haproxy]#

[root@master haproxy]# haproxy -c -f /etc/haproxy/haproxy.cfg    #检查配置文件

Configuration file is valid

[root@master haproxy]#

[root@master haproxy]# service haproxy start        #80端口占用了

正在启动 haproxy:[ALERT] 130/163518 (3861) : Starting frontend web: cannot bind socket

                                                           [失败]

[root@master haproxy]#

[root@master haproxy]# chkconfig nginx off

[root@master haproxy]#

[root@master haproxy]# service nginx stop

停止 nginx:                                               [确定]

[root@master haproxy]# service haproxy start

正在启动 haproxy:                                         [确定]

[root@master haproxy]#

[root@master haproxy]# netstat -tnlp

Active Internet connections (only servers)

Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name

tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN      1768/rpcbind

tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      3900/haproxy    #监听了

tcp        0      0 0.0.0.0:58898               0.0.0.0:*                   LISTEN      1790/rpc.statd

tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      2128/sshd

tcp        0      0 127.0.0.1:631               0.0.0.0:*                   LISTEN      1847/cupsd

tcp        0      0 0.0.0.0:1080                0.0.0.0:*                   LISTEN      3900/haproxy    #监听了

tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      2465/master

tcp        0      0 127.0.0.1:9000              0.0.0.0:*                   LISTEN      2104/php-fpm

tcp        0      0 :::3306                     :::*                        LISTEN      2396/mysqld

tcp        0      0 :::37519                    :::*                        LISTEN      1790/rpc.statd

tcp        0      0 :::111                      :::*                        LISTEN      1768/rpcbind

tcp        0      0 :::22                       :::*                        LISTEN      2128/sshd

tcp        0      0 ::1:631                     :::*                        LISTEN      1847/cupsd

tcp        0      0 ::1:25                      :::*                        LISTEN      2465/master

[root@master haproxy]#

[root@master haproxy]# ps auxf

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND

root         2  0.0  0.0      0     0 ?        S    11:48   0:00 [kthreadd]

root         3  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [migration/0]

root         4  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [ksoftirqd/0]

root         5  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [stopper/0]

root         6  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [watchdog/0]

root         7  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [migration/1]

root         8  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [stopper/1]

root         9  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [ksoftirqd/1]

root        10  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [watchdog/1]

root        11  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [migration/2]

root        12  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [stopper/2]

root        13  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [ksoftirqd/2]

root        14  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [watchdog/2]

root        15  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [migration/3]

root        16  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [stopper/3]

root        17  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [ksoftirqd/3]

root        18  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [watchdog/3]

root        19  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [migration/4]

root        20  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [stopper/4]

root        21  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [ksoftirqd/4]

root        22  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [watchdog/4]

root        23  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [migration/5]

root        24  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [stopper/5]

root        25  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [ksoftirqd/5]

root        26  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [watchdog/5]

root        27  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [migration/6]

root        28  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [stopper/6]

root        29  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [ksoftirqd/6]

root        30  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [watchdog/6]

root        31  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [migration/7]

root        32  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [stopper/7]

root        33  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [ksoftirqd/7]

root        34  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [watchdog/7]

root        35  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [events/0]

root        36  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [events/1]

root        37  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [events/2]

root        38  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [events/3]

root        39  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [events/4]

root        40  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [events/5]

root        41  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [events/6]

root        42  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [events/7]

root        43  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [events/0]

root        44  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [events/1]

root        45  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [events/2]

root        46  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [events/3]

root        47  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [events/4]

root        48  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [events/5]

root        49  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [events/6]

root        50  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [events/7]

root        51  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [events_long/0]

root        52  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [events_long/1]

root        53  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [events_long/2]

root        54  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [events_long/3]

root        55  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [events_long/4]

root        56  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [events_long/5]

root        57  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [events_long/6]

root        58  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [events_long/7]

root        59  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [events_power_ef]

root        60  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [events_power_ef]

root        61  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [events_power_ef]

root        62  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [events_power_ef]

root        63  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [events_power_ef]

root        64  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [events_power_ef]

root        65  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [events_power_ef]

root        66  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [events_power_ef]

root        67  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [cgroup]

root        68  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [khelper]

root        69  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [netns]

root        70  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [async/mgr]

root        71  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [pm]

root        72  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [sync_supers]

root        73  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [bdi-default]

root        74  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [kintegrityd/0]

root        75  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [kintegrityd/1]

root        76  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [kintegrityd/2]

root        77  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [kintegrityd/3]

root        78  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [kintegrityd/4]

root        79  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [kintegrityd/5]

root        80  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [kintegrityd/6]

root        81  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [kintegrityd/7]

root        82  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [kblockd/0]

root        83  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [kblockd/1]

root        84  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [kblockd/2]

root        85  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [kblockd/3]

root        86  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [kblockd/4]

root        87  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [kblockd/5]

root        88  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [kblockd/6]

root        89  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [kblockd/7]

root        90  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [kacpid]

root        91  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [kacpi_notify]

root        92  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [kacpi_hotplug]

root        93  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [ata_aux]

root        94  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [ata_sff/0]

root        95  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [ata_sff/1]

root        96  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [ata_sff/2]

root        97  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [ata_sff/3]

root        98  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [ata_sff/4]

root        99  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [ata_sff/5]

root       100  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [ata_sff/6]

root       101  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [ata_sff/7]

root       102  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [ksuspend_usbd]

root       103  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [khubd]

root       104  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [kseriod]

root       105  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [md/0]

root       106  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [md/1]

root       107  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [md/2]

root       108  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [md/3]

root       109  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [md/4]

root       110  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [md/5]

root       111  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [md/6]

root       112  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [md/7]

root       113  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [md_misc/0]

root       114  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [md_misc/1]

root       115  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [md_misc/2]

root       116  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [md_misc/3]

root       117  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [md_misc/4]

root       118  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [md_misc/5]

root       119  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [md_misc/6]

root       120  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [md_misc/7]

root       121  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [linkwatch]

root       122  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [khungtaskd]

root       123  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [lru-add-drain/0]

root       124  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [lru-add-drain/1]

root       125  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [lru-add-drain/2]

root       126  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [lru-add-drain/3]

root       127  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [lru-add-drain/4]

root       128  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [lru-add-drain/5]

root       129  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [lru-add-drain/6]

root       130  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [lru-add-drain/7]

root       131  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [kswapd0]

root       132  0.0  0.0      0     0 ?        SN   11:48   0:00  \_ [ksmd]

root       133  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [aio/0]

root       134  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [aio/1]

root       135  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [aio/2]

root       136  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [aio/3]

root       137  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [aio/4]

root       138  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [aio/5]

root       139  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [aio/6]

root       140  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [aio/7]

root       141  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [crypto/0]

root       142  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [crypto/1]

root       143  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [crypto/2]

root       144  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [crypto/3]

root       145  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [crypto/4]

root       146  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [crypto/5]

root       147  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [crypto/6]

root       148  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [crypto/7]

root       155  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [kthrotld/0]

root       156  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [kthrotld/1]

root       157  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [kthrotld/2]

root       158  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [kthrotld/3]

root       159  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [kthrotld/4]

root       160  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [kthrotld/5]

root       161  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [kthrotld/6]

root       162  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [kthrotld/7]

root       163  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [pciehpd]

root       165  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [kpsmoused]

root       166  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [usbhid_resumer]

root       167  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [deferwq]

root       200  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [kdmremove]

root       201  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [kstriped]

root       230  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [ttm_swap]

root       408  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [scsi_eh_0]

root       409  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [scsi_eh_1]

root       480  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [mpt_poll_0]

root       481  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [mpt/0]

root       482  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [scsi_eh_2]

root       568  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [kdmflush]

root       570  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [kdmflush]

root       636  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [jbd2/dm-0-8]

root       637  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [ext4-dio-unwrit]

root       867  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [flush-253:0]

root       927  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [vmmemctl]

root      1227  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [jbd2/sda1-8]

root      1228  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [ext4-dio-unwrit]

root      1326  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [kauditd]

root      1385  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [ib_addr]

root      1390  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [infiniband/0]

root      1391  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [infiniband/1]

root      1392  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [infiniband/2]

root      1393  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [infiniband/3]

root      1394  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [infiniband/4]

root      1395  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [infiniband/5]

root      1396  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [infiniband/6]

root      1397  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [infiniband/7]

root      1406  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [ib_mcast]

root      1411  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [iw_cm_wq]

root      1417  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [ib_cm/0]

root      1418  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [ib_cm/1]

root      1419  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [ib_cm/2]

root      1420  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [ib_cm/3]

root      1421  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [ib_cm/4]

root      1422  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [ib_cm/5]

root      1423  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [ib_cm/6]

root      1424  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [ib_cm/7]

root      1429  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [rdma_cm]

root      1450  0.0  0.0      0     0 ?        S    11:48   0:00  \_ [ipoib_flush]

root         1  0.0  0.0   2900  1436 ?        Ss   11:48   0:07 /sbin/init

root       744  0.0  0.0   2716  1016 ?        S<s  11:48   0:00 /sbin/udevd -d

root      2749  0.0  0.0   3372  1848 ?        S<   11:49   0:00  \_ /sbin/udevd -d

root      2750  0.0  0.0   3372  1836 ?        S<   11:49   0:00  \_ /sbin/udevd -d

root      1682  0.0  0.0  13016   848 ?        S<sl 11:48   0:00 auditd

root      1750  0.0  0.0   3708   768 ?        Ss   11:49   0:00 irqbalance --pid=/var/run/irqbalance.pid

rpc       1768  0.0  0.0   2584   840 ?        Ss   11:49   0:00 rpcbind

rpcuser   1790  0.0  0.0   2852  1272 ?        Ss   11:49   0:00 rpc.statd

dbus      1825  0.0  0.0  13276  1096 ?        Ssl  11:49   0:00 dbus-daemon --system

root      1847  0.0  0.1  13224  2784 ?        Ss   11:49   0:00 cupsd -C /etc/cups/cupsd.conf

root      1879  0.0  0.0   2020   608 ?        Ss   11:49   0:00 /usr/sbin/acpid

68        1891  0.0  0.2  17328  4408 ?        Ssl  11:49   0:00 hald

root      1892  0.0  0.0   4052  1264 ?        S    11:49   0:00  \_ hald-runner

root      1924  0.0  0.0   4124  1184 ?        S    11:49   0:00      \_ hald-addon-input: Listening on /dev/

68        1935  0.0  0.0   3712  1068 ?        S    11:49   0:00      \_ hald-addon-acpi: listening on acpid

root      1959  0.0  0.0  32492  1772 ?        Ssl  11:49   0:00 automount --pid-file /var/run/autofs.pid

root      2104  0.0  0.1  42028  3480 ?        Ss   11:49   0:00 php-fpm: master process (/usr/local/php/etc/

nobody    2105  0.0  0.1  42028  2624 ?        S    11:49   0:00  \_ php-fpm: pool www

nobody    2106  0.0  0.1  42028  2624 ?        S    11:49   0:00  \_ php-fpm: pool www

nobody    2107  0.0  0.1  42028  2624 ?        S    11:49   0:00  \_ php-fpm: pool www

nobody    2108  0.0  0.1  42028  2624 ?        S    11:49   0:00  \_ php-fpm: pool www

nobody    2109  0.0  0.1  42028  2624 ?        S    11:49   0:00  \_ php-fpm: pool www

nobody    2110  0.0  0.1  42028  2624 ?        S    11:49   0:00  \_ php-fpm: pool www

nobody    2111  0.0  0.1  42028  2624 ?        S    11:49   0:00  \_ php-fpm: pool www

nobody    2112  0.0  0.1  42028  2624 ?        S    11:49   0:00  \_ php-fpm: pool www

root      2128  0.0  0.0   8708  1080 ?        Ss   11:49   0:00 /usr/sbin/sshd

root      3103  0.0  0.1  11772  3860 ?        Ss   12:25   0:00  \_ sshd: root@pts/0

root      3107  0.0  0.0   6840  1748 pts/0    Ss   12:25   0:00      \_ -bash

root      3910  0.0  0.0   6668  1116 pts/0    R+   16:37   0:00          \_ ps auxf

ntp       2139  0.0  0.0   5404  1712 ?        Ss   11:49   0:00 ntpd -u ntp:ntp -p /var/run/ntpd.pid -g

root      2156  0.0  0.0   6280  1428 ?        S    11:49   0:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --d

mysql     2396  0.0  4.3 428632 83508 ?        Sl   11:49   0:09  \_ /usr/local/mysql/bin/mysqld --basedir=/u

root      2465  0.0  0.1  12792  2616 ?        Ss   11:49   0:00 /usr/libexec/postfix/master

postfix   2478  0.0  0.1  12944  2644 ?        S    11:49   0:00  \_ qmgr -l -t fifo -u

postfix   3628  0.0  0.1  12868  2592 ?        S    15:09   0:00  \_ pickup -l -t fifo -u

root      2489  0.0  0.1  15140  2184 ?        Ss   11:49   0:00 /usr/sbin/abrtd

root      2628  0.0  0.0   6804  1300 ?        Ss   11:49   0:00 crond

root      2647  0.0  0.0   2648   472 ?        Ss   11:49   0:00 /usr/sbin/atd

root      2665  0.0  0.0   6520   748 ?        Ss   11:49   0:00 /usr/bin/rhsmcertd

root      2682  0.0  0.0   9008  1256 ?        Ss   11:49   0:00 /usr/sbin/certmonger -S -p /var/run/certmong

root      2733  0.0  0.0   2008   484 tty1     Ss+  11:49   0:00 /sbin/mingetty /dev/tty1

root      2736  0.0  0.0   2008   480 tty2     Ss+  11:49   0:00 /sbin/mingetty /dev/tty2

root      2739  0.0  0.0   2008   480 tty3     Ss+  11:49   0:00 /sbin/mingetty /dev/tty3

root      2741  0.0  0.0   2008   488 tty4     Ss+  11:49   0:00 /sbin/mingetty /dev/tty4

root      2743  0.0  0.0   2008   484 tty5     Ss+  11:49   0:00 /sbin/mingetty /dev/tty5

root      2745  0.0  0.0   2008   484 tty6     Ss+  11:49   0:00 /sbin/mingetty /dev/tty6

root      3513  0.0  0.0  47268  1448 ?        Sl   14:21   0:00 /sbin/rsyslogd -i /var/run/syslogd.pid -c 2

haproxy   3900  0.0  0.0   3520  1136 ?        Ss   16:35   0:00 /usr/sbin/haproxy -D -f /etc/haproxy/haproxy    #可以看到haproxy的启动命令

[root@master haproxy]#

[root@master haproxy]# ps auxf | grep haproxy

root      3915  0.0  0.0   6048   800 pts/0    S+   16:38   0:00          \_ grep haproxy

haproxy   3900  0.0  0.0   3520  1136 ?        Ss   16:35   0:00 /usr/sbin/haproxy -D -f /etc/haproxy/haproxy.cfg -p /var/run/haproxy.pid     #可以看到haproxy的启动命令

[root@master haproxy]#




http://192.168.0.60/     正常,刷新后会变化的,说明负载均衡了

image.png


image.png



http://192.168.0.60:1080/haproxyadmin?stats     访问状态统计

看到了realm 信息 Haproxy Statistics


image.png



输入了用户名 admin 密码 admin

image.png


http://192.168.0.60:1080/haproxyadmin?stats 


image.png





在第二个后端服务器 (使用apache ) 192.168.0.62 改为了  192.168.10.12

# sevice httpd stop

image.png


http://192.168.0.60:1080/haproxyadmin?stats  刷新看看

image.png


可以看到 web2 down了

image.png


如下图,操作是无效的,,,,只有自己在此图禁用,才能在此图启用,,相当时临时起作用的意思吧,,,,,可不能向真正的后台服务器发命令的

image.png



在第二个后端服务器 (使用apache ) 192.168.0.62 改为了  192.168.10.12

# sevice httpd start

image.png



再刷新

image.png


web2 又正常了 up 了

image.png

隐藏掉down掉的server

image.png



将当前服务器的统计状态报告输出为csv格式

image.png



image.png


在haproxy主机上 192.168.0.60       

[root@master ~]# cd /etc/haproxy/

[root@master haproxy]# vim haproxy.cfg

..........................................................................................

#frontend,backend可以完全使用一个listen来定义

frontend web

        bind *:80

        log global

        option httpclose

        option logasap

        option dontlognull

        capture request  header Host len 20

        capture request  header Referer len 60

        default_backend servers

backend servers

        balance roundrobin    #如果后端是一些缓存服务器的话,balance 可以使用uri????使用uri时可以使用hash_type???指定类型为consistent????使用一致性hash,只影响局部?????但是它的负载均衡效果不好

        server web1 192.168.10.11:80 check maxconn 4000

        server web2 192.168.10.12:80 check maxconn 3000


..........................................................................................



haproxy的其它功能,一般用不上,马哥不细说了,,

关键要记住几个调度算法,什么样的场景下更适合使用什么样的调度算法,,,

server的健康状态检查如何定义,最大连接数如何定义,状态统计输出信息如何定义

haproxy的acl的应用???马哥不讲了

haproxy的检查方法?马哥讲过,建议试试



keepalive最适合与haproxy结合起来做前端高可用的,马哥让整合起来试试

keepalive+haproxy,keepalive+nginx,keepalive+lvs 三种比较常用


        keepalive+haproxy:反向代理方面更好用,转发性能比nginx强,在7层工作,可以转发很多,可以处理很多http本身才能够处理的机制,,,,nginx的转发能力不如haproxy,,,,但它们都不如lvs,,,,,,,,,,,,根据网站架构的牵移规模来进行选择它们


不到最后的某一时刻,不必深入特别研究某一服务,,,,将来用到的时候,只会选一个服务,不会全部都要学,,,,马哥说讲的够用了




负载均衡MySQL服务的配置示例


#---------------------------------------------------------------------

# Global settings

#---------------------------------------------------------------------

global

    # to have these messages end up in /var/log/haproxy.log you will

    # need to:

    #

    # 1) configure syslog to accept network log events.  This is done

    #    by adding the '-r' option to the SYSLOGD_OPTIONS in

    #    /etc/sysconfig/syslog

    #

    # 2) configure local2 events to go to the /var/log/haproxy.log

    #   file. A line like the following can be added to

    #   /etc/sysconfig/syslog

    #

    #    local2.*                       /var/log/haproxy.log

    #

    log         127.0.0.1 local2


    chroot      /var/lib/haproxy

    pidfile     /var/run/haproxy.pid

    maxconn     4000

    user        haproxy

    group       haproxy

    daemon


defaults

    mode                    tcp

    log                     global

    option                  httplog

    option                  dontlognull

    retries                 3

    timeout http-request    10s

    timeout queue           1m

    timeout connect         10s

    timeout client          1m

    timeout server          1m

    timeout http-keep-alive 10s

    timeout check           10s

    maxconn                 600


listen stats

    mode http

    bind 0.0.0.0:1080

    stats enable

    stats hide-version

    stats uri     /haproxyadmin?stats

    stats realm   Haproxy\ Statistics

    stats auth    admin:admin

    stats admin if TRUE



frontend mysql        #haproxy可以代理mysql  ,,,对于mysql,前端调度器可以使用lvs,也可以使用haproxy

    bind *:3306    #绑定3306

    mode tcp        #mysql时,mode要为tcp

    log global        #log为global的

    default_backend mysqlservers


backend mysqlservers

    balance leastconn        #较长时间连接的服务器上,可以使用leastconn,最适合ldap或sql这样的协议

    server dbsrv1 192.168.10.11:3306 check port 3306 intval 2 rise 1 fall 2 maxconn 300        # check port 3306检查端口为3306,,,port不指的话,这里默认为3306,,,,,如果基于tcp来check的话,不指的话,它可以检查对应这里192.168.10.11:3306指定的port

             #server dbsrv1 192.168.10.11:3306 check intval 2 rise 1 fall 2 maxconn 300   

            #server dbsrv1 192.168.10.11:3306 check port 3306 intval 2 rise 1 fall 2 maxconn 300     #假如检查非3306端口,  比如想通过3309端口来检查服务是否正常??????(怎么可能是另一个端口,感觉必须要检查3306,,因为事实上就连到后端的3306端口),可以使用 check port 3309 ,此时  intval 2 rise 1 fall 2 这些参数都用得上了?????不理解,难道不使用 check port 3309,,,,,,就用不上,,,,,,,, 只要端口是打开,就认为是正常的,不会去真正检查mysql的服务倒底是否正常,,,,,,,可以使用option来进行额外的命令检查,

    server dbsrv2 192.168.10.12:3306 check port 3306 intval 2 rise 1 fall 2 maxconn 300




http://www.haproxy.com 

http://www.haproxy.org

http://www.haproxy.org/#docs 


image.png


http://www.haproxy.org/#doc2.4

image.png


http://cbonte.github.io/haproxy-dconv/2.4/configuration.html

这里可以看到从全局的到各个参数,用来用到哪个查哪个,

haproxy的acl用到的可能性小,acl有一个目的动静分离,可能会用得上,,,,

动态内容请求时到php上,静态内容请求时到图片服务器上



试试将mysql的请求负载均衡到不同的服务器上去,




普通分类: