Chinaunix首页 | 论坛 | 博客
  • 博客访问: 355656
  • 博文数量: 34
  • 博客积分: 251
  • 博客等级: 二等列兵
  • 技术积分: 419
  • 用 户 组: 普通用户
  • 注册时间: 2012-07-21 15:50
文章分类

全部博文(34)

文章存档

2017年(5)

2016年(19)

2012年(10)

我的朋友

分类: 系统运维

2017-03-16 22:23:27

CentOS7部署Haproxy 1.7.2

参考文档:

1.    haproxy

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

一.环境准备

1.  操作系统

CentOS-7-x86_64-Everything-1511

2.  Haproxy版本

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

3.  拓扑图


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

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

3) Web2Web1服务器,ip地址192.168.4.172

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


二.Haproxy安装

1.  下载

点击(此处)折叠或打开

  1. [root@elk-node2 ~]# cd /usr/local/src/
  2. [root@elk-node2 src]# wget http://www.haproxy.org/download/1.7/src/haproxy-1.7.2.tar.gz

2.  编译安装

点击(此处)折叠或打开

  1. [root@elk-node2 src]# tar -zxvf haproxy-1.7.2.tar.gz
  2. [root@elk-node2 src]# cd haproxy-1.7.2
  3. [root@elk-node2 haproxy-1.7.2]# make TARGET=linux2628 PREFIX=/usr/local/haproxy
  4. [root@elk-node2 haproxy-1.7.2]# make install PREFIX=/usr/local/haproxy

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

三.Haproxy配置

1.  配置用户

点击(此处)折叠或打开

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

2.  配置文件

1)   配置文件详解

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

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

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

点击(此处)折叠或打开

  1. [root@elk-node2 ~]# mkdir -p /usr/local/haproxy/etc
  2. [root@elk-node2 ~]# cd /usr/local/haproxy/etc/
  3. [root@elk-node2 etc]# vim haproxy.cfg

点击(此处)折叠或打开

  1. #全局配置, 用于设定义全局参数, 属于进程级的配置, 通常与操作系统配置有关.
  2. global
  3.     #定义全局日志, 配置在本地, 通过local0 输出, 默认是info级别,可配置两条
  4.     log 127.0.0.1 local0 warning
  5.     #定义日志级别【error warning info debug】
  6.     #log 127.0.0.1 local1 info
  7.       
  8.     #运行路径
  9.     chroot /usr/local/haproxy
  10.     #PID 文件存放路径
  11.     pidfile /var/run/haproxy.pid
  12.       
  13.     #设置每haproxy进程的最大并发连接数, 其等同于命令行选项“-n”; “ulimit -n”自动计算的结果参照此参数设定.
  14.     maxconn 4096
  15.       
  16.     #运行haproxy 用户, 或者使用关键字uid
  17.     user haproxy
  18.     #运行haproxy 用户组, 或者使用关键字gid
  19.     group haproxy
  20.       
  21.     #后台运行haproxy
  22.     daemon
  23.    
  24.     #设置启动的haproxy进程数量, 只能用于守护进程模式的haproxy;
  25.     #默认只启动一个进程, 鉴于调试困难等多方面的原因, 一般只在单进程仅能打开少数文件描述符的场景中才使用多进程模式.
  26.     nbproc 1
  27.     #设置每进程所能够打开的最大文件描述符数目, 默认情况其会自动进行计算, 因此不推荐修改此选项.
  28.     #ulimit-n 819200
  29.       
  30.     #调试级别, 一般只在开启单进程时调试, 且生产环境禁用.
  31.     #debug
  32.     #haproxy启动后不会显示任何相关信息, 这与在命令行启动haproxy时加上参数“-q”相同
  33.     #quiet
  34.       
  35.     #定义统计信息保存位置
  36.     stats socket /usr/local/haproxy/stats

  37. #默认配置
  38. defaults
  39.     #默认的模式【tcp:4层; http:7层; health:只返回OK】
  40.     mode http
  41.       
  42.     #继承全局的日志定义输出
  43.     log global
  44.       
  45.     #日志类别, httplog
  46.     #option httplog
  47.    
  48.     #如果后端服务器需要记录客户端真实ip, 需要在HTTP请求中添加”X-Forwarded-For”字段;
  49.     #但haproxy自身的健康检测机制访问后端服务器时, 不应将记录访问日志,可用except来排除127.0.0.0,即haproxy本身.
  50.     #option forwardfor except 127.0.0.0/8
  51.     option forwardfor
  52.    
  53.     #开启http协议中服务器端关闭功能, 每个请求完毕后主动关闭http通道, 使得支持长连接,使得会话可以被重用,使得每一个日志记录都会被记录.
  54.     option httpclose
  55.    
  56.     #如果产生了一个空连接,那这个空连接的日志将不会记录.
  57.     option dontlognull
  58.    
  59.     #当与后端服务器的会话失败(服务器故障或其他原因), 把会话重新分发到其他健康的服务器上; 当故障服务器恢复时, 会话又被定向到已恢复的服务器上;
  60.     #还可以用”retries”关键字来设定在判定会话失败时的尝试连接的次数
  61.     option redispatch
  62.     retries 3
  63.       
  64.     #当haproxy负载很高时, 自动结束掉当前队列处理比较久的链接.
  65.     option abortonclose
  66.    
  67.     #默认http请求超时时间
  68.     timeout http-request 10s
  69.     #默认队列超时时间, 后端服务器在高负载时, 会将haproxy发来的请求放进一个队列中.
  70.     timeout queue 1m
  71.     #haproxy与后端服务器连接超时时间.
  72.     timeout connect 5s
  73.     #客户端与haproxy连接后, 数据传输完毕, 不再有数据传输, 即非活动连接的超时时间.
  74.     timeout client 1m
  75.     #haproxy与后端服务器非活动连接的超时时间.
  76.     timeout server 1m
  77.     #默认新的http请求连接建立的超时时间,时间较短时可以尽快释放出资源,节约资源.
  78.     timeout http-keep-alive 10s
  79.     #心跳检测超时时间
  80.     timeout check 10s
  81.       
  82.     #最大并发连接数
  83.     maxconn 2000
  84.       
  85.     #设置默认的负载均衡方式
  86.     #balance source
  87.     #balnace leastconn

  88. #统计页面配置, frontend和backend的组合体, 监控组的名称可按需自定义
  89. listen admin_status
  90.     #配置监控运行模式
  91.     mode http
  92.       
  93.     #配置统计页面访问端口
  94.     bind 0.0.0.0:1080
  95.       
  96.     #统计页面默认最大连接数
  97.     maxconn 10
  98.       
  99.     #http日志格式
  100.     option httplog
  101.       
  102.     #开启统计
  103.     stats enable
  104.       
  105.     #隐藏统计页面上的haproxy版本信息
  106.     stats hide-version
  107.       
  108.     #监控页面自动刷新时间
  109.     stats refresh 30s
  110.       
  111.     #统计页面访问url
  112.     stats uri /stats
  113.       
  114.     #统计页面密码框提示文本
  115.     stats realm mCloud\ Haproxy
  116.       
  117.     #监控页面的用户和密码:admin, 可设置多个用户名
  118.     stats auth admin:admin
  119.       
  120.     #手工启动/禁用后端服务器, 可通过web管理节点
  121.     stats admin if TRUE
  122.     #设置haproxy错误页面
  123.     errorfile 400 /usr/local/haproxy/errorfiles/400.http
  124.     errorfile 403 /usr/local/haproxy/errorfiles/403.http
  125.     errorfile 408 /usr/local/haproxy/errorfiles/408.http
  126.     errorfile 500 /usr/local/haproxy/errorfiles/500.http
  127.     errorfile 502 /usr/local/haproxy/errorfiles/502.http
  128.     errorfile 503 /usr/local/haproxy/errorfiles/503.http
  129.     errorfile 504 /usr/local/haproxy/errorfiles/504.http

  130. #监控haproxy后端服务器的监控状态
  131. listen site_status
  132.        bind 0.0.0.0:1081 #监听端口
  133.        mode http #http的7层模式
  134.        log 127.0.0.1 local2 err #[err warning info debug]
  135.        monitor-uri /site_status #网站健康检测URL,用来检测HAProxy管理的网站是否可以用,正常返回200,不正常返回503
  136.        acl site_dead nbsrv(php_server) lt 1 #定义网站down时的策略当挂在负载均衡上的指定backend的中有效机器数小于1台时返回true
  137.        acl site_dead nbsrv(html_server) lt 1
  138.        acl site_dead nbsrv(backend_default) lt 1
  139.        monitor fail if site_dead #当满足策略的时候返回503,网上文档说的是500,实际测试为503
  140.        monitor-net 192.168.4.171/32 #来自192.168.4.152的日志信息不会被记录和转发
  141.        monitor-net 192.168.4.172/32
  142.       
  143. #frontend, 名字自定义
  144. frontend HAproxy_Cluster
  145.     #定义前端监听端口, 建议采用bind *:80的形式,否则做集群高可用的时候有问题,vip切换到其余机器就不能访问.
  146.     bind 0.0.0.0:80
  147.   
  148.     #acl后面是规则名称,当请求的url末尾是以.php结尾时,匹配触发php_web规则,以下两种写法均可.
  149.  
  150.     #当请求的url末尾是以.css、.jpg、.png、.jpeg、.js、.gif结尾时,匹配并触发static_web规则.
  151.     #acl static_web path_end .gif .png .jpg .css .js .jpeg
  152.     #acl static_web url_reg /*.(css|jpg|png|jpeg|js|gif)$
  153.     #-i为忽略大小写,当被请求的是以www.test.com开头的主机时,匹配并触发dns_name规则.
  154.     acl html_web hdr_beg(host) -i www.haproxytest.com
  155.     #acl html_web hdr_beg(host) 10.11.4.152
  156.     #当客户端的IP是x.x.x.x时,匹配并触发src_ip规则.
  157.     #acl src_ip src x.x.x.x
  158.     #如果匹配acl规则php_web,将请求转交到php_server组处理;如果匹配acl规则html_web,将请求转交到html_server组处理.
  159.     use_backend php_server if php_web
  160.     use_backend html_server if html_web
  161.     #如果以上规则都不匹配时,将请求转交到default_backend组处理.
  162.     default_backend backend_default

  163. #backend后端配置, 配置php_server组与html_server组
  164. backend php_server
  165.     #定义负载均衡方式为roundrobin方式, 即基于权重进行轮询调度的算法, 在服务器性能分布较均匀情况下推荐.
  166.     #另有如下几种负载均衡方式:
  167.     #-- static-rr: 也是基于权重进行轮转调度, 但属于静态方法, 运行时调整后端机组权重不会使用新的权重;
  168.     #-- source: 基于请求源IP进行hash运算匹配后端服务器组;
  169.     #-- leastconn: 不适合会话较短的环境, 如基于http的应用;
  170.     #-- uri: 对整个URI进行hash运算;
  171.     #-- uri_param: 对URI中的参数进行转发;
  172.     #-- hdr(<name>):根据http头进行转发, 无该头部则转为使用roundrobin.
  173.     balance roundrobin
  174.     mode http
  175.     #允许插入serverid到cookie中,serverid后面可定义
  176.     cookie SERVERID
  177.     #心跳检测方式为检测后端服务器index.html文件,还有其他方式
  178.     option httpchk GET /index.html
  179.     #后端服务器定义, maxconn 1024表示该服务器的最大连接数, cookie 1表示serverid为1, weight代表权重(默认1,最大为265,0则表示不参与负载均衡),
  180.     #check inter 1500是检测心跳频率, rise 2是2次正确认为服务器可用, fall 3是3次失败认为服务器不可用.
  181.     server php1 192.168.4.171:80 maxconn 1024 cookie 1 weight 3 check inter 1500 rise 2 fall 3

  182. backend html_server
  183.     balance source
  184.     mode http
  185.     server html1 192.168.4.172:80 maxconn 1024 cookie 1 weight 3 check inter 1500 rise 2 fall 3

  186. backend backend_default
  187.     balance source
  188.     mode http
  189.     server default1 192.168.4.171:80 maxconn 1024 cookie 1 weight 3 check inter 1500 rise 2 fall 3

2)   error文件

点击(此处)折叠或打开

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

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

3)   日志文件

创建文件

点击(此处)折叠或打开

  1. [root@elk-node2 ~]# mkdir -p /usr/local/haproxy/log
  2. [root@elk-node2 ~]# touch /usr/local/haproxy/log/haproxy.log
  3. [root@elk-node2 ~]# ln -s /usr/local/haproxy/log/haproxy.log /var/log/
  4. [root@elk-node2 ~]# chown haproxy:haproxy /var/log/haproxy.log

rsyslog主配置文件

点击(此处)折叠或打开

  1. [root@elk-node2 ~]# vim /etc/sysconfig/rsyslog
  2. SYSLOGD_OPTIONS="-c 2 -r -m 0"

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

rsyslog文件

点击(此处)折叠或打开

  1. [root@elk-node2 ~]# cd /etc/rsyslog.d/
  2. [root@elk-node2 rsyslog.d]# touch haproxy.conf
  3. [root@elk-node2 rsyslog.d]# chown haproxy:haproxy haproxy.conf
  4. [root@elk-node2 rsyslog.d]# vim haproxy.conf
  5. # Provides UDP syslog reception
  6. $ModLoad imudp
  7. $UDPServerRun 514
  8. # haproxy.log
  9. #
  10. local0.* /usr/local/haproxy/log/haproxy.log
  11. #local1.* /usr/local/haproxy/log/haproxy.log
  12. local2.* /usr/local/haproxy/log/haproxy.log
  13. &~
  14. [root@elk-node2 rsyslog.d]# systemctl restart rsyslog.service
  15. [root@elk-node2 rsyslog.d]# setenforce 0

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

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

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

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

点击(此处)折叠或打开

  1. [root@elk-node2 ~]# chown -R haproxy:haproxy /usr/local/haproxy/
  2. [root@elk-node2 ~]# mkdir -p /etc/haproxy
  3. [root@elk-node2 ~]# ln -s /usr/local/haproxy/etc/haproxy.cfg /etc/haproxy/
  4. [root@elk-node2 ~]# chown -R haproxy:haproxy /etc/haproxy

3.  配置开机启动

点击(此处)折叠或打开

  1. [root@elk-node2 ~]# cp /usr/local/src/haproxy-1.7.2/examples/haproxy.init /etc/rc.d/init.d/haproxy
  2. [root@elk-node2 ~]# chown haproxy:haproxy /etc/rc.d/init.d/haproxy
  3. [root@elk-node2 ~]# chmod +x /etc/rc.d/init.d/haproxy

4.  配置全局启动文件

点击(此处)折叠或打开

  1. [root@elk-node2 ~]# ln -s /usr/local/haproxy/sbin/haproxy /usr/sbin/
  2. [root@elk-node2 ~]# chown haproxy:haproxy /usr/sbin/haproxy

#采用软链接方式。

5.  配置防火墙

点击(此处)折叠或打开

  1. [root@elk-node2 ~]# vim /etc/sysconfig/iptables
  2. -A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
  3. -A INPUT -p tcp -m state --state NEW -m tcp --dport 1080 -j ACCEPT
  4. -A INPUT -p tcp -m state --state NEW -m tcp --dport 1081 -j ACCEPT
  5. -A INPUT -p udp -m state --state NEW -m tcp --dport 514 -j ACCEPT
  6. [root@elk-node2 ~]# service iptables restart

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

6.  启动并验证

点击(此处)折叠或打开

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

1)   端口验证

点击(此处)折叠或打开

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


2)   监控页面

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



3)   访问页面

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

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

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

阅读(8844) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

锤锤大人2018-02-13 18:12:57

楼主,倒数第二张图那里,访问“www.haproxytest.com”前需要设置什么吗?为什么我测试的时候不行呢?