反向代理haproxy用法详解

一。haproxy简介

  (1)HAProxy 是一款提供高可用性、负载均衡以及基于TCP(第四层)和HTTP(第七层)应用的代理软件,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。 HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在时下的硬件上,完全可以支持数以万计的 并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。
(2)HAProxy 实现了一种事件驱动、单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户端(User-Space) 实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以 使每个CPU时间片(Cycle)做更多的工作。
(3)HAProxy 支持连接拒绝 : 因为维护一个连接的打开的开销是很低的,有时我们很需要限制攻击蠕虫(attack bots),也就是说限制它们的连接打开从而限制它们的危害。 这个已经为一个陷于小型DDoS攻击的网站开发了而且已经拯救
了很多站点,这个优点也是其它负载均衡器没有的。
(4)HAProxy 支持全透明代理(已具备硬件防火墙的典型特点): 可以用客户端IP地址或者任何其他地址来连接后端服务器. 这个特性仅在Linux 2.4/2.6内核打了cttproxy补丁后才可以使用. 这个特性也使得为某特殊服务器处理部分流量同时又不修改服务器的地址成为可能。
性能
HAProxy借助于OS上几种常见的技术来实现性能的最大化。
1,单进程、事件驱动模型显著降低了上下文切换的开销及内存占用。
2,O(1)事件检查器(event checker)允许其在高并发连接中对任何连接的任何事件实现即时探测。
3,在任何可用的情况下,单缓冲(single buffering)机制能以不复制任何数据的方式完成读写操作,这会节约大量的CPU时钟周期及内存带宽;
4,借助于Linux 2.6 (>= 2.6.27.19)上的splice()系统调用,HAProxy可以实现零复制转发(Zero-copy forwarding),在Linux 3.5及以上的OS中还可以实现零复制启动(zero-starting);
5,内存分配器在固定大小的内存池中可实现即时内存分配,这能够显著减少创建一个会话的时长;
6,树型存储:侧重于使用作者多年前开发的弹性二叉树,实现了以O(log(N))的低开销来保持计时器命令、保持运行队列命令及管理轮询及最少连接队列;
7,优化的HTTP首部分析:优化的首部分析功能避免了在HTTP首部分析过程中重读任何内存区域;
8,精心地降低了昂贵的系统调用,大部分工作都在用户空间完成,如时间读取、缓冲聚合及文件描述符的启用和禁用等;
所有的这些细微之处的优化实现了在中等规模负载之上依然有着相当低的CPU负载,甚至于在非常高的负载场景中,5%的用户空间占用率和95%的系统空间占用率也是非常普遍的现象,这意味着HAProxy进程消耗比系统空间消耗低20倍以上。因此,对OS进行性能调优是非常重要的。即使用户空间的占用率提高一倍,其CPU占用率也仅为10%,这也解释了为何7层处理对性能影响有限这一现象。由此,在高端系统上HAProxy的7层性能可轻易超过硬件负载均衡设备。
在生产环境中,在7层处理上使用HAProxy作为昂贵的高端硬件负载均衡设备故障故障时的紧急解决方案也时长可见。硬件负载均衡设备在“报文”级别处理请求,这在支持跨报文请求(request across multiple packets)有着较高的难度,并且它们不缓冲任何数据,因此有着较长的响应时间。对应地,软件负载均衡设备使用TCP缓冲,可建立极长的请求,且有着较大的响应时间。

二。haproxy安装

  演示环境:

[root@node1 ~]# uname -a
Linux node1 3.10.0-327.el7.x86_64 #1 SMP Thu Nov 19 22:10:57 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
[root@node1 ~]# hostname
node1
[root@node1 ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.58.147 node1  #haproxy安装主机
192.168.58.149 node2  
192.168.58.150 node3
192.168.58.151 node4
可以使用 下载源码包 make安装 

haproxy文档 位于 :http://cbonte.github.io/haproxy-dconv/

官网 haproxy.1wt.eu无法进入  yum上有该包的rpm 直接安装

[root@node1 ~]# yum search haproxy
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
Could not retrieve mirrorlist http://mirrorlist.centos.org/?release=7&arch=x86_64&repo=os&infra=stock error was
12: Timeout on http://mirrorlist.centos.org/?release=7&arch=x86_64&repo=os&infra=stock: (28, 'Operation too slow. Less than 1000 bytes/sec transferred the last 30 seconds')
 * base: mirrors.aliyun.com
 * extras: mirrors.aliyun.com
 * updates: mirrors.sohu.com
=========================================================================================================== N/S matched: haproxy ===========================================================================================================
haproxy-debuginfo.x86_64 : Debug information for package haproxy
haproxy.x86_64 : TCP/HTTP proxy and load balancer for high availability environments
安装
[root@node1 ~]# yum -y install haproxy
查看安装的所有文件
[root@node1 ~]# rpm -ql haproxy
/etc/haproxy
/etc/haproxy/haproxy.cfg
/etc/logrotate.d/haproxy
/etc/sysconfig/haproxy
/usr/bin/halog
/usr/bin/iprange
/usr/lib/systemd/system/haproxy.service
/usr/sbin/haproxy
/usr/sbin/haproxy-systemd-wrapper
/usr/share/doc/haproxy-1.5.18
/usr/share/doc/haproxy-1.5.18/README
/usr/share/doc/haproxy-1.5.18/VERSION
/usr/share/doc/haproxy-1.5.18/acl.fig
/usr/share/doc/haproxy-1.5.18/architecture.txt
/usr/share/doc/haproxy-1.5.18/coding-style.txt
/usr/share/doc/haproxy-1.5.18/configuration.txt
/usr/share/doc/haproxy-1.5.18/cookie-options.txt
/usr/share/doc/haproxy-1.5.18/examples/haproxy.cfg
/usr/share/haproxy
/usr/share/haproxy/400.http
/usr/share/haproxy/403.http
/usr/share/haproxy/500.http
/usr/share/haproxy/README
/usr/share/man/man1/halog.1.gz
/usr/share/man/man1/haproxy.1.gz
/var/lib/haproxy
[root@node1 ~]# 
配置文件位于/etc/haproxy/haproxy.cfg
所有文档位于/usr/share/doc/haproxy-1.5.18
服务文件 /usr/lib/systemd/system/haproxy.service 可以使用 systemctl start haproxy
使用了日志轮替 /etc/logrotate.d/haproxy 说明日志使用的rsyslog 查看该文件
[root@node1 ~]# more /etc/logrotate.d/haproxy
/var/log/haproxy.log {
    daily
    rotate 10
    missingok
    notifempty
    compress
    sharedscripts
    postrotate
        /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
        /bin/kill -HUP `cat /var/run/rsyslogd.pid 2> /dev/null` 2> /dev/null || true
    endscript
}
日志文件 位于 /var/log/haproxy.log 每天自动轮替一次 10个周期后历史记录日志删除 rsyslog参考(http://blog.csdn.net/liaomin416100569/article/details/78599529)
源码安装可以参考 /usr/share/doc/haproxy-1.5.18/README 该文件的描述
配置文件语法参考 /usr/share/doc/haproxy-1.5.18/configuration.txt
配置文件简单样例参考 /usr/share/doc/haproxy-1.5.18/examples/haproxy.cfg
出现代理后台服务出错的默认页定义:
/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
haproxy启动主文件 
[root@node1 ~]# man haproxy 
HAPROXY(1)  
常用的操作子命令
[root@node1 ~]# haproxy --help
HA-Proxy version 1.5.18 2016/05/10
Copyright 2000-2016 Willy Tarreau 

Usage : haproxy [-f ]* [ -vdVD ] [ -n  ] [ -N  ]
        [ -p  ] [ -m  ] [ -C  ]
        -v 显示版本号 ; -vv 显示已经添加构建的包的信息
        -d 进入调试模式; -db 禁用后台模式 控制台显示输出
        -dM[] poisons memory with  (defaults to 0x50(80))
        -V enters verbose mode (disables quiet mode)
        -D 后台进程模式 ; -C changes to  before loading files.
        -q 安静模式 : 不显示消息
        -c 检查模式 : 检查完配置文件就退出
        -n 设置最大连接数 默认是 (2000)
        -m 限制最大可用内存 单位 ( MB)
        -N 设置默认的每个haproxy进程最大连接数 默认 (2000)
        -L set local peer name (default to hostname)
        -p 指定所有子进程的pid到该文件
        -de disables epoll() usage even when available
        -dp disables poll() usage even when available
        -dS disables splice usage (broken on old kernels)
        -dV disables SSL verify on servers side
        -sf/-st [pid ]* finishes/terminates old pids. Must be last arguments.
尝试启动haproxy 我还没有做任何配置
[root@node1 ~]# service haproxy start
Redirecting to /bin/systemctl start  haproxy.service
[root@node1 ~]# 
Message from syslogd@localhost at Nov 22 21:53:14 ...
 haproxy[15968]: backend static has no server available!

Message from syslogd@localhost at Nov 22 21:53:15 ...
 haproxy[15969]: backend app has no server available!
^C
[root@node1 ~]# ps -ef | grep haproxy
root      15967      1  0 21:53 ?        00:00:00 /usr/sbin/haproxy-systemd-wrapper -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid
haproxy   15968  15967  0 21:53 ?        00:00:00 /usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -Ds
haproxy   15969  15968  0 21:53 ?        00:00:00 /usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -Ds
root      15971  15757  0 21:53 pts/0    00:00:00 grep --color=auto haproxy
看到 进程中 命令 实际就是调用haproxy进行调用 -f指定配置文件 -p指定进程pid -D表示后台运行 -s 保持一个进程在前台 可以看到输出消息

三。haproxy常用配置

查看haproxy的配置文件(未做修改 默认配置):

[root@node1 haproxy]# more /etc/haproxy/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快中定义的内容 如果其它快未定义使用这里默认值
#---------------------------------------------------------------------
global
    # 如果需要配置日志需要通过rsync的配置文件将local2设备日志重定向到 /var/log/haproxy.log you will
    # need to: 我这里使用centos7 已经使用rsyslog替代syslog
    #
    # 1) 配置rsyslog接受网络日志.  添加
    #     '-r' 选项到 SYSLOGD_OPTIONS 
    #    不是/etc/sysconfig/syslog 而是 /etc/sysconfig/rsyslog(默认该文件只读 添加写入权限后 修改
      SYSLOGD_OPTIONS="-r -m 0 -c 2"  修改后重启rsyslog(service rsyslog restart)
      
 )
    #
    # 2) 配置 local2 设备接受时间到   /var/log/haproxy.log
    #    
    #   修改/etc/rsyslog.conf RULES中添加一行
    #    udp 514端口和模块记住要打开
    #    local2.*                       /var/log/haproxy.log
    #
    log         127.0.0.1 local2
    #指定工作目录 
    chroot      /var/lib/haproxy
    #指定pid文件 如果命令中指定 命令中为主
    pidfile     /var/run/haproxy.pid
    #指定最大连接数
    maxconn     4000
    #工作的用户 安装默认添加了一个用户 命令查看(more /etc/passwd | grep haproxy)
    user        haproxy
    group       haproxy
    #后台进程启动
    daemon

    # turn on stats unix socket
    stats socket /var/lib/haproxy/stats

#---------------------------------------------------------------------
# 公共defaults块是所有 'listen' and 'backend' 快 将使用的默认值 如果这两块中没有配置默认使用default中的配置
#---------------------------------------------------------------------
defaults
    #mode表示代理模式 有三种 常用两种 http是7层代理(web服务器 httpd,tomcat等) tcp是4层代理(ssh,ftp,数据库等)
    mode                    http  
    #日志使用全局配置
    log                     global
    #启用记录HTTP请求、会话状态和计时器的功能。默认情况下,日志输入格式非常简陋,因为其仅包括源地址、目标地址和实例名称,
    #而“option httplog”参数将会使得日志格式变得丰富许多,其通常包括但不限于HTTP请求、连接计时器、会话状态、连接数、
    #捕获的首部及cookie、“frontend”、“backend”及服务器名称,当然也包括源地址和端口号等
    option                  httplog
    #不记录空的日志
    option                  dontlognull
    #在使用长连接时,为了避免客户端超时没有关闭长连接,此功能可以使服务器端关闭长连接
    option http-server-close
    #允许在发往服务器的请求首部中插入“X-Forwarded-For”首部 一般如果是反向代理 是反向代理主机访问后端服务器 服务器获取客户端ip就
    #一定是 反向代理主机 而非真正的客户主机 所以反向代理一般可以设置 将原始访问的主机ip置于该请求头  后台主机就能定位正确客户端ip。
    # 除了本机访问不转发
    option forwardfor       except 127.0.0.0/8
    # 在使用基于cookie定向时,一旦后端某一server宕机时,会将会话重新定向至某一上游服务器,必须使用 的选项
    option                  redispatch
    # 判断后端服务器失效的次数是重试3次
    retries                 3
    # 客户端http请求 不请求数据的关闭时间
    timeout http-request    10s
    #等待的最大市场 是 1分钟
    timeout queue           1m
    #连接后端服务器超时时间
    timeout connect         10s
    #客户端非活动的超时时间
    timeout client          1m
    #与服务器建立连接后等待响应的超时时间 
    timeout server          1m
    #http长连接的保存时长
    timeout http-keep-alive 10s
    #健康状态监测时的超时时间,过短会误判,过长资源消耗
    timeout check           10s
    maxconn                 3000

#---------------------------------------------------------------------
# frontend 快 前端客户端请求的配置 指定对外监听端口 以及一些请求过滤规则
# main是个名称 *当前主机所有ip  5000是端口
#---------------------------------------------------------------------
frontend  main *:5000
    #定义acl 规则 acl匹配一个规则 到一个变量名 path_begin路径以什么开始 path_end以什么结尾
    #下面url_statis变量表示 以 /static /images等开头的 以 .jpg .gif等结尾 -i不区分大小写  
    #acl url_static       path_beg       -i /static /images /javascript /stylesheets
    #acl url_static       path_end       -i .jpg .gif .png .css .js
    #use_backend 表示如果匹配到这个url_static变量的规则 进入哪一个backend配置块 static就是后面配置的后端服务器
    #use_backend static          if url_static
    #其他无法匹配的规则都进入默认的后台 app也是后面定义的
    default_backend             app

#---------------------------------------------------------------------
# 例如上面判断规则进入这个static名字的后台 
#---------------------------------------------------------------------
backend static
    #使用轮询的负载均衡算法
    balance     roundrobin
    #后台服务器 语法 server  
[:port] [param*] 参数check表示检查后端服务器的存活状态 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用于设置tcp 比如代理mysql
listen 8099
	bind *:8886
	mode tcp
	server node2 192.168.58.149:8066 check
    server node3 192.168.58.150:8066 check
常用的后端服务器检查参数有:

服务器或默认服务器参数:
backup:设定为备用服务器,仅在负载均衡场景中的其它server均不可用于启用此server;
check:启动对此server执行健康状态检查,其可以借助于额外的其它参数完成更精细的设定,如:
inter :设定健康状态检查的时间间隔,单位为毫秒,默认为2000;也可以使用fastinter和downinter来根据服务器端状态优化此时间延迟;
rise :设定健康状态检查中,某离线的server从离线状态转换至正常状态需要成功检查的次数;
fall :确认server从正常状态转换为不可用状态需要检查的次数;
cookie :为指定server设定cookie值,此处指定的值将在请求入站时被检查,第一次为此值挑选的server将在后续的请求中被选中,其目的在于实现持久连接的功能;
maxconn :指定此服务器接受的最大并发连接数;如果发往此服务器的连接数目高于此处指定的值,其将被放置于请求队列,以等待其它连接被释放;
haproxy 有n个进程,每个支持m个连接,后端有x个服务器,每个最大支持y个连接,则 n*m <= x*y,如果后端服务器支持排队,则n*m <= x*(y+z),z为每个服务器的排队队列
maxqueue :设定请求队列的最大长度;
observe :通过观察服务器的通信状况来判定其健康状态,默认为禁用,其支持的类型有“layer4”和“layer7”,“layer7”仅能用于http代理场景;
redir :启用重定向功能,将发往此服务器的GET和HEAD请求均以302状态码响应;需要注意的是,在prefix后面不能使用/,且不能使用相对地址,以免造成循环;例如:

acl规则简介常用检测条件:

    haproxy的ACL用于实现基于请求报文的首部、响应报文的内容或其它的环境状态信息来做出转发决策,这大大增强了其配置弹性。
其配置法则通常分为两步,首先去定义ACL,即定义一个测试条件,而后在条件得到满足时执行某特定的动作,如阻止请求或转发至某特定的后端。
定义ACL的语法格式如下:

acl   [flags] [operator]  ...
:ACL名称,区分字符大小写,且其只能包含大小写字母、数字、-(连接线)、_(下划线)、.(点号)和:(冒号);haproxy中,acl可以重名,这可以把多个测试条件定义为一个共同的acl;
:测试标准,即对什么信息发起测试;测试方式可以由[flags]指定的标志进行调整;而有些测试标准也可以需要为其在之前指定一个操作符[operator];
[flags]:目前haproxy的acl支持的标志位有3个:
-i:不区分中模式字符的大小写;
-f:从指定的文件中加载模式;
--:标志符的强制结束标记,在模式中的字符串像标记符时使用;
:acl测试条件支持的值有以下四类:
整数或整数范围:如1024:65535表示从1024至65535;仅支持使用正整数(如果出现类似小数的标识,其为通常为版本测试),且支持使用的操作符有5个,分别为eq、ge、gt、le和lt;
字符串:支持使用“-i”以忽略字符大小写,支持使用“\”进行转义;如果在模式首部出现了-i,可以在其之前使用“–”标志位;
正则表达式:其机制类同字符串匹配;
IP地址及网络地址;
同一个acl中可以指定多个测试条件,这些测试条件需要由逻辑操作符指定其关系。条件间的组合测试关系有三种:“与”(默认即为与操作)、“或”(使用“||”操作符)以及“非”(使用“!”操作符)。
 常用的测试标准(criteria)
be_sess_rate(backend) 
用于测试指定的backend上会话创建的速率(即每秒创建的会话数)是否满足指定的条件;常用于在指定backend上的会话速率过高时将用户请求转发至另外的backend,或用于阻止攻击行为。例如:

backend dynamic
mode http
acl being_scanned be_sess_rate gt 50
redirect location /error_pages/denied.html if being_scanned

backend dynamic
mode http
acl being_scanned be_sess_rate gt 50
redirect location /error_pages/denied.html if being_scanned
5.1.2 fe_sess_rate


fe_sess_rate(frontend) 
用于测试指定的frontend(或当前frontend)上的会话创建速率是否满足指定的条件;常用于为frontend指定一个合理的会话创建速率的上限以防止服务被滥用。例如下面的例子限定入站邮件速率不能大于50封/秒,所有在此指定范围之外的请求都将被延时50毫秒。

frontend mail
bind :25
mode tcp
maxconn 500
acl too_fast fe_sess_rate ge 50
tcp-request inspect-delay 50ms
tcp-request content accept if ! too_fast
tcp-request content accept if WAIT_END

frontend mail
bind :25
mode tcp
maxconn 500
acl too_fast fe_sess_rate ge 50
tcp-request inspect-delay 50ms
tcp-request content accept if ! too_fast
tcp-request content accept if WAIT_END
5.1.3 hdr 


hdr(header) 
用于测试请求报文中的所有首部或指定首部是否满足指定的条件;指定首部时,其名称不区分大小写,且在括号“()”中不能有任何多余的空白字符。测试服务器端的响应报文时可以使用shdr()。例如下面的例子用于测试首部Connection的值是否为close。

hdr(Connection) -i close
1
hdr(Connection) -i close


method 
测试HTTP请求报文中使用的方法。
path_beg 
用于测试请求的URL是否以指定的模式开头。下面的例子用于测试URL是否以/static、/images、/javascript或/stylesheets头。

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

path_end 
用于测试请求的URL是否以指定的模式结尾。例如,下面的例子用户测试URL是否以jpg、gif、png、css或js结尾。

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

hdr_beg 
用于测试请求报文的指定首部的开头部分是否符合指定的模式。例如,下面的例子用记测试请求是否为提供静态内容的主机img、video、download或ftp。

acl host_static hdr_beg(host) -i img. video. download. ftp.

hdr_end 
用于测试请求报文的指定首部的结尾部分是否符合指定的模式。

负载均衡算法

一、roundrobin,表示简单的轮询, 负载均衡基本都具备的;
二、static-rr,表示根据权重,建议关注;
三、leastconn,表示最少连接者先处理,建议关注;
四、source,表示根据请求源IP hash来定位到固定的后端服务器 ;
五、uri,表示根据请求的URI;
六、url_param,表示根据请求的URl参数'balance url_param' requires an URL parameter name
七、hdr(name),表示根据HTTP请求头来锁定每一次HTTP请求;
八、rdp-cookie(name),表示根据据cookie(name)来锁定并哈希每一次TCP请求。

四。haproxy配置案例

 192.168.58.149 httpd服务 (yum -y install httpd )
 192.168.58.150 httpd服务  

分别进入 /var/www/html 下 分别新建一个普通的html文件内容不一样 
149(node2)

[root@node2 html]# echo node2>1.html
150(node3)
[root@node3 html]# echo node3>1.html
启动两台机器httpd
service httpd start
分别访问两个httpd服务的网页 看是否正常显示 
http://192.168.58.150/1.html
http://192.168.58.149/1.html

在node1上安装haproxy

修改配置文件

#---------------------------------------------------------------------
# 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

    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
    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                 3000

#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
frontend  main *:8080
    default_backend             app


#---------------------------------------------------------------------
# round robin balancing between the various backends
#---------------------------------------------------------------------
backend app
    balance     roundrobin
    mode http
    server node2 192.168.58.149:80 check
    server node3 192.168.58.150:80 check
检查配置文件是否正确
"haproxy.cfg" 75L, 2599C written
[root@node1 haproxy]# /usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -c
Configuration file is valid
启动haproxy
[root@node1 haproxy]# service haproxy start
Redirecting to /bin/systemctl start  haproxy.service
[root@node1 haproxy]# service haproxy status
Redirecting to /bin/systemctl status  haproxy.service
● haproxy.service - HAProxy Load Balancer
   Loaded: loaded (/usr/lib/systemd/system/haproxy.service; disabled; vendor preset: disabled)
   Active: active (running) since Wed 2017-11-22 23:33:29 PST; 2s ago
 Main PID: 16434 (haproxy-systemd)
   CGroup: /system.slice/haproxy.service
           ├─16434 /usr/sbin/haproxy-systemd-wrapper -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid
           ├─16435 /usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -Ds
           └─16436 /usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -Ds

Nov 22 23:33:29 node1 systemd[1]: Started HAProxy Load Balancer.
Nov 22 23:33:29 node1 systemd[1]: Starting HAProxy Load Balancer...
Nov 22 23:33:29 node1 haproxy-systemd-wrapper[16434]: haproxy-systemd-wrapper: executing /usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -Ds
查看进程和端口是否启动
[root@node1 haproxy]# ps -ef | grep haproxy
root      16434      1  0 23:33 ?        00:00:00 /usr/sbin/haproxy-systemd-wrapper -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid
haproxy   16435  16434  0 23:33 ?        00:00:00 /usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -Ds
haproxy   16436  16435  0 23:33 ?        00:00:00 /usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -Ds
root      16468  16356  0 23:33 pts/0    00:00:00 grep --color=auto haproxy
[root@node1 haproxy]# ^C
[root@node1 haproxy]# nestat -nlp | grep 8080
-bash: nestat: command not found
[root@node1 haproxy]# netstat -nlp | grep 8080
tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN      16436/haproxy   
访问 http://192.168.58.147:8080/1.html 发现轮换输出node2和node3
日志参考之前配置文件开头部分讲解配置  查看日志(明显的node2和node3轮询)
[root@node1 haproxy]# tail -100 /var/log/haproxy.log                  
Nov 22 23:33:29 localhost haproxy[16435]: Proxy main started.
Nov 22 23:33:29 localhost haproxy[16435]: Proxy app started.
Nov 22 23:34:57 localhost haproxy[16436]: 192.168.58.1:8140 [22/Nov/2017:23:34:57.073] main app/node2 336/0/1/3/340 200 264 - - ---- 2/2/0/0/0 0/0 "GET /1.html HTTP/1.1"
Nov 22 23:34:57 localhost haproxy[16436]: 192.168.58.1:8140 [22/Nov/2017:23:34:57.414] main app/node3 404/0/1/2/407 404 388 - - ---- 2/2/0/0/0 0/0 "GET /favicon.ico HTTP/1.1"
Nov 22 23:34:59 localhost haproxy[16436]: 192.168.58.1:8140 [22/Nov/2017:23:34:57.821] main app/node2 1641/0/2/7/1650 304 141 - - ---- 4/4/0/1/0 0/0 "GET /1.html HTTP/1.1"
Nov 22 23:35:01 localhost haproxy[16436]: 192.168.58.1:8140 [22/Nov/2017:23:34:59.470] main app/node3 2273/0/1/3/2277 200 264 - - ---- 4/4/0/0/0 0/0 "GET /1.html HTTP/1.1"
Nov 22 23:35:02 localhost haproxy[16436]: 192.168.58.1:8140 [22/Nov/2017:23:35:01.747] main app/node2 993/0/1/3/997 200 264 - - ---- 4/4/0/0/0 0/0 "GET /1.html HTTP/1.1"
Nov 22 23:35:03 localhost haproxy[16436]: 192.168.58.1:8140 [22/Nov/2017:23:35:02.744] main app/node3 643/0/1/2/646 200 264 - - ---- 4/4/0/1/0 0/0 "GET /1.html HTTP/1.1"
Nov 22 23:35:03 localhost haproxy[16436]: 192.168.58.1:8140 [22/Nov/2017:23:35:03.389] main app/node2 508/0/1/3/512 200 264 - - ---- 4/4/0/0/0 0/0 "GET /1.html HTTP/1.1"
Nov 22 23:35:04 localhost haproxy[16436]: 192.168.58.1:8140 [22/Nov/2017:23:35:03.901] main app/node3 542/0/1/2/545 200 264 - - ---- 4/4/0/0/0 0/0 "GET /1.html HTTP/1.1"
Nov 22 23:35:04 localhost haproxy[16436]: 192.168.58.1:8140 [22/Nov/2017:23:35:04.446] main app/node2 439/0/1/5/445 200 264 - - ---- 4/4/0/1/0 0/0 "GET /1.html HTTP/1.1"
Nov 22 23:35:05 localhost haproxy[16436]: 192.168.58.1:8140 [22/Nov/2017:23:35:04.891] main app/node3 244/0/0/2/246 200 264 - - ---- 4/4/0/0/0 0/0 "GET /1.html HTTP/1.1"
Nov 22 23:35:05 localhost haproxy[16436]: 192.168.58.1:8140 [22/Nov/2017:23:35:05.137] main app/node2 259/0/1/2/262 200 264 - - ---- 4/4/0/1/0 0/0 "GET /1.html HTTP/1.1"
Nov 22 23:35:05 localhost haproxy[16436]: 192.168.58.1:8140 [22/Nov/2017:23:35:05.400] main app/node3 141/0/1/1/143 200 264 - - ---- 4/4/0/0/0 0/0 "GET /1.html HTTP/1.1"
Nov 22 23:35:05 localhost haproxy[16436]: 192.168.58.1:8140 [22/Nov/2017:23:35:05.544] main app/node2 151/0/1/1/153 200 264 - - ---- 4/4/0/1/0 0/0 "GET /1.html HTTP/1.1"
Nov 22 23:35:05 localhost haproxy[16436]: 192.168.58.1:8140 [22/Nov/2017:23:35:05.697] main app/node3 154/0/1/1/156 200 264 - - ---- 4/4/0/0/0 0/0 "GET /1.html HTTP/1.1"
Nov 22 23:35:06 localhost haproxy[16436]: 192.168.58.1:8140 [22/Nov/2017:23:35:05.853] main app/node2 189/0/1/1/191 200 264 - - ---- 4/4/0/0/0 0/0 "GET /1.html HTTP/1.1"
Nov 22 23:35:06 localhost haproxy[16436]: 192.168.58.1:8140 [22/Nov/2017:23:35:06.044] main app/node3 170/0/0/2/172 200 264 - - ---- 4/4/0/1/0 0/0 "GET /1.html HTTP/1.1"
Nov 22 23:35:06 localhost haproxy[16436]: 192.168.58.1:8140 [22/Nov/2017:23:35:06.216] main app/node2 179/0/1/1/181 200 264 - - ---- 4/4/0/0/0 0/0 "GET /1.html HTTP/1.1"
Nov 22 23:35:06 localhost haproxy[16436]: 192.168.58.1:8140 [22/Nov/2017:23:35:06.398] main app/node3 163/0/1/1/165 200 264 - - ---- 4/4/0/1/0 0/0 "GET /1.html HTTP/1.1"
Nov 22 23:35:06 localhost haproxy[16436]: 192.168.58.1:8140 [22/Nov/2017:23:35:06.563] main app/node2 167/0/1/1/169 200 264 - - ---- 4/4/0/1/0 0/0 "GET /1.html HTTP/1.1"
Nov 22 23:35:06 localhost haproxy[16436]: 192.168.58.1:8140 [22/Nov/2017:23:35:06.733] main app/node3 177/0/0/1/178 200 264 - - ---- 4/4/0/0/0 0/0 "GET /1.html HTTP/1.1"
Nov 22 23:35:07 localhost haproxy[16436]: 192.168.58.1:8140 [22/Nov/2017:23:35:06.911] main app/node2 164/0/0/1/165 200 264 - - ---- 3/3/0/0/0 0/0 "GET /1.html HTTP/1.1"
Nov 22 23:35:07 localhost haproxy[16436]: 192.168.58.1:8140 [22/Nov/2017:23:35:07.076] main app/node3 153/0/1/2/156 200 264 - - ---- 3/3/0/1/0 0/0 "GET /1.html HTTP/1.1"
Nov 22 23:35:07 localhost haproxy[16436]: 192.168.58.1:8140 [22/Nov/2017:23:35:07.232] main app/node2 178/0/1/2/181 200 264 - - ---- 3/3/0/1/0 0/0 "GET /1.html HTTP/1.1"
tcp就不演示了 后面mycat高可用  http://blog.csdn.net/liaomin416100569/article/details/78643119
参考博客 http://www.ttlsa.com/linux/haproxy-study-tutorial/

你可能感兴趣的:(反向代理haproxy用法详解)