卧槽!HAProxy安装、运行教程详解!凭借免费开源之力,登顶主流负载均衡Top宝座!

2024-09-12 16:55:49 浏览数 (1)

前言

今天,小二哥和一位上海的读者小伙伴聊天,聊了聊工作、生活、目前的市场行情... 不知怎么的就聊到负载均衡了。

小二哥觉得这个蛮有意思的。这里就给大家分享一款小二哥用过的软件:HAProxy

HAProxy简介

HAProxy(High Availability Proxy)是一款使用C语言编写的,高性能的开源负载均衡器和代理服务器软件,可以运行于大部分主流的Linux操作系统上。

HAProxy,以其卓越的性能和丰富的功能在构建大规模、高可用性的网络服务中发挥着重要作用。它特别适用于那些负载特大的web站点。

本文将详细介绍HAProxy的安装和运行过程,帮助读者小伙伴们快速掌握这一强大工具的使用。

安装HAProxy

1. 准备工作

在安装HAProxy之前,请确保你的系统环境满足以下要求:

  • 操作系统:支持多种Linux发行版,如CentOS、Ubuntu等。
  • 必要的依赖包:如make、gcc、pcre-devel、bzip2-devel、openssl-devel等。
  • 关闭防火墙和SELinux(或设置为Permissive模式),以避免安全策略干扰HAProxy的正常运行。
2. 安装步骤

以下以CentOS7系统为例,展示HAProxy(1.7.2)的安装过程:

(1)安装必要的依赖包

代码语言:javascript复制
sudo yum -y install make gcc pcre-devel bzip2-devel openssl-devel

(2)下载并编译安装HAProxy

你可以从HAProxy的官方网站(https://www.haproxy.org/)下载最新版本的源码包,或者使用包管理器直接安装(如果可用)。以下是通过源码包安装的方法:

代码语言:javascript复制
wget http://www.haproxy.org/download/1.7/src/haproxy-1.7.2.tar.gz
tar -xzf haproxy-1.7.2.tar.gz

编译并安装

代码语言:javascript复制
make TARGET=linux2628 USE_OPENSSL=1 USE_PCRE=1 USE_SYSTEMD=1
sudo make install PREFIX=/home/ha/haproxy

TARGET根据当前操作系统内核版本指定:

代码语言:javascript复制
- linux22     for Linux 2.2
- linux24     for Linux 2.4 and above (default)
- linux24e    for Linux 2.4 with support for a working epoll (> 0.21)
- linux26     for Linux 2.6 and above
- linux2628   for Linux 2.6.28, 3.x, and above (enables splice and tproxy)

此例中,我们的操作系统内核版本为3.10.0,所以TARGET指定为linux2628。

USE_OPENSSLUSE_PCREUSE_SYSTEMD等选项根据你的实际需求和系统环境进行选择。

PREFIX为指定的安装路径。大家看到,这我是为HAProxy专门创建了用户和用户组,此例中用户和用户组都是ha

此外,如果想要让HAProxy监听1024以下的端口,则需要以root用户来启动。

(3)创建软连接(可选)

为了方便使用,可以将HAProxy的可执行文件添加到系统的PATH中:

代码语言:javascript复制
sudo ln -s /home/ha/haproxy/sbin/* /usr/sbin/
3. 配置文件

HAProxy的配置文件通常位于/etc/haproxy/目录下,文件名为haproxy.cfg

但这里,我们自己创建一个HAProxy配置文件。

代码语言:javascript复制
mkdir -p /home/ha/haproxy/conf
vi /home/ha/haproxy/conf/haproxy.cfg

配置文件由多个部分组成,包括global、defaults、frontend、backend和listen等。以下是一个最简单配置文件

代码语言:javascript复制
global #全局属性
    daemon  #以daemon方式在后台运行
    maxconn 256  #最大同时256连接
    pidfile /home/ha/haproxy/conf/haproxy.pid  #指定保存HAProxy进程号的文件

defaults #默认参数
    mode http  #http模式
    timeout connect 5000ms  #连接server端超时5s
    timeout client 50000ms  #客户端响应超时50s
    timeout server 50000ms  #server端响应超时50s

frontend http-in #前端服务http-in
    bind *:8080  #监听8080端口
    default_backend servers  #请求转发至名为"servers"的后端服务

backend servers #后端服务servers
    server server1 127.0.0.1:8000 maxconn 32  #backend servers中只有一个后端服务,名字叫server1,起在本机的8000端口,HAProxy同时最多向这个服务发起32个连接

更加详细的配置会在后面章节中进行说明。

注意:HAProxy要求系统的ulimit -n参数大于[maxconn*2 18],在设置较大的maxconn时,注意检查并修改ulimit -n参数。

运行

1.将HAProxy注册为系统服务

在/etc/init.d目录下添加HAProxy服务的启动和停止脚本:

代码语言:javascript复制
vi /etc/init.d/haproxy

#! /bin/sh
set -e

PATH=/sbin:/bin:/usr/sbin:/usr/bin:/home/ha/haproxy/sbin
PROGDIR=/home/ha/haproxy
PROGNAME=haproxy
DAEMON=$PROGDIR/sbin/$PROGNAME
CONFIG=$PROGDIR/conf/$PROGNAME.cfg
PIDFILE=$PROGDIR/conf/$PROGNAME.pid
DESC="HAProxy daemon"
SCRIPTNAME=/etc/init.d/$PROGNAME

# Gracefully exit if the package has been removed.
test -x $DAEMON || exit 0

start()
{
       echo -e "Starting $DESC: $PROGNAMEn"
       $DAEMON -f $CONFIG
       echo "."
}

stop()
{
       echo -e "Stopping $DESC: $PROGNAMEn"
       haproxy_pid="$(cat $PIDFILE)"
       kill $haproxy_pid
       echo "."
}

restart()
{
       echo -e "Restarting $DESC: $PROGNAMEn"
       $DAEMON -f $CONFIG -p $PIDFILE -sf $(cat $PIDFILE)
       echo "."
}

case "$1" in
 start)
       start
       ;;
 stop)
       stop
       ;;
 restart)
       restart
       ;;
 *)
       echo "Usage: $SCRIPTNAME {start|stop|restart}" >&2
       exit 1
       ;;
esac

exit 0
2.启动、停止和重启
代码语言:javascript复制
service haproxy start
service haproxy stop
service haproxy restart
3.添加日志

HAProxy不会直接输出文件日志,所以我们要借助Linux的rsyslog来让HAProxy输出日志>

修改haproxy.cfg在global域和defaults域中添加:

代码语言:javascript复制
global
    ...
    log 127.0.0.1 local0 info
    log 127.0.0.1 local1 warning
    ...

defaults
    ...
    log global
    ...

意思是,将info级(及以上)的日志推送到rsyslog的local0接口,将warn级(及以上)的日志推送到rsyslog的local1接口,并且所有frontend都默认使用global中的日志配置。

注:info级的日志会打印HAProxy处理的每一条请求,会占用很大的磁盘空间,在生产环境中,建议将日志级别调整为notice。

为rsyslog添加haproxy日志的配置

代码语言:javascript复制
vi /etc/rsyslog.d/haproxy.conf
代码语言:javascript复制
$ModLoad imudp

$UDPServerRun 514
$FileCreateMode 0644  #日志文件的权限
$FileOwner ha  #日志文件的owner
local0.*     /var/log/haproxy.log  #local0接口对应的日志输出文件
local1.*     /var/log/haproxy_warn.log  #local1接口对应的日志输出文件

修改rsyslog的启动参数

代码语言:javascript复制
vi /etc/sysconfig/rsyslog
# Options for rsyslogd

# Syslogd options are deprecated since rsyslog v3.
# If you want to use them, switch to compatibility mode 2 by "-c 2"
# See rsyslogd(8) for more details
SYSLOGD_OPTIONS="-c 2 -r -m 0"
4.重启rsyslog和HAProxy
代码语言:javascript复制
service rsyslog restart
service haproxy restart

此时就应该能在/var/log目录下看到haproxy的日志文件了。

5.日志切分

通过rsyslog输出的日志是不会进行切分的,所以需要依靠Linux提供的logrotate来进行切分工作。

使用root用户,创建haproxy日志切分配置文件:

代码语言:javascript复制
mkdir /root/logrotate
vi /root/logrotate/haproxy
代码语言:javascript复制
/var/log/haproxy.log /var/log/haproxy_warn.log {  #切分的两个文件名
    daily        #按天切分
    rotate 7     #保留7份
    create 0644 ha ha  #创建新文件的权限、用户、用户组
    compress     #压缩旧日志
    delaycompress  #延迟一天压缩
    missingok    #忽略文件不存在的错误
    dateext      #旧日志加上日志后缀
    sharedscripts  #切分后的重启脚本只运行一次
    postrotate   #切分后运行脚本重载rsyslog,让rsyslog向新的日志文件中输出日志
      /bin/kill -HUP $(/bin/cat /var/run/syslogd.pid 2>/dev/null) &>/dev/null
    endscript
}

并配置在crontab中运行:

代码语言:javascript复制
0 0 * * * /usr/sbin/logrotate /root/logrotate/haproxy

0 人点赞