当前位置: 首页 > news >正文

如何在 Ubuntu 14.04 上使用 HAProxy 实现 SSL 终止

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。

简介

HAProxy,全称高可用代理,是一款流行的开源软件 TCP/HTTP 负载均衡器和代理解决方案,可在 Linux、Solaris 和 FreeBSD 上运行。它最常见的用途是通过将工作负载分布到多台服务器(例如 Web、应用、数据库)上来提高服务器环境的性能和可靠性。它被广泛应用于许多知名环境,包括 GitHub、Imgur、Instagram 和 Twitter。

在本教程中,我们将介绍如何使用 HAProxy 进行 SSL 终止,进行流量加密以及负载均衡您的 Web 服务器。我们还将向您展示如何使用 HAProxy 将 HTTP 流量重定向到 HTTPS。

HAProxy 1.5.x 中实现了原生的 SSL 支持,该版本于 2014 年 6 月发布为稳定版本。

先决条件

要完成本教程,您必须具备或获取以下内容:

  • 至少一台 Web 服务器,具有私有网络,监听 HTTP(端口 80)
  • 在另一个 VPS 上具有 root 访问权限,我们将在其中安装 HAProxy。设置 root 访问权限的说明可以在此处找到(步骤 3 和 4):使用 Ubuntu 14.04 进行初始服务器设置。
  • 具有与您的域名或 IP 地址匹配的“通用名称”的 SSL 证书和私钥对

如果您还没有 SSL 证书和私钥对,请在继续之前获取。以下是一些包含创建 SSL 证书步骤的教程:

  • 创建 StartSSL 证书(private.keyssl.crt
  • 在 Ubuntu 14.04 上创建自签名 SSL 证书(第 2 步–apache.keyapache.crt

创建组合的 PEM SSL 证书/密钥文件

要使用 HAProxy 实现 SSL 终止,我们必须确保您的 SSL 证书和密钥对处于正确的 PEM 格式。在大多数情况下,您可以简单地组合您的 SSL 证书(由证书颁发机构提供的 .crt 或 .cer 文件)和其相应的私钥(由您生成的 .key 文件)。假设您的证书文件名为 example.com.crt,私钥文件名为 example.com.key,以下是如何组合文件的示例:

cat example.com.crt example.com.key > example.com.pem
sudo cp example.com.pem /etc/ssl/private/

这将创建名为 example.com.pem 的组合 PEM 文件,并将其复制到 /etc/ssl/private。请务必确保保护您的私钥文件的任何副本,包括 PEM 文件(其中包含私钥)。

在某些情况下,您可能需要将您的 CA 根证书和 CA 中间证书复制到您的 PEM 文件中。

我们的起始环境

以下是我们要开始的环境:

!Web 服务器上的 HTTP

如果您的环境与示例不同,例如如果您已经在 Web 服务器上使用 SSL,或者您有一个单独的数据库服务器,您应该能够调整本教程以适应您的环境。

如果您对基本的负载均衡概念或术语不熟悉,例如第 7 层负载均衡、后端或 ACL,这里有一篇解释基础知识的文章:HAProxy 和负载均衡概念简介。

我们的目标

在本教程结束时,我们希望拥有以下环境:

!HAProxy SSL 终止

也就是说,您的用户将通过 HTTPS 连接到您的 HAProxy 服务器访问您的网站,该服务器将解密 SSL 会话并将未加密的请求转发到您的 Web 服务器(即 www-backend 中的服务器)通过它们的私有网络接口上的端口 80。然后,您的 Web 服务器将向 HAProxy 服务器发送其响应,后者将加密响应并将其发送回发起原始请求的用户。

您可以根据需要设置 www-backend,使用尽可能多的 Web 服务器,只要它们提供相同的内容。换句话说,您可以使用单个服务器设置,然后通过添加尽可能多的服务器来扩展它。请记住,随着流量的增加,如果 HAProxy 服务器没有足够的系统资源来处理用户流量,它可能会成为性能瓶颈。

注意: 本教程不涵盖如何确保您的 Web/应用服务器提供相同的内容,因为这通常取决于应用程序或 Web 服务器。

安装 HAProxy 1.6.x

创建一个具有私有网络的新 VPS。在本教程中,我们将其称为 haproxy-www,但您可以自行命名。

在我们的 haproxy-www VPS 上,添加专用 PPA 到 apt-get:

sudo add-apt-repository ppa:vbernat/haproxy-1.6

然后更新您的 apt 缓存:

sudo apt-get update

然后使用以下命令安装 HAProxy 1.6:

sudo apt-get install haproxy

现在 HAProxy 1.6 已安装,让我们来配置它!

HAProxy 配置

HAProxy 的配置文件位于 /etc/haproxy/haproxy.cfg,分为两个主要部分:

  • 全局(Global):设置全局参数
  • 代理(Proxies):包括 defaultslistenfrontendbackend 部分

如果您对 HAProxy 或基本的负载均衡概念和术语不熟悉,请参考以下链接:HAProxy 和负载均衡概念简介

HAProxy 配置:全局(Global)

所有 HAProxy 配置都应在您的 HAProxy VPS 上进行,即 haproxy-www

在编辑器中打开 haproxy.cfg:

sudo vi /etc/haproxy/haproxy.cfg

您会看到已经定义了两个部分:globaldefaults

首先,您需要设置 maxconn 为一个合理的数字。此设置会影响 HAProxy 允许的并发连接数,这可能会影响 QoS 并防止您的 Web 服务器因尝试服务过多请求而崩溃。您需要根据您的环境进行调整。在配置的 global 部分中添加以下行(使用您认为合理的值):

   maxconn 2048

添加以下行,以配置生成的临时 DHE 密钥的最大大小:

   tune.ssl.default-dh-param 2048

接下来,在 defaults 部分,在标有 mode http 的行下添加以下行:

   option forwardforoption http-server-close

forwardfor 选项设置 HAProxy 在每个请求中添加 X-Forwarded-For 头,http-server-close 选项通过关闭连接但保持 keep-alive 来减少 HAProxy 与用户之间的延迟。

HAProxy 配置:统计信息

使用 HAProxy 统计信息可以帮助确定 HAProxy 如何处理传入流量。如果您想要启用 HAProxy 统计页面,在 defaults 部分添加以下行(用安全值替换用户和密码):

   stats enablestats uri /statsstats realm Haproxy\ Statisticsstats auth user:password

这将允许您通过在您的域名后加上 /stats(例如 https://example.com/stats)来查看 HAProxy 统计页面。

不要关闭配置文件!接下来我们将添加代理配置。

HAProxy 配置:代理

前端配置

首先,我们要添加一个前端来处理传入的 HTTP 连接。在文件末尾,让我们添加一个名为 www-http 的前端。确保用您的 haproxy-www VPS 的公共 IP替换 haproxy_www_public_IP

frontend www-httpbind haproxy_www_public_IP:80reqadd X-Forwarded-Proto:\ httpdefault_backend www-backend

以下是上述前端配置片段中每行的解释:

  • frontend www-http:指定名为 “www-http” 的前端
  • bind haproxy_www_public_IP:80:用 haproxy-www 的公共 IP 地址替换 haproxy_www_public_IP。这告诉 HAProxy 此前端将处理此 IP 地址和端口 80(HTTP)上的传入网络流量
  • reqadd X-Forwarded-Proto:\ http:在 HTTP 请求末尾添加 http 头
  • default_backend www-backend:指定此前端接收到的任何流量将被转发到 www-backend,我们将在下一步中定义

接下来,我们将添加一个前端来处理传入的 HTTPS 连接。在文件末尾,让我们添加一个名为 www-https 的前端。确保用您的 haproxy-www VPS 的公共 IP替换 haproxy_www_public_IP

frontend www-httpsbind haproxy_www_public_IP:443 ssl crt /etc/ssl/private/example.com.pemreqadd X-Forwarded-Proto:\ httpsdefault_backend www-backend
  • frontend www-https:指定名为 “www-https” 的前端
  • bind haproxy_www_public_IP:443 ssl crt …:用 haproxy-www 的公共 IP 地址替换 haproxy_www_public_IP,用 pem 格式的 SSL 证书和密钥对中的 example.com.pem 替换。这告诉 HAProxy 此前端将处理此 IP 地址和端口 443(HTTPS)上的传入网络流量
  • reqadd X-Forwarded-Proto:\ https:在 HTTPS 请求末尾添加 https 头
  • default_backend www-backend:指定此前端接收到的任何流量将被转发到 www-backend,我们将在下一步中定义

后端配置

在配置前端完成后,继续通过添加以下行来添加后端。确保用你的 Web 服务器的私有 IP 地址替换下面的高亮词语:

backend www-backendredirect scheme https if !{ ssl_fc }server www-1 www_1_private_IP:80 checkserver www-2 www_2_private_IP:80 check

以下是上述后端配置片段中每行的解释:

  • backend www-backend:指定一个名为 www-backend 的后端
  • redirect scheme https if !{ ssl_fc }:此行将 HTTP 请求重定向到 HTTPS,使您的站点仅支持 HTTPS。如果要允许 HTTP 和 HTTPS,删除此行
  • server www-1 …:指定名为 www-1 的后端服务器,私有 IP(您必须替换)和它正在监听的端口 80check 选项使负载均衡器定期对此服务器执行健康检查
  • server www-2 …:类似于前一行。添加类似的额外行,使用适当的名称和 IP 地址来向负载均衡器添加更多服务器

现在保存并退出 haproxy.cfg。HAProxy 现在已准备就绪,但让我们先启用日志记录。

启用 HAProxy 日志记录

在 HAProxy 中启用日志记录非常简单。首先编辑 rsyslog.conf 文件:

sudo vi /etc/rsyslog.conf

然后找到以下两行,并取消注释以启用 UDP syslog 接收。完成后应如下所示:

$ModLoad imudp
$UDPServerRun 514
$UDPServerAddress 127.0.0.1

现在重新启动 rsyslog 以启用新配置:

sudo service rsyslog restart

HAProxy 日志记录现在已启用!一旦启动 HAProxy,日志文件将在 /var/log/haproxy.log 中创建。

启动 HAProxy

在 haproxy-www 上,启动 HAProxy 以使配置更改生效:

sudo service haproxy restart

HAProxy 现在正在执行 SSL 终止和负载均衡您的 Web 服务器!您的负载平衡服务器现在可以通过负载均衡器 haproxy-www 的公共 IP 地址或域名访问。有一些事情您需要检查,以确保一切设置正确。

检查事项

  • 如果尚未这样做,请更新您的域名服务器,将您的域指向 haproxy-www 服务器的公共 IP 地址
  • 如果您希望服务器仅使用 HTTPS,您需要确保您的 Web 服务器(例如 www-1、www-2 等)仅在它们的私有 IP 地址上监听端口 80。否则,用户将能够通过它们的公共 IP 地址在 HTTP(未加密)上访问您的 Web 服务器
  • 通过 HTTPS 访问 haproxy-www 并确保它正常工作
  • 通过 HTTP 访问 haproxy-www 并确保它重定向到 HTTPS(除非您配置为允许 HTTP 和 HTTPS)

注意: 如果您使用需要知道自己 URL 的应用程序,比如 WordPress,您需要将 URL 设置从 “http” 更改为 “https”。以 WordPress 为例,您需要转到 WordPress 的常规设置,然后将 WordPress 地址(URL)和站点地址(URL)从 “http” 更改为 “https”。

结论

现在您拥有一个处理 SSL 连接并可用于水平扩展服务器环境的负载均衡器解决方案。请随意将本指南中学到的内容与其他 HAProxy 指南结合使用,以进一步改进您的环境!

相关文章:

如何在 Ubuntu 14.04 上使用 HAProxy 实现 SSL 终止

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 简介 HAProxy,全称高可用代理,是一款流行的开源软件 TCP/HTTP 负载均衡器和代理解决方案,可在 Linu…...

dockercompose

安装dockerconpose #上传docker-compose安装包 chmod x docker-compose mv docker-compose /usr/bin/ [rootlocalhost ~]# docker-compose --version docker-compose version 1.24.1, build 4667896b文件格式以及编写注意事项 YAML 是一种标记语言,它可以很直观的…...

「51媒体」活动会议,展览展会,直播曝光的一种方法

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 我们在做活动会议,或者参加展览展会,需要进行直播的时候,可以通过一键同步多个媒体平台的方法,来扩大曝光,比如一场直播我们可…...

Go WebSocket入门+千万级别弹幕系统架构设计

Go实现WebSocket(千万级别弹幕系统架构设计) 1 websocket简介(基于HTTP协议的长连接) 使用WebSocket可以轻松的维持服务器端长连接,其次WebSocket是架构在HTTP协议之上的,并且也可以使用HTTPS方式,因此WebSocket是可靠…...

uniapp使用伪元素实现气泡

uniapp使用伪元素实现气泡 背景实现思路代码实现尾巴 背景 气泡效果在开发中使用是非常常见的,使用场景有提示框,对话框等等,今天我们使用css来实现气泡效果。老规矩,先看下效果图: 实现思路 其实实现这个气泡框的…...

字节跳动:从梦想之芽到参天大树

字节跳动掌舵人:张一鸣 2012年:梦想的起点:在一个阳光明媚的早晨,北京的一座普通公寓里,一位名叫张一鸣的年轻人坐在电脑前,眼中闪烁着坚定的光芒。他的心中有一个梦想——通过技术改变世界,让…...

组合数学、圆排列、离散数学多重集合笔记

自用 如果能帮到您,那也值得高兴 知识点 离散数学经典题目 多重集合组合 补充容斥原理公式 隔板法题目 全排列题目:...

网络技术原理需要解决的5个问题

解决世界上任意两台设备时如何通讯的?? 第一个问题,pc1和pc3是怎么通讯的? 这俩属于同一个网段,那么同网段的是怎么通讯的? pc1和pc2属于不同的网段,第二个问题,不同网段的设备是…...

【数据结构】链表的大概认识及单链表的实现

目录 一、链表的概念及结构 二、链表的分类 三、单链表的实现 建立链表的节点: 尾插——尾删: 头插——头删: 查找: 指定位置之后删除——插入: 指定位置之前插入——删除指定位置: 销毁链表&am…...

国企:2024年6月中国移动相关招聘信息 二

在线营销服务中心-中国移动通信有限公司在线营销服务中心 硬件工程师 工作地点:河南省-郑州市 发布时间 :2024-06-18 截至时间: 2024-06-30 学历要求:本科及以上 招聘人数:1人 工作经验:3年 岗位描述 1.负责公司拾音器等音视频智能硬件产品全过程管理,包括但…...

Elasticsearch:智能 RAG,获取周围分块(二)

在之前的文章 “Elasticsearch:智能 RAG,获取周围分块(一) ” 里,它介绍了如何实现智能 RAG,获取周围分块。在那个文章里有一个 notebook。为了方便在本地部署的开发者能够顺利的运行那里的 notebook。在本…...

华为---RIP路由协议的汇总

8.3 RIP路由协议的汇总 8.3.1 原理概述 当网络中路由器的路由条目非常多时,可以通过路由汇总(又称路由汇聚或路由聚合)来减少路由条目数,加快路由收敛时间和增强网络稳定性。路由汇总的原理是,同一个自然网段内的不同子网的路由在向外(其他…...

Python基础——字符串常见用法:切片、去空格、替换、拼接

文章目录 专栏导读1、拼接字符串2、获取字符串长度3、字符串切片4、字符串替换:5、字符串分割6、字符串查找7、字符串大小写转换8、字符串去除空白9、字符串格式化:10、字符串编码与解码:11、字符串判断12、字符串填充与对齐总结 专栏导读 &a…...

LeetCode.51N皇后详解

问题描述 按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上,并且使皇后彼此之间不能相互攻击。 给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案…...

计算机网络之奇偶校验码和CRC冗余校验码

今天我们来看看有关于计算机网络的知识——奇偶校验码和CRC冗余校验码,这两种检测编码的方式相信大家在计算机组成原理当中也有所耳闻,所以今天我就来跟大家分享有关他们的知识。 奇偶校验码 奇偶校验码是通过增加冗余位使得码字中1的个数恒为奇数或偶数…...

二叉树经典OJ练习

个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 二叉树经典OJ练习 收录于专栏【数据结构初阶】 本专栏旨在分享学习数据结构学习的一点学习笔记,欢迎大家在评论区交流讨论💌 目录 前置说…...

【OpenHarmony4.1 之 U-Boot 2024.07源码深度解析】008 - make distclean 命令解析

【OpenHarmony4.1 之 U-Boot 2024.07源码深度解析】008 - make distclean 命令解析 一、make V=1 distclean 命令解析系列文章汇总:《【OpenHarmony4.1 之 U-Boot 源码深度解析】000 - 文章链接汇总》 本文链接:《【OpenHarmony4.1 之 U-Boot 2024.07源码深度解析】008 - mak…...

QTreeView双击任意列展开

一.效果 二.原理 重点是如何通过其他列的QModelIndex(假设为index),获取第一列的QModelIndex(假设为firstColumnIndex)。代码如下所示: QModelIndex firstColumnIndex = model->index(index.row(), 0, index.parent()); 这里要注意index函数的第三个参数,第三个参…...

Linux入门攻坚——26、Web Service基础知识与httpd配置-2

http协议 URL:Uniform Resource Locator,统一资源定位符 URL方案:scheme,如http://,https:// 服务器地址:IP:port 资源路径: 示例:http://www.test.com:80/bbs/…...

相由心生与事出反常必有妖

从端午节之日生病起,已就医三次,快半个月了。医检的结论是老病复发—— 上呼吸道感染 。原本并无大碍,加之“水不在深,有龙则灵”的张龙医生处方得当,现已病情好转。只是“800727”趁人之危,兴灾乐祸地欲从…...

idea大量爆红问题解决

问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...

深入理解JavaScript设计模式之单例模式

目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包&#xff08;Closure&#xff09;&#xff1f;闭包有什么应用场景和潜在问题&#xff1f;2.解释 JavaScript 的作用域链&#xff08;Scope Chain&#xff09; 二、原型与继承3.原型链是什么&#xff1f;如何实现继承&a…...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)

一、OpenBCI_GUI 项目概述 &#xff08;一&#xff09;项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台&#xff0c;其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言&#xff0c;首次接触 OpenBCI 设备时&#xff0c;往…...

《Docker》架构

文章目录 架构模式单机架构应用数据分离架构应用服务器集群架构读写分离/主从分离架构冷热分离架构垂直分库架构微服务架构容器编排架构什么是容器&#xff0c;docker&#xff0c;镜像&#xff0c;k8s 架构模式 单机架构 单机架构其实就是应用服务器和单机服务器都部署在同一…...

【Post-process】【VBA】ETABS VBA FrameObj.GetNameList and write to EXCEL

ETABS API实战:导出框架元素数据到Excel 在结构工程师的日常工作中,经常需要从ETABS模型中提取框架元素信息进行后续分析。手动复制粘贴不仅耗时,还容易出错。今天我们来用简单的VBA代码实现自动化导出。 🎯 我们要实现什么? 一键点击,就能将ETABS中所有框架元素的基…...

软件工程 期末复习

瀑布模型&#xff1a;计划 螺旋模型&#xff1a;风险低 原型模型: 用户反馈 喷泉模型:代码复用 高内聚 低耦合&#xff1a;模块内部功能紧密 模块之间依赖程度小 高内聚&#xff1a;指的是一个模块内部的功能应该紧密相关。换句话说&#xff0c;一个模块应当只实现单一的功能…...