赞
踩
前言:最近项目组需要搭建一个高可用系统,用到的是keepalived+haproxy的架构技术,作为小白的我也是搜了很多资料,最终测试环境部署成功。虽然实现了应有的功能,但是对于haproxy的更多功能也是一直半解,通过该文章做一个系统的复习。
uname -r
3.10.0-327.el7.x86_64
编译haproxy 参数 需要查看 解压后haproxy中的readme文件
编译安装
查看编译完成后是否报错
安装haproxy 查看/usr/local/haproxy 目录是否生成
haproxy.cfg
因为haproxy.cfg配置中uid gid 是99
使用 id 99 查看用户组id 99 的用户组权限
递归修改haproxy的权限
chown nobody /usr/local/haproxy/ -R
添加日志以及路径
重启系统日志
PREFIX :指定安装路径
指定 内核版本 TARGET=linux2628
需要将启动脚本复制到指定目录
注意:linux基础差的可能看不懂haproxy.init 脚本 如果安装目录和配置文件目录和脚本中的不一样,就可能出现意想不到的错误。
本人修改hoproxy.init 修改点如下
cd /usr/local/software yum -y install gcc openssl-devel pcre-devel systemd-devel # 后面网址可以在浏览器中打开查看是否存在当前版本 (本人尝试好几个地址 下面地址可用) wget http://download.openpkg.org/components/cache/haproxy/haproxy-2.4.2.tar.gz # 因为本人使用不是root用 故前面加sudo sudo tar xvf haproxy-2.4.2.tar.gz -C /usr/local/ cd /usr/local/haproxy-2.4.2 #参考INSTALL文件进行编译安装 权限不够 加 sudo sudo make ARCH=x86_64 TARGET=linux-glibc USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 USE_SYSTEMD=1 USE_LUA=1 LUA_INC=/usr/local/lua-5.3.5/src/ LUA_LIB=/usr/local/lua-5.3.5/src/ PREFIX=/usr/local/haproxy # ...... make 参数解析 start ...... # (注意 LUA_INC 后面的路径) ARCH=x86_64 #CPU架构 TARGET=linux-glibc #通用linux内核 也可以通过readme 查看对应内核版本参数 USE_PCRE=1 #PCRE支持正则表达式,用于用户请求的uri USE_OPENSSL=1 #https,证书 USE_ZLIB=1 #开启压缩 USE_SYSTEMD=1 #使用systemd启动haproxy主进程 USE_CPU_AFFINITY=1 #CPU亲和性,让haproxy指定的进程工作在指定的CPU核心上 USE_LUA=1 LUA_INC=/usr/local/lua-5.3.5/src LUA_LIB=/usr/local/lua-5.3.5/src #开启lua,及lua和lua库所在路径 PREFIX=/usr/local/haproxy #指定安装路径 # ...... make 参数解析 end ...... # #生成的模块、文件和二进制程序拷贝到指定路径 make install PREFIX=/usr/local/haproxy ln -s /usr/local/haproxy/sbin/haproxy /usr/sbin/ # 检查 haproxy 版本 [userwin@MiWiFi-R3L-srv sbin]$ haproxy -v HAProxy version 2.4.2-553dee3 2021/07/07 - https://haproxy.org/ Status: long-term supported branch - will stop receiving fixes around Q2 2026. Known bugs: http://www.haproxy.org/bugs/bugs-2.4.2.html Running on: Linux 3.10.0-327.el7.x86_64 #1 SMP Thu Nov 19 22:10:57 UTC 2015 x86_64
# 创建 haproxy.cfg (本人没有安装httpd 仅仅测试haproxy 目录是自己的目录) cd /usr/local/haproxy/etc/ vim haproxy global log 127.0.0.1 local0 maxconn 4096 #chroot /usr/local/haproxy uid 99 gid 99 daemon nbproc 1 #pidfile /usr/local/haproxy/run/haproxy.pid defaults log global log 127.0.0.1 local3 mode http option httplog option httpclose option dontlognull option forwardfor option redispatch retries 2 maxconn 2000 balance roundrobin #stats uri /stats timeout connect 5000 timeout client 50000 timeout server 50000 #option httpchk GET /index.html listen stats mode http bind 0.0.0.0:9999 stats enable log global stats uri /ha-stats #frontend http #bind 0.0.0.0:80 #default_backend http_back #backend http_back #server s1 192.168.3.17:80 weight 3 check #server s1 192.168.3.18:80 weight 3 check #server s1 192.168.3.19:80 weight 3 check
# 创建 haproxy.cfg mkdir /etc/haproxy cd /etc/haproxy vim haproxy.cfg global #全局设置 daemon #以后台进程运行 maxconn 256 #每个进程的最大连接数 nbproc 1 #进程数,该值可以设置小于或等于cpu核心数 balance roundrobin #默认的负载均衡的方式,轮询方式 #balance source #默认的负载均衡的方式,类似nginx的ip_hash #balance leastconn #默认的负载均衡的方式,最小连接 defaults option http-keep-alive option forwardfor maxconn 256 #设置http(七层模式),也可设置为tcp(四层模式),另外还有一个Health健康监测模式。对mysql进行负载均衡的话,这里记得修改为tcp mode http timeout connect 5000ms timeout client 50000ms timeout server 50000ms listen stats mode http bind 0.0.0.0:9999 stats refresh 30s #自动刷新时间 stats uri /stats #项目名为status,ip+端口+项目名即可访问 stats auth admin:admin #配置管理用户账号密码 stats admin if TRUE stats hide-version listen web_port bind 10.0.0.7:80 mode http server web1 127.0.0.1:8080 check inter 3000 fall 2 rise 5 backend servers server server1 172.16.1.230:80 check inter 2000 rise 3 fall 3 weight 1 maxconn 32
使用指定配置文件运行haproxy。建议都haproxy和hadproxy.cfg都使用绝对路径
/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/etc/haproxy.cfg
上面错误是因为没有启动web服务器,注释了监听端口后依然报错,因为haproxy检测不到listener
注意事项见上面图片
cd /etc/init.d vim haproxy #!/bin/sh # # chkconfig: - 85 15 # description: HAProxy is a TCP/HTTP reverse proxy which is particularly suited \ # for high availability environments. # processname: haproxy # config: /usr/local/haproxy/etc/haproxy.cfg # pidfile: /usr/local/haproxy/etc/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=/usr/local/$BASENAME/etc/$BASENAME.cfg [ -f $CFG ] || exit 1 PIDFILE=/usr/local/$BASENAME/run/$BASENAME.pid LOCKFILE=/usr/local/$BASENAME/run/$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 $?
[root@MiWiFi-R3L-srv ~]# /etc/init.d/haproxy start
Starting haproxy (via systemctl): Job for haproxy.service failed because the control process exited with error code. See "systemctl status haproxy.service" and "journalctl -xe" for details.
[失败]
# 需要执行 systemctl status haproxy.service 或者 journalctl -xe 来查看具体的报错
systemctl status haproxy.service
journalctl -xe
查看/etc/rc.d/init.d/haproxy 使用 killproc 命令 查看是否 killproc 环境
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
}
参考图片 也是在网上查的资料 尝试过 对我的错误没有见效,也许对你的错误有用。
==与上面创建haproxy脚本使用功能一个就行了,但是要注意里面的路径要正确=
cd /usr/lib/systemd/system vim haproxy.service [Unit] Description=HAProxy Load Balancer After=syslog.target network.target [Service] ExecStartPre=/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -c -q ExecStart=/usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /usr/local/haproxy/etc/run/haproxy.pid ExecReload=/bin/kill -USR2 $MAINPID [Install] WantedBy=multi-user.target #默认缺少配置文件,无法启动 systemctl daemon-reload systemctl start haproxy
小结:看遍教程千千万,不如实操来一遍,本人在实操过程中,没有按照教程的中路径,中间出现很多错误,鉴于对运维知识不是很熟悉,踩了很多的坑。如果此文能帮助到你,麻烦点个赞。谢谢。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。