欢迎各位兄弟 发布技术文章
这里的技术是共享的
一、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
提前记录就是请求刚进来就进行记录了,这样记录有个坏处(我们记录的时候,通常记录什么时候进来,多长时间响应的,中间有个时长,响应信息是什么,别人的请求到底是不是正确的,,,后端还没返回,就记录日志了,,,,无法知道是正常的还是错误的请求或响应,,,)(提前记录好处,可以实现不用将日志信息在缓存保存太长时间,就能够写到磁盘上去的,,用户请求较大对象时,提前日志会带来性能上的提升的,)
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了,
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)都要使用公网地址????所以建议使用两块网卡的机制
所有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,马哥删掉它,是删掉其中一张网卡设备吗
在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 #添加网卡 (在关机状态下)
网络连接使用Host-only的方式
在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 ~]#
#改下网卡
改成Host-only
#ifconfig
#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
#改下网卡
改成Host-only
#ifconfig
#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
马哥装的是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
[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/ 正常,刷新后会变化的,说明负载均衡了
http://192.168.0.60:1080/haproxyadmin?stats 访问状态统计
看到了realm 信息 Haproxy Statistics
输入了用户名 admin 密码 admin
http://192.168.0.60:1080/haproxyadmin?stats
在第二个后端服务器 (使用apache ) 192.168.0.62 改为了 192.168.10.12
# sevice httpd stop
http://192.168.0.60:1080/haproxyadmin?stats 刷新看看
可以看到 web2 down了
如下图,操作是无效的,,,,只有自己在此图禁用,才能在此图启用,,相当时临时起作用的意思吧,,,,,可不能向真正的后台服务器发命令的
在第二个后端服务器 (使用apache ) 192.168.0.62 改为了 192.168.10.12
# sevice httpd start
再刷新
web2 又正常了 up 了
隐藏掉down掉的server
将当前服务器的统计状态报告输出为csv格式
在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.org/#doc2.4
http://cbonte.github.io/haproxy-dconv/2.4/configuration.html
这里可以看到从全局的到各个参数,用来用到哪个查哪个,
haproxy的acl用到的可能性小,acl有一个目的动静分离,可能会用得上,,,,
动态内容请求时到php上,静态内容请求时到图片服务器上
试试将mysql的请求负载均衡到不同的服务器上去,