在大型系统设计中用代理在负载均衡是最常见的一种方式,而相对靠谱的解决方案中Nginx、HAProxy、LVS、F5在各大场中用得比较普遍,各有各的优势和使用场景,由于本次要使用到TCP,因此Nginx只能在HTTP层负载,因此用HAProxy来负载,为什么不用LVS?因为配置太麻烦。

HAProxy是免费、极速且可靠的用于为TCP和基于HTTP应用程序提供高可用、负载均衡和代理服务的解决方案,尤其适用于高负载且需要持久连接或7层处理机制的web站点。HAProxy还可以将后端的服务器与网络隔离,起到保护后端服务器的作用。HAProxy的负载均衡能力虽不如LVS,但也是相当不错,而且由于其工作在7层,可以对http请求报文做深入分析,按照自己的需要将报文转发至后端不同的服务器(例如动静分离),这一点工作在4层的LVS无法完成。

环境

  CentOS6.X

  HAProxy 1.7.3

  用root用户安装

下载

  若在线安装不用下载,可直接通过yum命令安装(建议),不过需要联网。

  去官网下载 :http://www.haproxy.org/download/1.7/src/haproxy-1.7.3.tar.gz

  下载后放进CentOS中的/usr/local/  文件夹中(至于怎么放,你不会 这个锅我不背,去学学Linux 操作基础)

关闭SElinux、配置防火墙

vi /etc/selinux/config

#SELINUX=enforcing #注释掉
#SELINUXTYPE=targeted #注释掉
SELINUX=disabled #增加
:wq! #保存退出
setenforce 0 #使配置立即生效
vi /etc/sysconfig/iptables  #编辑

-A RH-Firewall-1-INPUT -d 224.0.0.18 -j ACCEPT  #允许组播地址通信(在做keepalived时用得到)
-A RH-Firewall-1-INPUT -p vrrp -j ACCEPT #允许VRRP(虚拟路由器冗余协)通信
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT #允许80端口通过防火墙
:wq! #保存退出
service iptables restart #重启防火墙使配置生效

创建HAProxy运行账户和组

[root@H32 local]# groupadd haproxy #添加haproxy组
[root@H32 local]# useradd -g haproxy haproxy -s /bin/false #创建nginx运行账户haproxy并加入到haproxy组,不允许haproxy

安装

  分两种:

  1、在线装:yum install haproxy (建议)

  2、安装包:

  环境中要有gcc,用于编译,一般安装环境时都会有,若没有 运行 :

  yum install -y gcc

  进入local文件夹中

[root@H32 ~]#cd /usr/local

  然后解压下载好haproxy包到当前文件夹

[root@H32 local]# tar -zxvf haproxy-1.7.3.tar.gz
[root@H32 local]# cd haproxy-1.7.3

安装

[root@H32 haproxy-1.7.3]# make TARGET=linux3100 CPU=x86_64 PREFIX=/usr/local/haproxy-1.7.3 #编译(源码才需要)  uname -r #查看系统内核版本号
[root@H32 haproxy-1.7.3]# make install PREFIX=/usr/local/haproxy-1.7.3 #安装 haproxy-1.7.3为解压后的文件路径(很重要)

设置HAProxy

mkdir -p /usr/local/haproxy-1.7.3/conf  #创建配置文件目录
mkdir -p /etc/haproxy #创建配置文件目录
touch /usr/local/haproxy-1.7.3/conf/haproxy.cfg #创建配置文件
ln -s /usr/local/haproxy-1.7.3/conf/haproxy.cfg /etc/haproxy/haproxy.cfg #添加配置文件软连接
cp -r /usr/local/haproxy-1.7.3/examples/errorfiles /usr/local/haproxy-1.7.3/errorfiles #拷贝错误页面
ln -s /usr/local/haproxy-1.7.3/errorfiles /etc/haproxy/errorfiles #添加软连接
mkdir -p /usr/local/haproxy-1.7.3/log #创建日志文件目录
touch /usr/local/haproxy-1.7.3/log/haproxy.log #创建日志文件
ln -s /usr/local/haproxy-1.7.3/log/haproxy.log /var/log/haproxy.log #添加软连接
cp /usr/local/haproxy-1.7.3/examples/haproxy.init /etc/rc.d/init.d/haproxy #拷贝开机启动文件
chmod +x /etc/rc.d/init.d/haproxy #添加脚本执行权限
chkconfig haproxy on #设置开机启动
ln -s /usr/local/haproxy-1.7.3/sbin/haproxy /usr/sbin #添加软连接

  注意上面的文件夹,若与上面的文件夹路径一致,可以直接复制运行。

配置haproxy.cfg参数

vi  /usr/local/haproxy-1.7.3/conf/haproxy.cfg  #编辑

  这里是最关键的设置,在此有两个相同的服务由两台服务器提供:192.168.30.33,192.168.30.34

#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
log 127.0.0.1 local2 ###[err warning info debug]
chroot /usr/local/haproxy-1.7.3
pidfile /var/run/haproxy.pid ###haproxy的pid存放路径,启动进程的用户必须有权限访问此文件
maxconn 4000 ###最大连接数,默认4000
user haproxy
group haproxy
daemon ###创建1个进程进入deamon模式运行。此参数要求将运行模式设置为"daemon" #---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults
mode http ###默认的模式,tcp是4层,http是7层,health只会返回OK 若是混合模式则 mode 不需要设置
log global ###采用全局定义的日志
option dontlognull ###不记录健康检查的日志信息
option httpclose ###每次请求完毕后主动关闭http通道
option httplog ###日志类别http日志格式 混合模式 此处还需要加上 tcplog
#option forwardfor ###如果后端服务器需要获得客户端真实ip需要配置的参数,可以从Http Header中获得客户端ip
option redispatch ###serverId对应的服务器挂掉后,强制定向到其他健康的服务器
timeout connect 10s #default 10 second timeout if a backend is not found
timeout client 10s ###客户端连接超时
timeout server 10s ###服务器连接超时
maxconn 60000 ###最大连接数
retries 3 ###3次连接失败就认为服务不可用,也可以通过后面设置 ########统计页面配置########
listen admin_stats
# 监听端口
bind 0.0.0.0:8089
# 启用状态监控
stats enable
mode http
log global
# 统计页面URL
stats uri /stats
# 统计页面密码框上提示文本
stats realm Haproxy\ Statistics
# 统计页面用户名和密码设置
stats auth admin:admin
# 隐藏统计页面上HAProxy的版本信息
#stats hide-version
#当通过认证才可管理
stats admin if TRUE
#统计页面自动刷新时间
stats refresh 30s ########WEB配置#################
listen web1080
bind 0.0.0.0:1080
mode http
option httplog
log global
maxconn 3000
balance leastconn
server web33 192.168.80.33:8007 weight 1 rise 2 fall 3
server web34 192.168.80.34:8007 weight 1 rise 2 fall 3
#---------------------------------------------------------------------
# main frontend which proxys to the backends 这里不需要动静分离,所以全部注释掉
#---------------------------------------------------------------------
#frontend main *:5000
# acl url_static path_beg -i /static /images /javascript /stylesheets
# acl url_static path_end -i .jpg .gif .png .css .js # use_backend static if url_static
# default_backend app #---------------------------------------------------------------------
# static backend for serving up images, stylesheets and such
#---------------------------------------------------------------------
#backend static
# balance roundrobin
# 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 #---------------------------------------------------------------------
# round robin balancing between the various backends
#---------------------------------------------------------------------
#errorloc 503 http://www.osyunwei.com/404.html
errorfile 403 /etc/haproxy/errorfiles/403.http
errorfile 500 /etc/haproxy/errorfiles/500.http
errorfile 502 /etc/haproxy/errorfiles/502.http
errorfile 503 /etc/haproxy/errorfiles/503.http
errorfile 504 /etc/haproxy/errorfiles/504.http

  统一绑定的对外接口为1080, 监控页面端口为8089。

启动

:wq! #保存退出
service haproxy start #启动
#设置开机启动
chkconfig haproxy on

设置HAProxy日志

vi  /etc/syslog.conf  #编辑,在最下边增加
# haproxy.log
local0.* /var/log/haproxy.log
local1.* /var/log/haproxy.log
local2.* /var/log/haproxy.log
local3.* /var/log/haproxy.log
:wq! #保存退出
vi  /etc/sysconfig/rsyslog   #编辑修改
SYSLOGD_OPTIONS="-r -m 0" #接收远程服务器日志
:wq! #保存退出
service rsyslog restart #重启syslog

监控页面

  打开监控页面,用户名密码为admin,出现下面的页面就说明配置成功:

  http://192.168.30.32:8089/stats

service haproxy stop  #关闭
service haproxy restart #重启

扩展问题:

  此处只做了简单的IP请求负载,还可以做TCP层的负载,但里面的设置需要根据自己的实际情况不停的压力测试进行调置。

  此后还要做Keepalived + HAProxy 多机热备的负载实用方案。

  还可做mysql的读写负载、动静态资源分离等等

ACL规则介绍

  ACL控制哪些开放,往哪里转,哪些屏蔽 ,具体的内容网上也有介绍,此处只做抛砖引玉。

  实例:实现动静分离功能

首先定义两个backend,分别以动态和静态进行分组
backend jingtai
balance roundrobin
server web1 10.0.10.82:80 check weight 1maxconn 2000
backend dongtai
balance roundrobin
server web2 10.0.10.83:80 check weight 1maxconn 3000

配置frontend
frontend web_server
bind *:80
default_backend webservers
acl badguy src 10.0.10.1
acl denyfile path /1.html
#http-request deny if badguy denyfile

acl static path_end .html
use_backend jingtai if static
default_backend dongtai
定义acl名称为static ,如果访问匹配是.html的文件,那么直接跳转至jingtai 这个backend
如果访问的不匹配.html 那么直接跳转至默认backend dongtai组

入坑系列之HAProxy负载均衡的更多相关文章

  1. 解决 RabbitMQ 集群 Channel shutdown: connection error 错误(HAProxy 负载均衡)

    相关文章:搭建 RabbitMQ Server 高可用集群 具体错误信息: 2018-05-04 11:21:48.116 ERROR 60848 --- [.168.0.202:8001] o.s. ...

  2. rabbitmq3.6.5镜像集群搭建以及haproxy负载均衡

    一.集群架构 后端75.103.69分别是3台rabbitmq节点做镜像集群,前端103用haproxy作为负载均衡器 二.安装rabbitmq节点 参照 https://www.cnblogs.co ...

  3. nginx高性能WEB服务器系列之六--nginx负载均衡配置+健康检查

    nginx系列友情链接:nginx高性能WEB服务器系列之一简介及安装https://www.cnblogs.com/maxtgood/p/9597596.htmlnginx高性能WEB服务器系列之二 ...

  4. 负载均衡之haproxy负载均衡算法及haproxy的工作模式

    haproxy负载均衡的算法有如下7种: .roundrobin : 基于权重轮循. static-rr : 基于权重轮循.静态算法,运行时改变无法生效 source : 基于请求源IP的算法.对请求 ...

  5. gulp入坑系列(2)——初试JS代码合并与压缩

    在上一篇里成功安装了gulp到项目中,现在来测试一下gulp的合并与压缩功能 gulp入坑系列(1)--安装gulp(传送门):http://www.cnblogs.com/YuuyaRin/p/61 ...

  6. Nginx/LVS/HAProxy负载均衡软件的优缺点详解

    PS:Nginx/LVS/HAProxy是目前使用最广泛的三种负载均衡软件,本人都在多个项目中实施过,参考了一些资料,结合自己的一些使用经验,总结一下. 一般对负载均衡的使用是随着网站规模的提升根据不 ...

  7. Nginx/LVS/HAProxy负载均衡软件的优缺点详解(转)

    PS:Nginx/LVS/HAProxy是目前使用最广泛的三种负载均衡软件,本人都在多个项目中实施过,参考了一些资料,结合自己的一些使用经验,总结一下. 一般对负载均衡的使用是随着网站规模的提升根据不 ...

  8. Nginx/LVS/HAProxy负载均衡软件的优缺点详解(转)

    PS:Nginx/LVS/HAProxy是目前使用最广泛的三种负载均衡软件,本人都在多个项目中实施过,参考了一些资料,结合自己的一些使用经验,总结一下. 一般对负载均衡的使用是随着网站规模的提升根据不 ...

  9. (总结)Nginx/LVS/HAProxy负载均衡软件的优缺点详解

    PS:Nginx/LVS/HAProxy是目前使用最广泛的三种负载均衡软件,本人都在多个项目中实施过,参考了一些资料,结合自己的一些使用经验,总结一下. 一般对负载均衡的使用是随着网站规模的提升根据不 ...

随机推荐

  1. #图# #SPFA# #Tarjan# ----- BZOJ1179

    SPFA算法 SPFA(Shortest Path Faster Algorithm)(队列优化)算法是求单源最短路径的一种算法. 判负环(在差分约束系统中会得以体现).如果某个点进入队列的次数超过N ...

  2. V8 Javascript 引擎设计理念

    Netscape Navigator 在 90 在年代中期对 JavaScript 进行了集成,这让网页开发人员对 HTML 页面中诸如 form .frame 和 image 之类的元素的访问变得非 ...

  3. linux下的Source命令的基本功能

    source命令用法:source FileName作用:在当前bash环境下读取并执行FileName中的命令.注:该命令通常用命令“.”来替代.如:source .bash_rc 与 . .bas ...

  4. TCP协议滑动窗口(一)——控制数据传输速率

    窗口大小:TCP头中一个16位的域,表示当前可用接受缓冲区大小.在每个TCP对等段连接初始化时,告诉对方自己的窗口大小(不一定是满额,假如满额65201字节,可能暂时通告5840字节).若客户端接受数 ...

  5. Nancy简单实战之NancyMusicStore(五):部署上线

    前言 经过本系列前面四篇文章,NancyMusicStore已经开发完成了,下面就差部署上线了,我们会在两个不同的环境部署.其实之前的文章也有讲解在 Linux下部署的相关事宜.下面开始本文的内容. ...

  6. Java内存回收优化及配置

    原文链接:http://eol.cqu.edu.cn/eol/jpk/course/preview/jpkmaterials_folder_txtrtfview.jsp?resId=23156& ...

  7. Javascript之深入浅出prototype

    我们先来讲一个故事,一个大大的池塘,里面有很多鱼.这是属于我们大家的池塘所以里面的鱼我们都可以吃,但是我们也会从集市买一些鱼放在家里,那么放在家里的鱼肯定是属于我们私人的,外人是不会拥有的.那么在js ...

  8. 一次开放接口从需求分析到发布sdk线上包

    新年开场篇,欢迎来点赞:本篇和大家分享的是使用webapi做得接口服务验证框架,需求来源是我打算把上篇提到的图片验证码做成一种服务提供给大家,尽管我在上篇已经把代码打包开源了,但是如果有一种快速对接成 ...

  9. Ninject之旅之十三:Ninject在ASP.NET MVC程序上的应用(附程序下载)

    摘要: 在Windows客户端程序(WPF和Windows Forms)中使用Ninject和在控制台应用程序中使用Ninject没什么不同.在这些应用程序里我们不需要某些配置用来安装Ninject, ...

  10. 谁该吃药了(线性判别法LDA小故事)

    一家"胡说八道医院"拥有一种治疗癌症的药物, 根据过去的记录, 该药物对一些患者非常有效, 但是会让一些患者感到更痛苦... 我们希望有一种判别准则能帮助我们判断哪些病人该吃药,哪 ...