• Haproxy (一)之安装 (centos)


    1、下载

    (1) 商业化官网地址:http://www.haproxy.com/

     其中可以选择社区版的。这里案例中下载社区版的  2.3.9 版本。

    (2) 社区版本地址:http://www.haproxy.org/

     

    2、安装

     三台服务器, 192.168.149.130 安装 haproxy,192.168.149.128 及 192.168.149.129 分别安装 上下文为 service1 的 web 服务 ,使用 haproxy 进行负载均衡这两个实例服务。

    (1)部署前操作

    将 下载下来的 gz 包上传到 Linux 服务上。

    (2)部署

    tar zxvf haproxy-2.3.9.tar.gz

    cd haproxy-2.3.9

    uname -a    //查看内核信息

    make PREFIX=/opt/haproxy/haproxy TARGET=4180 CPU=x86_64

    make install PREFIX=/opt/haproxy/haproxy

    cd /opt/haproxy/haproxy

    mkdir conf

    touch conf/haproxy.cfg  #创建配置文件

    mkdir -p /etc/haproxy

    ln -s /opt/haproxy/haproxy/conf/haproxy.cfg /etc/haproxy/haproxy.cfg  #将配置文件软链接到 /etc/haproxy目录中

    cp -r /opt/haproxy/haproxy-2.3.9/examples/errorfiles /opt/haproxy/haproxy/errorfiles

    ln -s /opt/haproxy/haproxy/errorfiles /etc/haproxy/errorfiles  #将安装目录下的错误页面文件软链接到 /etc/haproxy目录下

    cp /opt/haproxy/haproxy-2.3.9/examples/haproxy.init /etc/rc.d/init.d/haproxy # 定义成系统服务

    chmod +x /etc/rc.d/init.d/haproxy   #授权

    chkconfig haproxy on  #设置开机启动

    ln -s /opt/haproxy/haproxy/sbin/haproxy /usr/sbin/haproxy  #添加链接

    这里 为 haproxy.cfg errorfiles haproxy程序文件 创建软链接 是因为 haproxy 服务器 启动文件 haproxy.init 中 记录的配置文件路径、haproxy程序路径分别在 /etc/haproxy 及 /usr/sbin 路径下,haproxy.init 文件内容如下:

    #!/bin/sh
    #
    # chkconfig: - 85 15
    # description: HA-Proxy is a TCP/HTTP reverse proxy which is particularly suited 
    #              for high availability environments.
    # processname: haproxy
    # config: /etc/haproxy/haproxy.cfg
    # pidfile: /var/run/haproxy.pid
    
    # Script Author: Simon Matter <simon.matter@invoca.ch>
    # Version: 2004060600
    
    # Source function library.
    if [ -f /etc/init.d/functions ]; then
      . /etc/init.d/functions
    elif [ -f /etc/rc.d/init.d/functions ] ; then
      . /etc/rc.d/init.d/functions
    else
      exit 0
    fi
    
    # Source networking configuration.
    . /etc/sysconfig/network
    
    # Check that networking is up.
    [ ${NETWORKING} = "no" ] && exit 0
    
    # This is our service name
    BASENAME=`basename $0`
    if [ -L $0 ]; then
      BASENAME=`find $0 -name $BASENAME -printf %l`
      BASENAME=`basename $BASENAME`
    fi
    
    BIN=/usr/sbin/$BASENAME
    
    CFG=/etc/$BASENAME/$BASENAME.cfg
    [ -f $CFG ] || exit 1
    
    PIDFILE=/var/run/$BASENAME.pid
    LOCKFILE=/var/lock/subsys/$BASENAME
    
    RETVAL=0
    
    start() {
      quiet_check
      if [ $? -ne 0 ]; then
        echo "Errors found in configuration file, check it with '$BASENAME check'."
        return 1
      fi
    
      echo -n "Starting $BASENAME: "
      daemon $BIN -D -f $CFG -p $PIDFILE
      RETVAL=$?
      echo
      [ $RETVAL -eq 0 ] && touch $LOCKFILE
      return $RETVAL
    }
    
    stop() {
      echo -n "Shutting down $BASENAME: "
      killproc $BASENAME -USR1
      RETVAL=$?
      echo
      [ $RETVAL -eq 0 ] && rm -f $LOCKFILE
      [ $RETVAL -eq 0 ] && rm -f $PIDFILE
      return $RETVAL
    }
    
    restart() {
      quiet_check
      if [ $? -ne 0 ]; then
        echo "Errors found in configuration file, check it with '$BASENAME check'."
        return 1
      fi
      stop
      start
    }
    
    reload() {
      if ! [ -s $PIDFILE ]; then
        return 0
      fi
    
      quiet_check
      if [ $? -ne 0 ]; then
        echo "Errors found in configuration file, check it with '$BASENAME check'."
        return 1
      fi
      $BIN -D -f $CFG -p $PIDFILE -sf $(cat $PIDFILE)
    }
    
    check() {
      $BIN -c -q -V -f $CFG
    }
    
    quiet_check() {
      $BIN -c -q -f $CFG
    }
    
    rhstatus() {
      status $BASENAME
    }
    
    condrestart() {
      [ -e $LOCKFILE ] && restart || :
    }
    
    # See how we were called.
    case "$1" in
      start)
        start
        ;;
      stop)
        stop
        ;;
      restart)
        restart
        ;;
      reload)
        reload
        ;;
      condrestart)
        condrestart
        ;;
      status)
        rhstatus
        ;;
      check)
        check
        ;;
      *)
        echo $"Usage: $BASENAME {start|stop|restart|reload|condrestart|status|check}"
        exit 1
    esac
     
    exit $?

    若是不想在 /etc 中创建 haproxy,/usr/sbin 中创建目录和建立软链接,可以直接 修改 haproxy.init 文件中的 路径信息,在移动到 /etc/rc.d/init.d 中。

     在编译的时候指定了内核信息(TARGETCPU),可以看:https://www.jb51.net/article/101996.htm 的说明 

     

     

     (3)配置

    直接 打开 /opt/haproxy/haproxy/conf/haproxy.cfg 进行编辑

    cd /opt/haproxy/haprxoy/conf

    vi haproxy.cfg

    systemctl start haproxy

    编辑 后的内容 如下 :

    global
      chroot /opt/haproxy/haproxy
      pidfile /opt/haproxy/haproxy/haproxy.pid
      maxconn 1000
      daemon
    
    defaults
      mode http
      option dontlognull
      option httpclose
      option httplog
      option forwardfor
      option redispatch
      timeout connect 10000
      timeout client 30000
      timeout server 30000
      maxconn 60000
      retries 3
    
    listen stats   # haproxy 的统计数据页面
      bind 0.0.0.0:1080
      stats refresh 30s
      stats uri /stats
      stats realm Haproxy Manager
      stats auth admin:admin   # 登录统计页面的账号
    
    frontend main    # 代理
      bind 0.0.0.0:80  default_backend dynamic
    
    backend dynamic
      balance roundrobin
      server web1 192.168.149.128:8080 
      server web2 192.168.149.129:8080
    
    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

     此时可以打开浏览器,输入 :192.168.149.130:1080/stats  看到  haproxy 的统计页面

     在浏览器中 输入 :192.168.149.130:80/service1/health 也可以看到 正确返回 信息 ,说明 该请求被转发到 了 128 服务器 或 129 服务器上。

    (4)日志打印配置

       通常我们看问题,需要通过日志获取一些信息,所以需要开启日志打印

    # 关闭 selinux

    vi /etc/selinux/config  #编辑文件

    setenforce 0  #使配置立即生效

    vi /etc/rsyslog.conf

    vi /opt/haproxy/haproxy/conf/haproxy.cfg

    # 创建日志文件

    mkdir -p /opt/haproxy/haproxy/log

    touch /opt/haproxy/haproxy/log/haproxy.log

    systemctl restart rsyslog

    systemctl reload haproxy

     /etc/selinux/config 文件修改后内容如下:

    # This file controls the state of SELinux on the system.
    # SELINUX= can take one of these three values:
    #     enforcing - SELinux security policy is enforced.
    #     permissive - SELinux prints warnings instead of enforcing.
    #     disabled - No SELinux policy is loaded.
    #SELINUX=enforcing
    SELINUX=disabled
    # SELINUXTYPE= can take one of these three values:
    #     targeted - Targeted processes are protected,
    #     minimum - Modification of targeted policy. Only selected processes are protected. 
    #     mls - Multi Level Security protection.
    #SELINUXTYPE=targeted

    /etc/rsyslog.conf 文件修改后内容如下:

    # rsyslog configuration file
    
    # For more information see /usr/share/doc/rsyslog-*/rsyslog_conf.html
    # or latest version online at http://www.rsyslog.com/doc/rsyslog_conf.html 
    # If you experience problems, see http://www.rsyslog.com/doc/troubleshoot.html
    
    #### MODULES ####
    
    module(load="imuxsock"    # provides support for local system logging (e.g. via logger command)
           SysSock.Use="off") # Turn off message reception via local log socket; 
                              # local messages are retrieved through imjournal now.
    module(load="imjournal"             # provides access to the systemd journal
           StateFile="imjournal.state") # File to store the position in the journal
    #module(load="imklog") # reads kernel messages (the same are read from journald)
    #module(load"immark") # provides --MARK-- message capability
    
    # Provides UDP syslog reception
    # for parameters see http://www.rsyslog.com/doc/imudp.html
    #module(load="imudp") # needs to be done just once
    #input(type="imudp" port="514")
    $ModLoad imudp
    $UDPServerRun 514
    local2.*                                         /opt/haproxyhaproxy/log/haproxy.log
    
    # Provides TCP syslog reception
    # for parameters see http://www.rsyslog.com/doc/imtcp.html
    #module(load="imtcp") # needs to be done just once
    #input(type="imtcp" port="514")
    
    #### GLOBAL DIRECTIVES ####
    
    # Where to place auxiliary files
    global(workDirectory="/var/lib/rsyslog")
    
    # Use default timestamp format
    module(load="builtin:omfile" Template="RSYSLOG_TraditionalFileFormat")
    
    # Include all config files in /etc/rsyslog.d/
    include(file="/etc/rsyslog.d/*.conf" mode="optional")
    
    #### RULES ####
    
    # Log all kernel messages to the console.
    # Logging much else clutters up the screen.
    #kern.*                                                 /dev/console
    
    # Log anything (except mail) of level info or higher.
    # Don't log private authentication messages!
    *.info;mail.none;authpriv.none;cron.none                /var/log/messages
    
    # The authpriv file has restricted access.
    authpriv.*                                              /var/log/secure
    
    # Log all the mail messages in one place.
    mail.*                                                  -/var/log/maillog
    
    
    # Log cron stuff
    cron.*                                                  /var/log/cron
    
    # Everybody gets emergency messages
    *.emerg                                                 :omusrmsg:*
    
    # Save news errors of level crit and higher in a special file.
    uucp,news.crit                                          /var/log/spooler
    
    # Save boot messages also to boot.log
    local7.*                                                /var/log/boot.log
    
    
    # ### sample forwarding rule ###
    #action(type="omfwd"  
    # An on-disk queue is created for this action. If the remote host is
    # down, messages are spooled to disk and sent when it is up again.
    #queue.filename="fwdRule1"       # unique name prefix for spool files
    #queue.maxdiskspace="1g"         # 1gb space limit (use as much as possible)
    #queue.saveonshutdown="on"       # save messages to disk on shutdown
    #queue.type="LinkedList"         # run asynchronously
    #action.resumeRetryCount="-1"    # infinite retries if host is down
    # Remote Logging (we use TCP for reliable delivery)
    # remote_host is: name/ip, e.g. 192.168.0.1, port optional e.g. 10514
    #Target="remote_host" Port="XXX" Protocol="tcp")

    /opt/haproxy/haproxy/conf/haproxy.cfg 修改后文件内容如下:

    global
      log 127.0.0.1 local2 debug
      chroot /opt/haproxy/haproxy
      pidfile /opt/haproxy/haproxy/haproxy.pid
      maxconn 1000
      daemon
    
    defaults
      mode http
      log global
      option dontlognull
      option httpclose
      option httplog
      option forwardfor
      option redispatch
      timeout connect 10000
      timeout client 30000
      timeout server 30000
      maxconn 60000
      retries 3
    
    listen stats
      bind 0.0.0.0:1080
      stats refresh 30s
      stats uri /stats
      stats realm Haproxy Manager
      stats auth admin:admin
    
    frontend main
      bind 0.0.0.0:80
      default_backend dynamic
    
    backend dynamic
      balance roundrobin
      server web1 192.168.149.128:8080 
      server web2 192.168.149.129:8080
    
    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

      在浏览器 再次访问 192.168.149.130:1080/stats  和 192.168.149.130:80/service1/health

      打开:/opt/haproxy/haproxy/log/haproxy.log 日志文件可以看到如下信息:

    2021-04-11T18:54:49+08:00 localhost haproxy[20659]: 192.168.149.1:60320 [11/Apr/2021:18:54:49.395] stats stats/<STATS> 0/0/0/0/0 200 21124 - - LR-- 1/1/0/0/0 0/0 "GET /stats HTTP/1.1"
    2021-04-11T18:55:19+08:00 localhost haproxy[20659]: 192.168.149.1:60326 [11/Apr/2021:18:55:19.459] stats stats/<STATS> 0/0/0/0/0 200 21244 - - LR-- 1/1/0/0/0 0/0 "GET /stats HTTP/1.1"
    2021-04-11T18:55:49+08:00 localhost haproxy[20659]: 192.168.149.1:60330 [11/Apr/2021:18:55:49.531] stats stats/<STATS> 0/0/0/0/0 200 21248 - - LR-- 1/1/0/0/0 0/0 "GET /stats HTTP/1.1"
    2021-04-11T18:55:54+08:00 localhost haproxy[20659]: 192.168.149.128:49404 [11/Apr/2021:18:55:54.294] main dynamic/web1 0/0/1/11/12 200 123 - - ---- 1/1/0/0/0 0/0 "GET /service1/health HTTP/1.1"
    2021-04-11T18:56:19+08:00 localhost haproxy[20659]: 192.168.149.1:60338 [11/Apr/2021:18:56:19.579] stats stats/<STATS> 0/0/0/0/0 200 21330 - - LR-- 1/1/0/0/0 0/0 "GET /stats HTTP/1.1"

    说明 haproxy 的日志信息已经输出到 该文件中。

    PS:

        这里修改了 haproxy.cfg 文件之后,没有 使用 systemctl restart haproxy 方式 而是 使用 systemctl reload haproxy 方式,说明其支持 修改配置文件之后的热加载方式。

     若是日志文件中没有内容输出,可以看下 /var/log/messages 文件中对 haproxy 记录的内容,若下:

     说明 selinux 没有成功关闭。

     3、部署过程中遇到的问题

    4、参考

    https://www.jb51.net/article/101996.htm

    https://blog.51cto.com/u_11886307/2406609  开启日志

    (2) 部署

    3、安装过程中遇到的问题

  • 相关阅读:
    hive中使用正則表達式不当导致执行奇慢无比
    C/C++实现正负数四舍五入
    EEPlat的控制器概念
    由于好高骛远所以半途而废(张作作)
    新辰:关于“网络推广不能仅仅依靠网络”的详解
    SQL的事务回滚操作带案例分析
    怎样把引用的jar包和本项目一起导出成jar文件
    A星算法(Java实现)
    Hadoop之——HBASE结合MapReduce批量导入数据
    Spring MVC 数据验证——validate编码方式
  • 原文地址:https://www.cnblogs.com/sandyflower/p/14645186.html
Copyright © 2020-2023  润新知