反向代理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 {dailyrotate 10missingoknotifemptycompresssharedscriptspostrotate/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 || trueendscript
}
日志文件 位于 /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 <willy@haproxy.org>Usage : haproxy [-f <cfgfile>]* [ -vdVD ] [ -n <maxconn> ] [ -N <maxpconn> ][ -p <pidfile> ] [ -m <max megs> ] [ -C <dir> ]-v 显示版本号 ; -vv 显示已经添加构建的包的信息-d 进入调试模式; -db 禁用后台模式 控制台显示输出-dM[<byte>] poisons memory with <byte> (defaults to 0x50(80))-V enters verbose mode (disables quiet mode)-D 后台进程模式 ; -C changes to <dir> 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 haproxygroup haproxy#后台进程启动daemon# turn on stats unix socketstats 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 10smaxconn 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 <name> <address>[:port] [param*] 参数check表示检查后端服务器的存活状态server static 127.0.0.1:4331 check#---------------------------------------------------------------------
# round robin balancing between the various backends
#---------------------------------------------------------------------
backend appbalance roundrobinserver app1 127.0.0.1:5001 checkserver app2 127.0.0.1:5002 checkserver app3 127.0.0.1:5003 checkserver app4 127.0.0.1:5004 check
其中还有一块listen用于设置tcp 比如代理mysql
listen 8099bind *:8886mode tcpserver node2 192.168.58.149:8066 checkserver node3 192.168.58.150:8066 check
常用的后端服务器检查参数有:
服务器或默认服务器参数:
backup:设定为备用服务器,仅在负载均衡场景中的其它server均不可用于启用此server;
check:启动对此server执行健康状态检查,其可以借助于额外的其它参数完成更精细的设定,如:
inter <delay>:设定健康状态检查的时间间隔,单位为毫秒,默认为2000;也可以使用fastinter和downinter来根据服务器端状态优化此时间延迟;
rise <count>:设定健康状态检查中,某离线的server从离线状态转换至正常状态需要成功检查的次数;
fall <count>:确认server从正常状态转换为不可用状态需要检查的次数;
cookie <value>:为指定server设定cookie值,此处指定的值将在请求入站时被检查,第一次为此值挑选的server将在后续的请求中被选中,其目的在于实现持久连接的功能;
maxconn <maxconn>:指定此服务器接受的最大并发连接数;如果发往此服务器的连接数目高于此处指定的值,其将被放置于请求队列,以等待其它连接被释放;
haproxy 有n个进程,每个支持m个连接,后端有x个服务器,每个最大支持y个连接,则 n*m <= x*y,如果后端服务器支持排队,则n*m <= x*(y+z),z为每个服务器的排队队列
maxqueue <maxqueue>:设定请求队列的最大长度;
observe <mode>:通过观察服务器的通信状况来判定其健康状态,默认为禁用,其支持的类型有“layer4”和“layer7”,“layer7”仅能用于http代理场景;
redir <prefix>:启用重定向功能,将发往此服务器的GET和HEAD请求均以302状态码响应;需要注意的是,在prefix后面不能使用/,且不能使用相对地址,以免造成循环;例如:
acl规则简介常用检测条件:
haproxy的ACL用于实现基于请求报文的首部、响应报文的内容或其它的环境状态信息来做出转发决策,这大大增强了其配置弹性。
其配置法则通常分为两步,首先去定义ACL,即定义一个测试条件,而后在条件得到满足时执行某特定的动作,如阻止请求或转发至某特定的后端。
定义ACL的语法格式如下:
acl <aclname> <criterion> [flags] [operator] <value> ...
<aclname>:ACL名称,区分字符大小写,且其只能包含大小写字母、数字、-(连接线)、_(下划线)、.(点号)和:(冒号);haproxy中,acl可以重名,这可以把多个测试条件定义为一个共同的acl;
<criterion>:测试标准,即对什么信息发起测试;测试方式可以由[flags]指定的标志进行调整;而有些测试标准也可以需要为其在之前指定一个操作符[operator];
[flags]:目前haproxy的acl支持的标志位有3个:
-i:不区分中模式字符的大小写;
-f:从指定的文件中加载模式;
--:标志符的强制结束标记,在模式中的字符串像标记符时使用;
<value>:acl测试条件支持的值有以下四类:
整数或整数范围:如1024:65535表示从1024至65535;仅支持使用正整数(如果出现类似小数的标识,其为通常为版本测试),且支持使用的操作符有5个,分别为eq、ge、gt、le和lt;
字符串:支持使用“-i”以忽略字符大小写,支持使用“\”进行转义;如果在模式首部出现了-i,可以在其之前使用“–”标志位;
正则表达式:其机制类同字符串匹配;
IP地址及网络地址;
同一个acl中可以指定多个测试条件,这些测试条件需要由逻辑操作符指定其关系。条件间的组合测试关系有三种:“与”(默认即为与操作)、“或”(使用“||”操作符)以及“非”(使用“!”操作符)。
常用的测试标准(criteria)
be_sess_rate(backend) <integer>
用于测试指定的backend上会话创建的速率(即每秒创建的会话数)是否满足指定的条件;常用于在指定backend上的会话速率过高时将用户请求转发至另外的backend,或用于阻止攻击行为。例如:backend dynamic
mode http
acl being_scanned be_sess_rate gt 50
redirect location /error_pages/denied.html if being_scannedbackend 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_ratefe_sess_rate(frontend) <integer>
用于测试指定的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_ENDfrontend 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 <string>hdr(header) <string>
用于测试请求报文中的所有首部或指定首部是否满足指定的条件;指定首部时,其名称不区分大小写,且在括号“()”中不能有任何多余的空白字符。测试服务器端的响应报文时可以使用shdr()。例如下面的例子用于测试首部Connection的值是否为close。hdr(Connection) -i close
1
hdr(Connection) -i closemethod <string>
测试HTTP请求报文中使用的方法。
path_beg <string>
用于测试请求的URL是否以指定的模式开头。下面的例子用于测试URL是否以/static、/images、/javascript或/stylesheets头。acl url_static path_beg -i /static /images /javascript /stylesheetspath_end <string>
用于测试请求的URL是否以<string>指定的模式结尾。例如,下面的例子用户测试URL是否以jpg、gif、png、css或js结尾。acl url_static path_end -i .jpg .gif .png .css .jshdr_beg <string>
用于测试请求报文的指定首部的开头部分是否符合<string>指定的模式。例如,下面的例子用记测试请求是否为提供静态内容的主机img、video、download或ftp。acl host_static hdr_beg(host) -i img. video. download. ftp.hdr_end <string>
用于测试请求报文的指定首部的结尾部分是否符合<string>指定的模式。
负载均衡算法
一、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 local2chroot /var/lib/haproxypidfile /var/run/haproxy.pidmaxconn 4000user haproxygroup haproxydaemon# turn on stats unix socketstats socket /var/lib/haproxy/stats#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaultsmode httplog globaloption httplogoption dontlognulloption http-server-closeoption forwardfor except 127.0.0.0/8option redispatchretries 3timeout http-request 10stimeout queue 1mtimeout connect 10stimeout client 1mtimeout server 1mtimeout http-keep-alive 10stimeout check 10smaxconn 3000#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
frontend main *:8080default_backend app#---------------------------------------------------------------------
# round robin balancing between the various backends
#---------------------------------------------------------------------
backend appbalance roundrobinmode httpserver node2 192.168.58.149:80 checkserver 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 BalancerLoaded: loaded (/usr/lib/systemd/system/haproxy.service; disabled; vendor preset: disabled)Active: active (running) since Wed 2017-11-22 23:33:29 PST; 2s agoMain 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 -DsNov 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用法详解相关推荐
- HAProxy用法详解 全网最详细中文文档
一.HAProxy简介 (1)HAProxy 是一款提供高可用性.负载均衡以及基于TCP(第四层)和HTTP(第七层)应用的代理软件,支持虚拟主机,它是免费.快速并且可靠的一种解决方案. HAProx ...
- 利用Nginx实现负载均衡(反向代理)完全详解
1.常见负载均衡的方式(概念普及) [1]用户手动选择 例如我们玩游戏,服务器会显示当前服务器的状态是拥挤.繁忙.还是空闲,然后用户根据自己实际需要,选择自己想去的服务器. 如果服务器人太多(达到上限 ...
- nginx反向代理模块配置详解_Nginx服务器的反向代理proxy_pass配置方法讲解
就普通的反向代理来讲 Nginx的配置还是比较简单的,如: location ~ /* { proxy_pass http://127.0.0.1:8008; } 或者可以 location / { ...
- nginx反向代理模块配置详解_Nginx(三):反向代理负载均衡集群配置详解
概述: 本篇主要总结Nginx实现反向代理和负载均衡功能相关模块的配置说明.主要使用到的模块如下:ngx_http_proxy_moduleNginx实现反向代理功能 ngx_http_upstrea ...
- nginx反向代理模块配置详解_nginx反向代理配置详解
反向代理配置 修改部署目录下conf子目录的nginx.conf文件(如/opt/nginx/conf/nginx.conf)内容,可调整相关配置. 将默认配置里面带#号注释内容去掉 grep -v ...
- nginx反向代理模块配置详解_nginx反向代理原理及配置详解
nginx概述 nginx是一款自由的.开源的.高性能的HTTP服务器和反向代理服务器:同时也是一个IMAP.POP3.SMTP代理服务器:nginx可以作为一个HTTP服务器进行网站的发布处理,另外 ...
- SSH协议中隧道与代理的用法详解
文章出自个人博客 https://knightyun.github.io/2022/07/17/tools-ssh-tunnel,转载请申明. SSH 协议是 Linux 系统中使用较为频繁的协议之一 ...
- ssh转发代理:ssh-agent用法详解
SSH系列文章: SSH基础:SSH和SSH服务 SSH转发代理:ssh-agent用法详解 SSH隧道:端口转发功能详解 使用ssh-agent之前 使用ssh公钥认证的方式可以免去ssh客户端(如 ...
- Ext.Net学习笔记22:Ext.Net Tree 用法详解
上面的图片是一个简单的树,使用Ext.Net来创建这样的树结构非常简单,代码如下: <ext:TreePanel runat="server"><Root> ...
最新文章
- Nacos源码系列——第三章(全网最经典的Nacos集群源码主线剖析)
- P1799 数列_NOI导刊2010提高(06)
- 恢复SAP IDES中SPFLI SFLIGHT SBOOK表数据
- 自动化运维的正确姿势,你试了也会上瘾 | 社区福利
- C#高级编程(第七版)读书笔记(4)——对象和类型
- 保持长宽比 对背景图像进行修改android:scaleType=fitXY
- MyEclipse + Tomcat 热部署问题
- inDesign 教程,如何调整布局元素的大小?
- android系统结构与应用编程 实验报告_学习编程或编码的最佳Android应用程序
- 频谱泄露、栅栏效应、补零实验
- 北大美女辞去公司副总职务创业养狗
- 设置html字体大小 js,js如何改变文章的字体大小
- 《植物大战僵尸(PC)》游戏评测
- 软件架构师 第一部分 基础篇 第四章 识别架构特性
- RAID知识以及利用率
- 信号完整性分析1——信号完整性分析概论
- 逻辑学在计算机中的应用论文,逻辑学导论论文范文
- Android优化之UI优化
- 安装 虚拟机 centos8 设置基础软件仓库时出错
- 利用js写一个飞翔的小鸟
热门文章
- python的endswith()的用法及实例
- 微服务-微服务为什么要用到 API 网关
- imazing是什么?为什么选择 iMazing?
- Git - GitWeb
- 湿空气性质计算,随笔与学习记录 (5.空气比焓)
- with root cause 解决办法
- TCP/IP详解学习笔记(4)-ICMP协议,ping和Traceroute
- 基于OLT(实体、关系、标签)建模方法论的最佳实践 | StartDT Tech Lab 08
- 数据挖掘中易犯的10大错误
- 单片机 信号发生器(DAC0832)