CentOS7部署Haproxy 1.7.2

参考文档:

1.haproxy:http://www.haproxy.org/

本文涉及haproxy的安装,并做简单配置。

一.环境准备

1.操作系统

CentOS-7-x86_64-Everything-1511

2.Haproxy版本

截至2017-02-23,haproxy稳定版本是1.7.2:

http://www.haproxy.org/download/1.7/src/haproxy-1.7.2.tar.gz

3.拓扑图

1)haproxy服务器采用VMware ESXi虚拟出的1台服务器,前端访问地址10.11.4.152,后端地址192.168.4.152;1

2)Web1服务器为采用docker技术生成的1台服务器,已安装并启动nginx服务,ip地址192.168.4.171;

3)Web2同Web1服务器,ip地址192.168.4.172;

4)设置web1/2测试页面(路径参考nginx安装步骤),以方便后续查看验证结果。

二.Haproxy安装

1.下载

[root@elk-node2 ~]# cd /usr/local/src/

[root@elk-node2 src]# wgethttp://www.haproxy.org/download/1.7/src/haproxy-1.7.2.tar.gz

2.编译安装

[root@elk-node2 src]# tar -zxvf haproxy-1.7.2.tar.gz

[root@elk-node2 src]# cd haproxy-1.7.2

[root@elk-node2 haproxy-1.7.2]# make TARGET=linux2628PREFIX=/usr/local/haproxy

[root@elk-node2 haproxy-1.7.2]# make installPREFIX=/usr/local/haproxy

#”TARGET”指定编译对应的os对应的内核版本,通过”uname -r”查询内核版本呢,README文件可查询对应关系。

三.Haproxy配置

1.配置用户

[root@elk-node2 ~]# groupadd haproxy

[root@elk-node2 ~]# useradd -g haproxy haproxy -s/sbin/nologin

2.配置文件

1)配置文件详解

默认安装目录下没有配置文件,只有”doc”,“sbin”,“share”三个目录,可手工创建目录及配置文件。

haproxy的配置文件主要是以下5部分:

global全局配置、defaults默认配置、监控页面配置、frontend配置、backend配置。


[root@elk-node2 ~]# mkdir -p /usr/local/haproxy/etc

[root@elk-node2 ~]# cd /usr/local/haproxy/etc/

[root@elk-node2 etc]# vim haproxy.cfg

#全局配置,用于设定义全局参数,属于进程级的配置,通常与操作系统配置有关.


global

#定义全局日志,配置在本地,通过local0输出,默认是info级别,可配置两条

log127.0.0.1 local0warning

#定义日志级别【error warning info debug】

#log127.0.0.1 local1 info

#运行路径

chroot/usr/local/haproxy

#PID文件存放路径

pidfile/var/run/haproxy.pid

#设置每haproxy进程的最大并发连接数,其等同于命令行选项“-n”;“ulimit -n”自动计算的结果参照此参数设定.

maxconn4096

#运行haproxy用户,或者使用关键字uid

userhaproxy

#运行haproxy用户组,或者使用关键字gid

grouphaproxy

#后台运行haproxy

daemon

#设置启动的haproxy进程数量,只能用于守护进程模式的haproxy;

#默认只启动一个进程,鉴于调试困难等多方面的原因,一般只在单进程仅能打开少数文件描述符的场景中才使用多进程模式.

nbproc1

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

#ulimit-n 819200

#调试级别,一般只在开启单进程时调试,且生产环境禁用.

#debug

#haproxy启动后不会显示任何相关信息,这与在命令行启动haproxy时加上参数“-q”相同

#quiet

#定义统计信息保存位置

stats socket /usr/local/haproxy/stats

#默认配置

defaults

#默认的模式【tcp:4层;http:7层;health:只返回OK】

modehttp

#继承全局的日志定义输出

logglobal

#日志类别, httplog

#optionhttplog

#如果后端服务器需要记录客户端真实ip,需要在HTTP请求中添加”X-Forwarded-For”字段;

#但haproxy自身的健康检测机制访问后端服务器时,不应将记录访问日志,可用except来排除127.0.0.0,即haproxy本身.

#optionforwardfor except127.0.0.0/8

optionforwardfor

#开启http协议中服务器端关闭功能,每个请求完毕后主动关闭http通道,使得支持长连接,使得会话可以被重用,使得每一个日志记录都会被记录.

optionhttpclose

#如果产生了一个空连接,那这个空连接的日志将不会记录.

optiondontlognull

#当与后端服务器的会话失败(服务器故障或其他原因)时,把会话重新分发到其他健康的服务器上;当故障服务器恢复时,会话又被定向到已恢复的服务器上;

#还可以用”retries”关键字来设定在判定会话失败时的尝试连接的次数

optionredispatch

retries3

#当haproxy负载很高时,自动结束掉当前队列处理比较久的链接.

optionabortonclose

#默认http请求超时时间

timeout http-request10s

#默认队列超时时间,后端服务器在高负载时,会将haproxy发来的请求放进一个队列中.

timeout queue1m

#haproxy与后端服务器连接超时时间.

timeout connect5s

#客户端与haproxy连接后,数据传输完毕,不再有数据传输,即非活动连接的超时时间.

timeout client1m

#haproxy与后端服务器非活动连接的超时时间.

timeout server1m

#默认新的http请求连接建立的超时时间,时间较短时可以尽快释放出资源,节约资源.

timeout http-keep-alive 10s

#心跳检测超时时间

timeout check10s

#最大并发连接数

maxconn2000

#设置默认的负载均衡方式

#balance source

#balnace leastconn

#统计页面配置, frontend和backend的组合体,监控组的名称可按需自定义

listen admin_status

#配置监控运行模式

mode http

#配置统计页面访问端口

bind 0.0.0.0:1080

#统计页面默认最大连接数

maxconn 10

#http日志格式

option httplog

#开启统计

stats enable

#隐藏统计页面上的haproxy版本信息

stats hide-version

#监控页面自动刷新时间

stats refresh 30s

#统计页面访问url

stats uri /stats

#统计页面密码框提示文本

stats realm mCloud\ Haproxy

#监控页面的用户和密码:admin,可设置多个用户名

stats auth admin:admin

#手工启动/禁用后端服务器,可通过web管理节点

stats admin if TRUE

#设置haproxy错误页面

errorfile 400 /usr/local/haproxy/errorfiles/400.http

errorfile 403 /usr/local/haproxy/errorfiles/403.http

errorfile 408 /usr/local/haproxy/errorfiles/408.http

errorfile 500 /usr/local/haproxy/errorfiles/500.http

errorfile 502 /usr/local/haproxy/errorfiles/502.http

errorfile 503 /usr/local/haproxy/errorfiles/503.http

errorfile 504 /usr/local/haproxy/errorfiles/504.http

#监控haproxy后端服务器的监控状态

listen site_status

bind 0.0.0.0:1081#监听端口

mode http#http的7层模式

log 127.0.0.1 local2 err#[err warning info debug]

monitor-uri /site_status#网站健康检测URL,用来检测HAProxy管理的网站是否可以用,正常返回200,不正常返回503

acl site_dead nbsrv(php_server) lt1#定义网站down时的策略当挂在负载均衡上的指定backend的中有效机器数小于1台时返回true

acl site_dead nbsrv(html_server) lt 1

acl site_deadnbsrv(backend_default)lt 1

monitor fail if site_dead#当满足策略的时候返回503,网上文档说的是500,实际测试为503

monitor-net 192.168.4.171/32#来自192.168.4.152的日志信息不会被记录和转发

monitor-net 192.168.4.172/32

#frontend,名字自定义

frontend HAproxy_Cluster

#定义前端监听端口,建议采用bind *:80的形式,否则做集群高可用的时候有问题,vip切换到其余机器就不能访问.

bind 0.0.0.0:80

#acl后面是规则名称,当请求的url末尾是以.php结尾时,匹配触发php_web规则,以下两种写法均可.

#当请求的url末尾是以.css、.jpg、.png、.jpeg、.js、.gif结尾时,匹配并触发static_web规则.

#acl static_web path_end .gif .png .jpg .css .js .jpeg

#acl static_web url_reg /*.(css|jpg|png|jpeg|js|gif)$

#-i为忽略大小写,当被请求的是以www.test.com开头的主机时,匹配并触发dns_name规则.

acl html_web hdr_beg(host) -i www.haproxytest.com

#acl html_web hdr_beg(host) 10.11.4.152

#当客户端的IP是x.x.x.x时,匹配并触发src_ip规则.

#acl src_ip src x.x.x.x

#如果匹配acl规则php_web,将请求转交到php_server组处理;如果匹配acl规则html_web,将请求转交到html_server组处理.

use_backend php_server if php_web

use_backend html_server if html_web

#如果以上规则都不匹配时,将请求转交到default_backend组处理.

default_backend backend_default

#backend后端配置,配置php_server组与html_server组

backend php_server

#定义负载均衡方式为roundrobin方式,即基于权重进行轮询调度的算法,在服务器性能分布较均匀情况下推荐.

#另有如下几种负载均衡方式:

#-- static-rr:也是基于权重进行轮转调度,但属于静态方法,运行时调整后端机组权重不会使用新的权重;

#-- source:基于请求源IP进行hash运算匹配后端服务器组;

#-- leastconn:不适合会话较短的环境,如基于http的应用;

#-- uri:对整个URI进行hash运算;

#-- uri_param:对URI中的参数进行转发;

#-- hdr():根据http头进行转发,无该头部则转为使用roundrobin.

balance roundrobin

mode http

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

cookie SERVERID

#心跳检测方式为检测后端服务器index.html文件,还有其他方式

option httpchk GET /index.html

#后端服务器定义, maxconn 1024表示该服务器的最大连接数, cookie 1表示serverid为1,

weight代表权重(默认1,最大为265,0则表示不参与负载均衡),

#check inter 1500是检测心跳频率, rise 2是2次正确认为服务器可用, fall 3是3次失败认为服务器不可用.

server php1 192.168.4.171:80 maxconn 1024 cookie 1 weight 3 check inter1500 rise 2 fall 3

backend html_server

balance source

mode http

server html1 192.168.4.172:80 maxconn 1024 cookie 1 weight 3 check inter1500 rise 2 fall 3

backend backend_default

balance source

mode http

server default1 192.168.4.171:80 maxconn 1024 cookie 1 weight 3 checkinter 1500 rise 2 fall 3

2)error文件

[root@elk-node2 ~]# cp -r/usr/local/src/haproxy-1.7.2/examples/errorfiles/ /usr/local/haproxy/

#配置文件中统计监控页面部分定义了error文件,将安装包中的文件复制到安装目录使用。

3)日志文件

创建文件

[root@elk-node2 ~]# mkdir -p /usr/local/haproxy/log

[root@elk-node2 ~]# touch/usr/local/haproxy/log/haproxy.log

[root@elk-node2 ~]# ln -s/usr/local/haproxy/log/haproxy.log /var/log/

[root@elk-node2 ~]# chown haproxy:haproxy/var/log/haproxy.log

rsyslog主配置文件

[root@elk-node2 ~]# vim /etc/sysconfig/rsyslog

SYSLOGD_OPTIONS="-c 2 -r -m0"

#修改”SYSLOGD_OPTIONS”参数,-c 2使用兼容模式,默认是-c 5;-r开启远程日志;-m 0标记时间戳,单位是分钟,0表示禁用该功能。

rsyslog文件

[root@elk-node2 ~]# cd /etc/rsyslog.d/

[root@elk-node2 rsyslog.d]# touch haproxy.conf

[root@elk-node2 rsyslog.d]# chown haproxy:haproxyhaproxy.conf

[root@elk-node2 rsyslog.d]# vim haproxy.conf

# Provides UDP syslog reception

$ModLoad imudp

$UDPServerRun 514

# haproxy.log

#

local0.*/usr/local/haproxy/log/haproxy.log

#local1.*/usr/local/haproxy/log/haproxy.log

local2.*/usr/local/haproxy/log/haproxy.log

&~

[root@elk-node2 rsyslog.d]# systemctl restartrsyslog.service

[root@elk-node2 rsyslog.d]# setenforce 0

#haproxy默认没有日志,依靠rsyslog收集日志;

#文件最末尾的“&~”,如果没有此配置,日志除写入指定文件外,会同步写入messages文件;

#关闭selinux,本文因没有关闭selinux导致排查问题用了半天时间。

4)配置文件权限及软链接

[root@elk-node2 ~]# chown -R haproxy:haproxy/usr/local/haproxy/

[root@elk-node2 ~]# mkdir -p /etc/haproxy

[root@elk-node2 ~]# ln -s/usr/local/haproxy/etc/haproxy.cfg /etc/haproxy/

[root@elk-node2 ~]# chown -R haproxy:haproxy/etc/haproxy

3.配置开机启动

[root@elk-node2 ~]# cp/usr/local/src/haproxy-1.7.2/examples/haproxy.init /etc/rc.d/init.d/haproxy

[root@elk-node2 ~]# chown haproxy:haproxy/etc/rc.d/init.d/haproxy

[root@elk-node2 ~]# chmod +x /etc/rc.d/init.d/haproxy

4.配置全局启动文件

[root@elk-node2 ~]# ln -s/usr/local/haproxy/sbin/haproxy /usr/sbin/

[root@elk-node2 ~]# chown haproxy:haproxy/usr/sbin/haproxy

#采用软链接方式。

5.配置防火墙

[root@elk-node2 ~]# vim /etc/sysconfig/iptables

-A INPUT -p tcp -m state --stateNEW -m tcp --dport 80 -j ACCEPT

-A INPUT -p tcp -m state --stateNEW -m tcp --dport 1080 -j ACCEPT

-A INPUT -p tcp -m state --stateNEW -m tcp --dport 1081 -j ACCEPT

-A INPUT -p udp -m state --stateNEW -m tcp --dport 514 -j ACCEPT

[root@elk-node2 ~]# service iptables restart

#开放如上端口,均在配置文件中有定义,日志端口在rsyslog.d/haproxy.conf文件中定义。

6.启动并验证

[root@elk-node2 ~]# service haproxy start

1)端口验证

[root@elk-node2 ~]# netstat –tunlp

2)监控页面

监控页面展示信息与账户/密码在配置文件中已定义。

3)访问页面

触发配置文件中定义的php_server组,如下:

触发配置文件中定义的html_server组(在本地修改hosts文件),如下:

触发配置文件中定义的backend_default组,如下:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容