入坑系列之HAProxy负载均衡

在大型系统设计中用代理在负载均衡是最常见的一种方式,而相对靠谱的解决方案中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组

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏SDNLAB

ONOS编程系列(二)命令行命令与服务开发

此文章承接ONOS编程系列(一) Application Tutorial ,如果尚未看过上一篇,请先看完上一篇,再回过头来看此篇。 本文章的目的在于让读者明白...

35990
来自专栏桥路_大数据

使用Git+Shell自动化部署发布springboot WEB应用

41150
来自专栏linux运维学习

linux学习第六篇:相对,绝对路径、cd命令、创建删除目录以及rm命令

绝对路径和相对路径 绝对路径:从根开始的 相对路径:相对当前你所在位置的路径,不是以根开头的。 pwd:查看当然所在的路径 cd 命令 cd - :回到上一次的...

20280
来自专栏云知识学习

kubectl配置单、多集群访问

您可以通过 Kubernetes 命令行工具 kubectl 从本地客户端机器连接到 TKE 集群。

74320
来自专栏黑白安全

80端口被system(pid=4)占用的解决方法

80端口一般被当做网页服务器的默认端口,使用本机搭建服务器环境的时候,都会默认使用80端口来作为网页访问端,但是有的时候80端口会被其他的不明身份的程序占用,导...

28120
来自专栏崔庆才的专栏

内网主机从外面连接不了?SSH反向隧道来帮你!

40350
来自专栏小樱的经验随笔

mount命令详解及常见问题汇总

一 、mount命令(用来挂载硬盘或镜像等) 用法:mount [-t vfstype] [-o options] device dir 1、-t vfstyp...

1.1K50
来自专栏漏斗社区

仰望PHPSHE1.5漏洞

背景 最近拿到PHPSHE 1.5的源码进行了审计,于是撰写了本篇,把一些问题发出来,多处SQL注入,任意文件删除,host头部攻击进行讨论,如 host位置的...

41090
来自专栏Python

CentOS下Redis的安装

CentOS下Redis的安装 前言 安装Redis需要知道自己需要哪个版本,有针对性的安装,比如如果需要redis GEO这个地理集合的特性,那么redis...

44570
来自专栏我的技术笔记

在Ubuntu 14.04上安装GitLab(Trusty Tahr)

GitLab是一个基于Ruby on Rails的免费git存储库管理应用程序。假如您想托管自己的git存储库,这是一个很好的替代方案,因为在编写私有代码或则闭...

22610

扫码关注云+社区

领取腾讯云代金券