【HAProxy】如何在Ubuntu下配置HAProxy服务器

HAProxy 是一款免费、开源且强大的反向代理程序,它为 HTTP 和 TCP 基础的应用提供了高可用性、负载均衡以及代理功能,因此对于管理高流量服务器(或 Web 应用)来说,通过将负载分散到多个节点服务器上,它是一个相当不错的选择。

既然 Nginx 反向代理也有类似的功能,那我来告诉你为啥你可能更想选择 HAProxy。首先,HAProxy 是一个专门的负载均衡器和反向代理程序,在 SSL 卸载性能、详细的运行时统计信息以及更高级的负载均衡特性方面表现得更加出色。

Nginx 反向代理唯一的好处可能是配置起来相对简单一些,这在某些情况下确实省事儿。但是,对于复杂的环境来说,依赖 HAProxy 才是明智之举。

在这篇指南里,我会一步步教你如何在 Ubuntu 24.04 上安装和配置 HAProxy,不过这些步骤同样适用于之前的版本,比如 Ubuntu 23.04、Ubuntu 22.04 等等。

如何在 Ubuntu 上安装和配置 HAProxy

在开始安装和配置 HAProxy 之前,你需要先了解一下云基础设施,以及如何使用 HAProxy 作为负载均衡器。为了演示方便,我设想了一个场景:一位笔记本电脑用户访问了一台安装并配置了 HAProxy 的服务器,该服务器随后将用户的流量转发给最不繁忙的服务器。

HAProxy 的工作原理

在这个场景中,安装了 HAProxy 的服务器应该运行在 Ubuntu 系统之上,至少需要 1 GB 的 RAM、20 GB 的磁盘空间和 2 个 CPU 核心;另外,确保你有该服务器的 root 权限或者至少有 sudo 特权。

准备就绪后,通过 SSH 登录你的服务器,并按照下面的指令来安装和配置 HAProxy。

第一步:更新系统

这一步不是必须的,但它能保证你的软件包列表和已安装的软件包都是最新的。

$ sudo apt update && sudo apt upgrade -y

第二步:安装 HAProxy

由于 HAProxy 很受欢迎,它已经在官方 Ubuntu 软件库中了,你可以用这条命令轻松安装它。

$ sudo apt install haproxy

第三步:验证 HAProxy 安装

要确认 HAProxy 已成功安装,可以通过运行以下命令检查其版本:

$ haproxy -v

检查 HAProxy 版本

第四步:配置 HAProxy

为了配置你的主服务器以实现与其他节点服务器的负载均衡,你需要在 _/etc/haproxy/haproxy.cfg_ 文件中指定前端服务器(主要负责处理请求,也就是你的主服务器)和后端服务器(处理那些请求,即你的节点服务器)的信息。

对于新手来说,我会尽量简化这个过程。首先,用你喜欢的文本编辑器(我喜欢 Nano)打开 HAProxy 配置文件。

$ sudo nano /etc/haproxy/haproxy.cfg

当你打开文件时,你会看到类似下面的配置,这部分可以忽略。

global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin
stats timeout 30s
user haproxy
group haproxy
daemon

# Default SSL material locations  
ca-base /etc/ssl/certs  
crt-base /etc/ssl/private  

# See: https://ssl-config.mozilla.org/#server=haproxy&server-version=2.0.3&config=intermediate  
    ssl-default-bind-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384  
    ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256  
    ssl-default-bind-options ssl-min-ver TLSv1.2 no-tls-tickets  

defaults
log global
mode http
option httplog
option dontlognull
timeout connect 5000
timeout client 50000
timeout server 50000
errorfile 400 /etc/haproxy/errors/400.http
errorfile 403 /etc/haproxy/errors/403.http
errorfile 408 /etc/haproxy/errors/408.http
errorfile 500 /etc/haproxy/errors/500.http
errorfile 502 /etc/haproxy/errors/502.http
errorfile 503 /etc/haproxy/errors/503.http
errorfile 504 /etc/haproxy/errors/504.http

为了配置 HAProxy 主服务器以管理和重定向过多的流量到两个额外的节点服务器(监听 80 端口),只需在最后一行粘贴以下模板,并确保替换节点服务器的详细信息(红色标记的部分)。

frontend HAProxy_Server
bind *:80
default_backend Apache_Web_Servers

backend Apache_Web_Servers
mode http
balance roundrobin
server server1 192.168.1.102:80 check
server server2 192.168.1.103:80 check

完成之后,你的文件看起来会像这样:

HAProxy 配置文件

保存并关闭文件。

在继续下一步之前,最好检查一下配置文件是否有语法问题。

$ sudo haproxy -c -f /etc/haproxy/haproxy.cfg

检查 HAProxy 配置文件

第五步:重启 HAProxy

现在是时候重启 HAProxy 服务以应用我们在配置文件中所做的更改了,同时我们也会启用 HAProxy 服务,以确保它在系统重启时自动启动。

$ sudo systemctl restart haproxy
$ sudo systemctl enable haproxy

重启和启用 HAProxy 服务

  • 如何在 Ubuntu 上安装 UrBackup [客户端/服务器] 系统

第六步:检查 HAProxy 状态

最后,检查 HAProxy 服务的状态,以确保它正在无故障地运行。

$ systemctl status haproxy

检查 HAProxy 服务状态

第七步:配置防火墙(可选)

Ubuntu 默认预装了 UFW (Uncomplicated Firewall),所以如果你用它来保护网络,记得允许 80 端口以启用每个服务器上的 HAProxy 流量。

$ sudo ufw allow 80
$ sudo ufw status

在服务器上允许 80 端口

搞定!现在你的主服务器已经配置好了 HAProxy,它将会处理所有进来的流量,并根据节点服务器的状态进行分配。

总结

在这篇文章里,你学会了如何在 Ubuntu 上安装和配置 HAProxy 用于负载均衡,但这只是冰山一角——HAProxy 还有更多的高级配置等着你去探索。想要更多指导的话,强烈建议查阅它的 官方文档页面。

如果你有任何问题或疑问,随时可以在评论区留言提问哦。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

用QT实现 端口扫描工具1

安装在线QT,尽量是完整地自己进行安装,不然会少包 参考【保姆级图文教程】QT下载、安装、入门、配置VS Qt环境-CSDN博客 临时存储空间不够。 Windows系统通常会使用C盘来存储临时文件。 修改临时文件存储位置 打开系统属性: 右键点击“此电…

Selenium 自动化,如何下载正确的 ChromeDriver

在 Python 的 Selenium 自动化操作中,chromedriver 是不可或缺的驱动程序。没有正确安装对应版本的驱动,运行代码时常常会遇到报错问题,比如 “session not created: This version of ChromeDriver only supports Chrome version XX”。 今天…

泊松融合 实例2025

目录 例子1: 实现代码: 原作者代码: 本博客直接给出来最好的效果和源代码 参数说明: 效果不好,不推荐的参数:MONOCHROME_TRANSFER,NORMAL_CLONE 例子1: 目标图: 原图: 效果图: 实现代码: 坐标是要目标图上中心点坐标: import cv2if __na

前端如何从入门进阶到高级

在前端学习的道路上,我们将其划分为三个阶段:入门、实战和进阶。以下是各阶段的学习指南 一、入门阶段 在入门阶段,我们的目标是掌握前端的基本语法和知识,以便能够独立解决一些基础问题。这一阶段,我们建议通过视频…

Python爬虫基础——认识网页结构(各种标签的使用)

1、添加<div>标签的代码定义了两个区块的宽度和高度均为100px&#xff0c;边框的格式也相同&#xff0c;只是区块中显示的内容不同&#xff1b; 2、添加<ul>和<ol>标签分别用于定义无序列表和有序列表。<il>标签位于<ul>标签或<ol>标签之…

基于W2605C语音识别合成芯片的智能语音交互闹钟方案-AI对话享受智能生活

随着科技的飞速发展&#xff0c;智能家居产品正逐步渗透到我们的日常生活中&#xff0c;其中智能闹钟作为时间管理的得力助手&#xff0c;也在不断进化。基于W2605C语音识别与语音合成芯片的智能语音交互闹钟&#xff0c;凭借其强大的联网能力、自动校时功能、实时天气获取、以…

Python提取目标Json键值:包含子嵌套列表和字典

目标&#xff1a;取json中所有的Name、Age字典 思路&#xff1a;递归处理字典中直接包含子字典的情况&#xff0c; import jsondef find_targ_dicts(data,key1,key2):result {}if isinstance(data, dict):if key1 in data and key2 in data: # 第一层字典中包含key1和key2re…

你已经分清JAVA中JVM、JDK与JRE的作用和关系了吗?

你已经分清JAVA中JVM、JDK与JRE的作用和关系了吗&#xff1f; 一. JVM、JDK与JRE的关系二. JVM、JDK与JRE的作用2.1 什么是JVM&#xff1f;2.2 什么是JDK&#xff1f;2.3 什么是JRE&#xff1f; 前言 点个免费的赞和关注&#xff0c;有错误的地方请指出&#xff0c;看个人主页有…

深度学习blog-RAG构建高效生成式AI的优选路径

RAG&#xff08;Retrieval-Augmented Generation&#xff09; 随着人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;模型的性能和应用场景也不断扩展。其中&#xff0c;检索增强生成&#xff08;RAG, Retrieval-Augmented Generation&#xff09;模型作为一种新…

数据中台与数据治理服务方案[50页PPT]

本文概述了数据中台与数据治理服务方案的核心要点。数据中台作为政务服务数据化的核心&#xff0c;通过整合各部门业务系统数据&#xff0c;进行建模与加工&#xff0c;以新数据驱动政府管理效率提升与政务服务能力增强。数据治理则聚焦于解决整体架构问题&#xff0c;确保数据…

AI生成PPT,效率与创意的双重升级

AI生成PPT&#xff0c;效率与创意的双重升级&#xff01;在信息化高速发展的今天&#xff0c;我们的工作节奏被无限压缩&#xff0c;效率成为了衡量工作能力的重要指标。而制作PPT这种事&#xff0c;总是让人又爱又恨——既想做得出彩&#xff0c;又不想花费大量时间。现在有了…

【HF设计模式】05-单例模式

声明&#xff1a;仅为个人学习总结&#xff0c;还请批判性查看&#xff0c;如有不同观点&#xff0c;欢迎交流。 摘要 《Head First设计模式》第5章笔记&#xff1a;结合示例应用和代码&#xff0c;介绍单例模式&#xff0c;包括遇到的问题、采用的解决方案、以及达到的效果。…

嵌入式linux系统中QT信号与槽实现

第一:Qt中信号与槽简介 信号与槽是Qt编程的基础。因为有了信号与槽的编程机制,在Qt中处理界面各个组件的交互操作时变得更加直观和简单。 槽函数与一般的函数不同的是:槽函数可以与一个信号关联,当信号被发射时,关联的槽函数被自动执行。 案例操作与实现: #ifndef …

php有两个数组map比较 通过id关联,number可能数量变化 比较他们之间增加修改删除

在PHP中&#xff0c;比较两个通过ID关联的数组&#xff0c;并确定它们之间的增加、修改和删除操作&#xff0c;你可以使用以下步骤&#xff1a; 创建两个数组&#xff1a;假设你有两个数组&#xff0c;分别表示“旧数据”和“新数据”。使用ID作为键&#xff1a;为了方便比较&a…

C++和OpenGL实现3D游戏编程【连载19】——着色器光照初步(平行光和光照贴图)(附源码)

1、本节要实现的内容 我们在前期的教程中,讨论了在即时渲染模式下的光照内容。但在我们后期使用着色器的核心模式下,会经常在着色器中使光照,我们这里就讨论一下着色器光照效果,以及光照贴图效果,同时这里知识会为后期的更多光照效果做一些铺垫。本节我们首先讨论冯氏光照…

《learn_the_architecture_-_generic_interrupt_controller_v3_and_v4__overview》学习笔记

1.GIC是基于Arm GIC架构实现的&#xff0c;该架构已经从GICv1发展到最新版本GICv3和GICv4。 Arm 拥有多个通用中断控制器&#xff0c;可为所有类型的 Arm Cortex 多处理器系统提供一系列中断管理解决方案。这些控制器的范围从用于具有小型 CPU 内核数的系统的最简单的 GIC-400 …

健身房管理系统多身份

本文结尾处获取源码。 本文结尾处获取源码。 本文结尾处获取源码。 一、相关技术 后端&#xff1a;Java、JavaWeb / Springboot。前端&#xff1a;Vue、HTML / CSS / Javascript 等。数据库&#xff1a;MySQL 二、相关软件&#xff08;列出的软件其一均可运行&#xff09; I…

General OCR Theory: Towards OCR-2.0 via a Unified End-to-end Model

通用 OCR 理论&#xff1a;通过统一的端到端模型实现 OCR-2.0 Abstract 随着人们对人工光学字符的智能处理需求日益增长&#xff0c;传统的OCR系统&#xff08;OCR-1.0&#xff09;已越来越不能满足人们的使用需求。本文&#xff0c;我们将所有人工光学信号&#xff08;例如纯…

大数据组件(二)快速入门数据集成平台SeaTunnel

大数据组件(二)快速入门数据集成平台SeaTunnel SeaTunnel是一个超高性能的分布式数据集成平台&#xff0c;支持实时海量数据同步。 每天可稳定高效同步数百亿数据&#xff0c;已被近百家企业应用于生产。 SeaTunnel的运行流程如下图所示&#xff1a; 工作流程为&#xff1a;So…

前端如何判断多个请求完毕

在前端开发中&#xff0c;经常会遇到需要同时发起多个异步请求&#xff0c;并在所有请求都完成后再进行下一步操作的情况。 这里有几个常用的方法来实现这一需求&#xff1a; 使用 Promise.all() Promise.all() 方法接收一个 Promise 对象的数组作为参数&#xff0c;当所有的…