如何在 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.key 和 ssl.crt)
 - 在 Ubuntu 14.04 上创建自签名 SSL 证书(第 2 步–apache.key 和 apache.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):包括 defaults、listen、frontend 和 backend 部分
 
如果您对 HAProxy 或基本的负载均衡概念和术语不熟悉,请参考以下链接:HAProxy 和负载均衡概念简介
HAProxy 配置:全局(Global)
所有 HAProxy 配置都应在您的 HAProxy VPS 上进行,即 haproxy-www。
在编辑器中打开 haproxy.cfg:
sudo vi /etc/haproxy/haproxy.cfg
 
您会看到已经定义了两个部分:global 和 defaults。
首先,您需要设置 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(您必须替换)和它正在监听的端口 80。check 选项使负载均衡器定期对此服务器执行健康检查
 - 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”趁人之危,兴灾乐祸地欲从…...
使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...
高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...
Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...
Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...
华为OD机考-机房布局
import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...
