原文发表于cu:2017-03-16

参考文档:

  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;
  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]# wget http://www.haproxy.org/download/1.7/src/haproxy-1.7.2.tar.gz

2. 编译安装

#”TARGET”指定编译对应的os对应的内核版本,通过”uname -r”查询内核版本呢,README文件可查询对应关系
[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=linux2628 PREFIX=/usr/local/haproxy
[root@elk-node2 haproxy-1.7.2]# make install PREFIX=/usr/local/haproxy

三.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级别,可配置两条
log 127.0.0.1 local0 warning
#定义日志级别【error warning info debug】
#log 127.0.0.1 local1 info #运行路径
chroot /usr/local/haproxy
#PID 文件存放路径
pidfile /var/run/haproxy.pid #设置每haproxy进程的最大并发连接数, 其等同于命令行选项“-n”; “ulimit -n”自动计算的结果参照此参数设定.
maxconn 4096 #运行haproxy 用户, 或者使用关键字uid
user haproxy
#运行haproxy 用户组, 或者使用关键字gid
group haproxy #后台运行haproxy
daemon #设置启动的haproxy进程数量, 只能用于守护进程模式的haproxy;
#默认只启动一个进程, 鉴于调试困难等多方面的原因, 一般只在单进程仅能打开少数文件描述符的场景中才使用多进程模式.
nbproc 1
#设置每进程所能够打开的最大文件描述符数目, 默认情况其会自动进行计算, 因此不推荐修改此选项.
#ulimit-n 819200 #调试级别, 一般只在开启单进程时调试, 且生产环境禁用.
#debug
#haproxy启动后不会显示任何相关信息, 这与在命令行启动haproxy时加上参数“-q”相同
#quiet #定义统计信息保存位置
stats socket /usr/local/haproxy/stats #默认配置
defaults
#默认的模式【tcp:4层; http:7层; health:只返回OK】
mode http #继承全局的日志定义输出
log global #日志类别, httplog
#option httplog #如果后端服务器需要记录客户端真实ip, 需要在HTTP请求中添加”X-Forwarded-For”字段;
#但haproxy自身的健康检测机制访问后端服务器时, 不应将记录访问日志,可用except来排除127.0.0.0,即haproxy本身.
#option forwardfor except 127.0.0.0/8
option forwardfor #开启http协议中服务器端关闭功能, 每个请求完毕后主动关闭http通道, 使得支持长连接,使得会话可以被重用,使得每一个日志记录都会被记录.
option httpclose #如果产生了一个空连接,那这个空连接的日志将不会记录.
option dontlognull #当与后端服务器的会话失败(服务器故障或其他原因)时, 把会话重新分发到其他健康的服务器上; 当故障服务器恢复时, 会话又被定向到已恢复的服务器上;
#还可以用”retries”关键字来设定在判定会话失败时的尝试连接的次数
option redispatch
retries 3 #当haproxy负载很高时, 自动结束掉当前队列处理比较久的链接.
option abortonclose #默认http请求超时时间
timeout http-request 10s
#默认队列超时时间, 后端服务器在高负载时, 会将haproxy发来的请求放进一个队列中.
timeout queue 1m
#haproxy与后端服务器连接超时时间.
timeout connect 5s
#客户端与haproxy连接后, 数据传输完毕, 不再有数据传输, 即非活动连接的超时时间.
timeout client 1m
#haproxy与后端服务器非活动连接的超时时间.
timeout server 1m
#默认新的http请求连接建立的超时时间,时间较短时可以尽快释放出资源,节约资源.
timeout http-keep-alive 10s
#心跳检测超时时间
timeout check 10s #最大并发连接数
maxconn 2000 #设置默认的负载均衡方式
#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) lt 1 #定义网站down时的策略当挂在负载均衡上的指定backend的中有效机器数小于1台时返回true
acl site_dead nbsrv(html_server) lt 1
acl site_dead nbsrv(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规则,以下两种写法均可.
acl php_web url_reg /*.php #当请求的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(<name>):根据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 inter 1500 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 inter 1500 rise 2 fall 3 backend backend_default
balance source
mode http
server default1 192.168.4.171:80 maxconn 1024 cookie 1 weight 3 check inter 1500 rise 2 fall 3

2)error文件

#配置文件中统计监控页面部分定义了error文件,将安装包中的文件复制到安装目录使用
[root@elk-node2 ~]# cp -r /usr/local/src/haproxy-1.7.2/examples/errorfiles/ /usr/local/haproxy/

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主配置文件

#修改”SYSLOGD_OPTIONS”参数,-c 2 使用兼容模式,默认是 -c 5;-r 开启远程日志;-m 0 标记时间戳,单位是分钟,0表示禁用该功能
[root@elk-node2 ~]# vim /etc/sysconfig/rsyslog
# SYSLOGD_OPTIONS="-c 2 -r -m 0"
SYSLOGD_OPTIONS="-c 2 -r"

rsyslog文件

#haproxy默认没有日志,依靠rsyslog收集日志;
#文件最末尾的“&~”,如果没有此配置,日志除写入指定文件外,会同步写入messages文件
[root@elk-node2 ~]# cd /etc/rsyslog.d/
[root@elk-node2 rsyslog.d]# touch haproxy.conf
[root@elk-node2 rsyslog.d]# chown haproxy:haproxy haproxy.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 restart rsyslog.service #关闭selinux,本文因没有关闭selinux导致排查问题用了比较长的时间
[root@elk-node2 rsyslog.d]# setenforce 0

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
[root@elk-node2 ~]# chkconfig --add haproxy
[root@elk-node2 ~]# chkconfig --level 35 haproxy on

4. 配置全局启动文件

#采用软链接方式
[root@elk-node2 ~]# ln -s /usr/local/haproxy/sbin/haproxy /usr/sbin/
[root@elk-node2 ~]# chown haproxy:haproxy /usr/sbin/haproxy

5. 配置防火墙

#开放如上端口,均在配置文件中有定义,日志端口在rsyslog.d/haproxy.conf文件中定义
[root@elk-node2 ~]# vim /etc/sysconfig/iptables
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 1080 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 1081 -j ACCEPT
-A INPUT -p udp -m state --state NEW -m tcp --dport 514 -j ACCEPT [root@elk-node2 ~]# service iptables restart

6. 启动并验证

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

1)端口验证

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

2)监控页面

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

3)访问页面

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

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

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

CentOS7.2 部署Haproxy 1.7.2的更多相关文章

  1. CentOS7.3 部署Haproxy 1.7.2

    haproxy:http://www.haproxy.org/ 本文涉及haproxy的安装,并做简单配置. 一.环境准备 1. 操作系统 CentOS-7-x86_64-Everything-151 ...

  2. 在 CentOS7 上部署 MySQL 主从

    在 CentOS7 上部署 MySQL 主从 通过 SecureCRT 连接至 MySQL 主服务器: 找到 my.cnf 文件所在的目录: mysql --help | grep my.cnf 一般 ...

  3. 在 CentOS7 上部署 zookeeper 服务

    在 CentOS7 上部署 zookeeper 服务 1 用 SecureCRT 或 XShell 等 Linux 客户端工具连接至 CentOS7 服务器: 2 进入到 /usr/local/too ...

  4. GIT-Linux(CentOS7)系统部署git服务器

    GIT-Linux(CentOS7)系统部署git服务器 root账号登录 一. 安装并配置必要的依赖关系在CentOS系统上安装所需的依赖:ssh,防火墙,postfix(用于邮件通知) ,wget ...

  5. 在阿里云ECS CentOS7上部署基于MongoDB+Node.js的博客

    前言:这是一篇教你如何在阿里云的ECS CentOS 7服务器上搭建一个个人博客的教程,教程比较基础,笔者尽可能比较详细的把每一步都罗列下来,包括所需软件的下载安装和域名的绑定,笔者在此之前对Linu ...

  6. CentOS7.4部署Python3+Django+uWSGI+Nginx

    CentOS7.4部署Python3+Django+uWSGI+Nginx http://www.showerlee.com/archives/2590

  7. CentOS7安装部署zabbix3.4操作记录

    CentOS7安装部署zabbix3.4操作记录 1.安装前准备 1.1 查看centos的系统版本 [root@zabbix ~]# cat /etc/redhat-release CentOS L ...

  8. centos7.2 部署zabbix 3.2.7

    centos7.2 部署zabbix 3.2.7[zabbix@zabbixServer ~]$ cat /etc/redhat-release CentOS Linux release 7.2.15 ...

  9. CentOS7中部署Showdoc

    目录 CentOS7中部署Showdoc 前置环境 部署 配置文件 解压安装包 添加启动服务 设置权限 运行安装 界面 CentOS7中部署Showdoc 文:铁乐与猫 前置环境 因为showdoc其 ...

随机推荐

  1. import 本质

    一. 模块:用来从逻辑上来组织python代码(变量,函数,类,逻辑,实现一个功能),本质就是,py结尾的python文件 1.1 导入方法: import module import module1 ...

  2. [iOS]CIDetector之CIDetectorTypeFace人脸识别

    - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typica ...

  3. HCDA day1

    OSI有几层: OSI将计算机网络体系结构(architecture)划分为以下七层: 图1.OSI模型 物理层: 将数据转换为可通过物理介质传送的电子信号 相当于邮局中的搬运工人. 物理层(Phys ...

  4. centos6.8安装mysql过程

    1.验证Centos是否安装MySQL $>yum list installed | grep mysql 2.删除MySql $>yum –y remove mysql-libs.X86 ...

  5. 二叉树 ADT接口 遍历算法 常规运算

    BTree.h   (结构定义, 基本操作, 遍历) #define MS 10 typedef struct BTreeNode{ char data; struct BTreeNode * lef ...

  6. Find the Duplicate Number (寻找重复数字)

    对于一个长度为n+1的数组,其中每一个值的取值范围是[1,n],可以证明的是必然存在一个重复数字(抽屉原理),假设仅存在一个重复数字,找到他. 举例:输入:[1,3,4,2,1],输出:1 自己做的时 ...

  7. MFC中两个对话框之间数据传递

    以下是在网上参考的一篇文章,网址:https://blog.csdn.net/foreverhuylee/article/details/21707197 这里有两种情况, 第一种情况是: (在一个基 ...

  8. 20155220java实验二 面向对象程序设计 实验报告

    一.实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模式 实验步骤 (一)单元测试 (1) 三种代码 伪代码 产 ...

  9. 20155331 2016-2017-2 《Java程序设计》

    20155331 2016-2017-2 <Java程序设计> 教材学习内容总结 理解封装,继承和多态. 封装最简单的理解就是包装,把编译的class文件封装起来,便于管理,还可以设置密码 ...

  10. day 6 汽车4S店铺

    1.版本1:大框架 class CarStore(object): '''定义一个汽车店铺类''' pass class Car(object): '''定义一个汽车类''' pass car_sto ...