负载均衡工具haproxy完整安装部署流程 及 haproxy通过域名匹配进行负载-基于域名负载均衡的Haproxy配置

一、负载均衡工具haproxy完整安装部署流程

1. 关于负载均衡和haproxy

    负载均衡是系统设计最常见的一种方式,Nginx、HAProxy、LVS、F5用得比较普遍,不过Nginx只能在HTTP层负载,而HAProxy即可以在7层做负载,也可以在4层做负载,LVS配置有点太麻烦。

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

2. haproxy的安装过程

    haproxy的安装,haproxy官网下载地址:http://www.haproxy.org/download/

cd /opt/download
sudo wget http://www.haproxy.org/download/1.7/src/haproxy-1.7.3.tar.gz
sudo tar zxvf haproxy-1.7.3.tar.gz 
sudo mkdir /opt/modules/haproxy
cd haproxy-1.7.3
sudo make TARGET=linux2628 USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1
sudo make install PREFIX=/opt/modules/haproxy 

    安装后将安装目录中example里的.cfg文件复制一个过来,比如:transparent_proxy.cfg,进行修改。

#完整配置文件:
globallog 127.0.0.1   local0  #日志输出配置,所有日志都记录在本机,通过local0输出maxconn 4096chroot /opt/modules/haproxy #运行目录daemon  #后台运行nbproc 1    #启动1个haproxy实例uid  99    #所属运行的用户uidgid 99     #所属运行的用户组pidfile /opt/modules/haproxy/haproxy.pid    #指定PID文件路径#debugdefaultstimeout client		3s  #客户端连接超时时间timeout server		3s  #服务器端连接超时时间timeout connect		3s  #连接超时时间log     127.0.0.1       local3  #日志文件的输出定向mode    httpoption httplog   #日志类别,采用httplogoption httpclose #每次请求完毕后主动关闭http通道,haproxy不支持keep-alive,只能模拟这种模式的实现option dontlognull#option forwardfor #如果后端服务器需要获得客户端真实ip需要配置的参数,可以从Http Header中获得客户端ipoption redispatch #当serverid对应的服务器挂掉后,强制定向到其他健康服务器retries 2   #2次连接失败就认为服务器不可用,主要通过后面的check检查maxconn 65535   #最大连接数balance roundrobin#stats   uri     /haproxy-statslisten redis-6382bind 0.0.0.0:6382maxconn 10000mode tcp    #所处理的类别,默认采用http模式,可配置成tcp作4层消息转发option tcplogoption tcpkatimeout connect 3stimeout client 60stimeout server 60s#balance roundrobinbalance leastconn   #负载均衡策略server redis-83 192.168.90.123:6383 check inter 2000 rise 2 fall 3 weight 100server redis-84 192.168.90.123:6384 check inter 2000 rise 2 fall 3 weight 100server redis-85 192.168.90.123:6385 check inter 2000 rise 2 fall 3 weight 100frontend MyFrontendmode httpbind 0.0.0.0:8080   #前端浏览器中查看统计的WEB界面地址acl is_stats_req url_beg -i /haproxy/stats      #haproxy 监控页面的访问地址default_backend		TransparentBack_http    #前端请求WEB时,后端的处理逻辑,即是下面的backendbackend TransparentBack_httpstats enablestats auth admin:123456 #设置查看统计的账号密码stats admin if { always_true }stats hide-version  #隐藏统计页面的HAproxy版本信息stats realm Haproxy\ Statisticsstats uri /haproxy/stats    stats refresh 5 #几秒刷新一次

3. haproxy的安装启动及报错处理

然后启动haproxy.及haproxy的重启和停止命令

#启动命令:
/opt/modules/haproxy/sbin/haproxy -f /opt/modules/haproxy/haproxy.cfg
#haproxy的重启命令 
/opt/modules/haproxy/sbin/haproxy -f /opt/modules/haproxy/haproxy.cfg -st `cat /opt/modules/haproxy/haproxy.pid`  
#停止haproxy服务 
killall haproxy 

    遇到报错,这是因为1.7.3里的面的配置contimeout,clitimeout,srvtimeout已过时,需要使用timeout connect,timeout client,timeout server来替换。还有两项警告是stats和option forwardfor只针对http负载,因为我这里只有tcp负载,所以报警这两项配置无效,将其注释掉即可。

[root@123 haproxy]# [WARNING] 186/171608 (26758) : parsing [/opt/modules/haproxy/haproxy.cfg:32] : the 'contimeout' directive is now deprecated in favor of 'timeout connect', and will not be supported in future versions.
[WARNING] 186/171608 (26758) : parsing [/opt/modules/haproxy/haproxy.cfg:33] : the 'clitimeout' directive is now deprecated in favor of 'timeout client', and will not be supported in future versions.
[WARNING] 186/171608 (26758) : parsing [/opt/modules/haproxy/haproxy.cfg:34] : the 'srvtimeout' directive is now deprecated in favor of 'timeout server', and will not be supported in future versions.
[WARNING] 186/171608 (26758) : config : 'stats' statement ignored for proxy 'redis-6382' as it requires HTTP mode.
[WARNING] 186/171608 (26758) : config : 'option forwardfor' ignored for proxy 'redis-6382' as it requires HTTP mode.
[WARNING] 186/171608 (26758) : <debug> mode incompatible with <quiet>, <daemon> and <systemd>. Keeping <debug> only.

    haproxy自带web界面,上面的配置文件中有提及,可查看文章:直接在Centos服务器上部署haproxy 以及 使用docker搭建Haproxy负载均衡、代理服务_docker haproxy-CSDN博客

二、 haproxy通过域名匹配进行负载-基于域名负载均衡的Haproxy配置

    尝试了一下haproxy基于域名进行负载配置,配置起来也很简单。我这里的尝试是先将nginx下三个域名绑定给三个端口81,82,83,haproxy启动绑定80端口。然后请求时haproxy根据域名将请求分别分发给81,82,83三个nginx+php服务。haproxy主要的配置如下:

frontend wwwbind *:80       #haproxy绑定80端口mode http       #使用httpacl domain_shouji  hdr_beg(host) -i shouji.com   #-i指定匹配域名,如果匹配则分发给后端domain_shoujiacl domain_kermit1 hdr_beg(host) -i kermit1.com  #同上acl domain_kermit2 hdr_beg(host) -i kermit2.comuse_backend shouji  if domain_shouji    #设置每个后端使用哪个服务器集群use_backend kermit1 if domain_kermit1use_backend kermit2 if domain_kermit2backend shouji  #后端服务器集群配置mode httpbalance roundrobin  #后端负载均衡策略server web01 192.168.90.123:81 check inter 2000 fall 3  #后端服务器列表
backend kermit1mode httpbalance roundrobinserver web01 192.168.90.123:82 check inter 2000 fall 3
backend kermit2mode httpbalance roundrobinserver web01 192.168.90.123:83 check inter 2000 fall 3

    上面配置中hdr_beg是haproxy对字符匹配的方法,同类的方法还有以下几个:

path_beg <string> 用于测试请求的URI是否以<string>指定的模式开头。  
acl url_static path_beg -i /static /images /javascript /stylesheets
    #测试URL是个以/static /images /javascript /stylesheets开头  
         
path_end <string> 用于测试请求的URL是否以<string>指定的模式结尾  
acl url_static   path_end -i .jpg .gif .png .css .js  
    #测试URI是否以.jpg .gif .png .css .js结尾
  
hdr_beg <string> 用于测试请求报文的指定首部的开头部分是否符合<string>指定的模式  
acl host_static hdr_beg(host) -i img. video. download. ftp.
    #用于测试请求报文首部中的主机是否以img. video. download. ftp.开头  
acl monitor hdr_beg(host) -i monitor.test.com
    #定义ACL名称,对应的请求的主机头是monitor.test.com 

    配置结束后,当在前端请求kermt1.com和kermit2.com时,haproxy会分发给82,83两个端口,此时在输出内容上做些区别就很容易进行验证。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/49925.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一文了解AOL算子加速库

过去一年&#xff0c;随着ChatGPT的发布与快速迭代&#xff0c;基于大数据量、大参数量、大算力的预训练大模型已成为人工智能产业的主要路线。大模型的普及与发展不仅依靠模型本身的创新&#xff0c;更依赖于算力底座的支撑以及软件生态的繁荣&#xff0c;需要伙伴和开发者的积…

Vue3逻辑复用及内置组件

Vue3的逻辑复用主要通过“组合式函数”、“自定义指令”及“插件”来实现。提高了代码复用性&#xff0c;增强代码可维护性及促进团队合作。 1 逻辑复用 1.1 组合式函数 利用Vue组合式API来封装和复用有状态逻辑的函数。对组合式函数有如下约定&#xff1a; 命名&#xff0…

Sentinel限流规则详解

上一期教程讲解了 Sentinel 的快速入门&#xff1a;Sentinel快速入门&#xff0c;这一期主要讲述 Sentinel 的限流规则 簇点链路 簇点链路就是项目内的调用链路&#xff08;Controller -> Service -> Mapper&#xff09;&#xff0c;链路中被监控的每个接口就是一个资源…

wkhtmltopdf 工具安装与使用

前情提要&#xff1a; 最近一个同事请叫我一个问题&#xff0c;他发现一片不错的博文&#xff0c;是在博客园的&#xff0c;但是不能下载这篇文章&#xff0c;我看了一下才发现&#xff0c;原来csdn也是不行的。合理。毕竟是人家辛苦写的文章&#xff0c;不能就这么被别人随便c…

动态多态——java

多态&#xff08;Polymorphism&#xff09;是面向对象编程&#xff08;OOP&#xff09;的一个核心概念&#xff0c;它允许一个接口被多个类实现&#xff0c;从而使得一个方法调用可以根据对象的实际类型表现出不同的行为。多态性提高了代码的灵活性和可扩展性。 多态的类型 编译…

机器学习中的预测:真的是预测吗?

预测 机器学习中的预测&#xff1a;真的是预测吗&#xff1f;预测的定义为什么预测需要X&#xff1f;传统预测与机器学习预测的对比未来的预测模型&#xff1a;向自动生成输入的方向发展结论 机器学习中的预测&#xff1a;真的是预测吗&#xff1f; 在探讨机器学习中的“预测”…

《Java初阶数据结构》----7.<优先级队列PriorityQueue>

前言 大家好&#xff0c;我目前在学习java。之前也学了一段时间&#xff0c;但是没有发布博客。时间过的真的很快。我会利用好这个暑假&#xff0c;来复习之前学过的内容&#xff0c;并整理好之前写过的博客进行发布。如果博客中有错误或者没有读懂的地方。热烈欢迎大家在评论区…

[渗透测试] 主动信息收集

主动信息收集 在红蓝对抗过程中&#xff0c;资产属于核心地位&#xff0c;攻击方&#xff08;红方&#xff09;要尽可能的去获取对方资产&#xff0c;暴露目标资产&#xff0c;包括IP地址、网络设备、安全设备、服务器、存储在服务器中的数据等。防守方也要清楚自己有多少有价…

宝塔SSL续签失败

我有2个网站a和b&#xff08;文字中用baidu.com替换我的域名&#xff09; b是要续签那个&#xff0c;但续签报错&#xff1a; nginx version: nginx/1.22.1 nginx: [emerg] host not found in upstream "github.com" in /www/server/panel/vhost/nginx/proxy/a.bai…

设计模式--创建型

实现 #include <iostream> #include <memory>// 抽象产品类 class Product {public:virtual ~Product() {}virtual void Operation() const 0; };// 具体产品 类A class ConcreteProductA : public Product {public:virtual void Operation() const override {st…

个人电脑网络安全 之 防浏览器和端口溢出攻击 和 权限对系统的重要性

防浏览器和端口溢出攻击 该如何防 很多人都不明白 我相信很多人只知道杀毒软件 却不知道网络防火墙 防火墙分两种 &#xff1a; 1、 病毒防火墙 也就是我们说的杀毒软件 2、 网络防火墙 这是用来防软件恶意通信的 使用防火墙 有两种 1、 半开式规则…

ESP-01S、ESP8266、ESP32等模块通信乱码的排查方法

ESP-01S、ESP8266、ESP32等模块通信乱码的排查方法 ESP-01S模块 遇到问题首先按重要顺序及排除法来解决问题 1&#xff0c;你的USB转串口工具是否有问题&#xff1f; 请将TXD与RXD短接在一起进行测试&#xff0c;自收自发应该是正常的&#xff0c;请确保这点。 ESP-01S的串口…

ffmpeg ffplay.c 源码分析二:数据读取线程

本章主要是分析 数据读取线程read_thread 中的工作。如上图红色框框的部分 从ffplay框架分析我们可以看到&#xff0c;ffplay有专⻔的线程read_thread()读取数据&#xff0c; 且在调⽤av_read_frame 读取数据包之前需要做&#xff1a; 1.例如打开⽂件&#xff0c; 2.查找配置解…

[Java 后端面试题]2024-7-22

Redis的持久化机制,在真实的线上环境中需要采取什么样的策略 在真实的线上环境中&#xff0c;Redis的持久化机制主要有两种&#xff1a;RDB&#xff08;Redis DataBase&#xff09;和AOF&#xff08;Append Only File&#xff09;。每种机制都有其优点和适用场景&#xff0c;实…

Servlet 3.0的新特征

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhlServlet 3.0概述 Servlet 3.0规范是在2009年随着Java EE 6的发布而推出的。它引入了一系列新特性和改进,旨在简化Web应用的开发和部署过程,并提高Web应用的性能和可扩展性。Servlet 3.0的发布标…

ProGuard配置详解

ProGuard是一个开源的Java class文件缩小器、优化器、混淆器和预验证器。它通过删除未使用的类、字段、方法和属性&#xff0c;优化字节码指令&#xff0c;并重命名类、字段和方法&#xff0c;使反编译后的代码难以理解&#xff0c;从而提高应用的安全性。以下是对ProGuard配置…

大语言模型-对比学习-Contrastive Learning

一、对比学习概念 对比学习是一种特殊的无监督学习方法。 旨在通过拉近相关样本的距离并且推远不相关样本的距离&#xff0c;来学习数据表示。 通常使用一种高自由度、自定义的规则来生成正负样本。在模型预训练中有着广泛的应用。 二、对比学习小案例 对比学习主要分为三个…

Git关联本地仓库和远程仓库

Step 1 添加远程仓库: git remote add <远程仓库别名><远程仓库地址> Step 2 git push -u <远程仓库名><分支名> 查看远程仓库: git remote -v 拉取远程仓库内容: 拉取服务器仓库过程中&#xff0c;如果本地和服务器有文件冲突&#xff0c;则会拉取失…

02 MySQL数据库管理

目录 1.数据库的结构 sql语言主要由以下几部分组成 2. 数据库与表的创建和管理 1&#xff0c;创建数据库 2&#xff0c;创建表并添加数据 3&#xff0c;添加一条数据 4&#xff0c;查询数据 5&#xff0c;更新数据 6&#xff0c;删除数据 3.用户权限管理 1.创建用户 …

js轮播图制作

实现一个简单的JavaScript轮播图可以通过以下步骤完成&#xff1a; 创建HTML结构&#xff0c;包括轮播图容器和图片列表。 使用CSS进行样式设置&#xff0c;包括隐藏多余的图片。 使用JavaScript编写函数来控制图片的切换。