介绍
HAProxy,即高可用性代理,是一个流行的开源软件TCP/HTTP负载平衡器和代理解决方案,可以在Linux,Solaris和FreeBSD上运行。 其最常见的用途是通过在多个服务器(如Web,应用程序,数据库)中分配工作负载来提高服务器环境的性能和可靠性。
在本教程中,我们将讨论如何使用HAProxy用于SSL终止,用于流量加密,以及对您的Web服务器的负载平衡。
在 HAProxy 1.5.x 中实现了原生 SSL 支持,该版本于 2014 年 6 月作为稳定版本发布。
前提条件
要完成本教程,您必须具备或获得以下内容:
- 至少有一個網絡伺服器,具有私人網路,在HTTP(端口80) 上聆聽* 根存取我們將安裝HAProxy的額外VPS。設定根存取的指示可以在這裡找到(步驟3和4): 初始伺服器設定與Ubuntu 14.04。
- 一個SSL證書和私人密钥對,具有匹配您的域名或IP地址的
共同名稱
如果您还没有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
。
1cat example.com.crt example.com.key > example.com.pem
2sudo cp example.com.pem /etc/ssl/private/
这将创建组合的 PEM 文件,称为 example.com.pem
,并将其复制到 /etc/ssl/private
. 如往常一样,请确保安全保护您的私钥文件的任何副本,包括 PEM 文件(其中包含私钥)。
在某些情况下,您可能需要将 CA 根证书和 CA 中间证书复制到 PEM 文件中。
我们的初始环境
以下是我们开始的环境:
如果您的环境与示例不同,例如,如果您已经在 Web 服务器上使用 SSL,或者您有单独的数据库服务器,您应该能够将本教程调整到与您的环境一起工作。
如果您不熟悉基本的负荷平衡概念或术语,如7层负荷平衡或后端或ACL,这里有一篇文章解释了基本知识: HAProxy和负荷平衡概念的介绍。
我们的目标
在本教程结束时,我们希望有一个看起来像这样的环境:
也就是说,您的用户将通过通过HTTPS连接到您的HAProxy服务器来访问您的网站,该服务器将解密SSL会话并将未加密的请求转发到您的Web服务器(即www-backend中的服务器)通过他们的私人网络接口80端口。
你可以设置你的 www-backend 与你想要的尽可能多的网页服务器,只要它们提供相同的内容. 换句话说,你可以设置一个单一的服务器,然后通过添加尽可能多的服务器来扩展它以后。
** 注意: ** 本教程不涵盖如何确保您的 Web / 应用程序服务器提供相同的内容,因为这些内容往往取决于应用程序或 Web 服务器。
安装 HAProxy 1.6.x
创建一个新的VPS与私人网络. 对于本教程,我们将称之为 haproxy-www,但你可以称之为任何你想要的。
在我们的 haproxy-www VPS 中,添加专用 PPA 到 apt-get:
1sudo add-apt-repository ppa:vbernat/haproxy-1.6
然后更新您的 apt 缓存:
1sudo apt-get update
然后使用 apt-get 安装 HAProxy 1.6 使用以下命令:
1sudo apt-get install haproxy
现在HAProxy 1.6已安装,让我们配置它!
HAProxy 配置
HAProxy 的配置文件位于 /etc/haproxy/haproxy.cfg
,分为两个主要部分:
- 全球:设置整个流程的参数
- **代理:由 defaults、 listen、 frontend 和 backend 部分 组成
再次,如果您不熟悉 HAProxy 或基本的负荷平衡概念和术语,请参阅此链接: HAProxy 和负荷平衡概念的介绍。
HAProxy 配置: 全球
**所有HAProxy配置都应该在您的HAProxy VPS上完成, haproxy-www。
在编辑器中打开 haproxy.cfg:
1sudo vi /etc/haproxy/haproxy.cfg
您将看到已经定义的两个部分: global 和 defaults。
您要做的第一件事是将 maxconn 设置为合理的数目。此设置会影响 HAProxy 允许的同时连接数量,这可能会影响 QoS,并防止您的 Web 服务器试图服务太多请求。
1maxconn 2048
添加此行,以配置生成的临时 DHE 密钥的最大大小:
1tune.ssl.default-dh-param 2048
接下来,在 defaults 部分中,在说模式 http
的行下方添加下列行:
1option forwardfor
2 option http-server-close
forwardfor 选项将 HAProxy 设置为每个请求添加 X-Forwarded-For 标题,而 http-server-close 选项会通过关闭连接而减少 HAProxy 和您的用户之间的延迟,但保持存活。
HAProxy 配置: 统计
如果您想启用 HAProxy 统计页面,请在 defaults 部分中添加以下行(用安全值替换用户和密码):
1stats enable
2 stats uri /stats
3 stats realm Haproxy\ Statistics
4 stats auth user:password
这将允许您查看HAProxy统计页面,通过前往您的域名在 /stats
(例如: https://example.com/stats)。
不要关闭 config 文件! 接下来我们将添加 proxy 配置。
HAProxy 配置: Proxies
前端配置
我们要添加的第一件事是处理接入 HTTP 连接的前端。 文件末尾,让我们添加一个名为 www-http 的前端。 请确保将haproxy_www_public_IP 替换为您的 haproxy-www VPS 的 公共 IP:
1frontend www-http
2 bind haproxy_www_public_IP:80
3 reqadd X-Forwarded-Proto:\ http
4 default_backend www-backend
以下是对前端 config 片段中的每个行意味着什么的解释:
- 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-endback:这说明这个前端接收的任何流量将被转发到 www-backend,我们将在下一步 定义
接下来,我们将添加一个前端来处理接入的 HTTPS 连接. 在文件的末尾,让我们添加一个前端称为 www-https. 请务必用你的 haproxy-www VPS 的 **公共 IP 代替 haproxy_www_public_IP
:
1frontend www-https
2 bind haproxy_www_public_IP:443 ssl crt /etc/ssl/private/example.com.pem
3 reqadd X-Forwarded-Proto:\ https
4 default_backend www-backend
- frontend www-https:指定一个名为
www-https
- bind haproxy_www_public_IP:443 ssl crt...:用 haproxy-www的公共 IP 地址替换haproxy_www_public_IP,并用您的 SSL 证书和密钥对组合 _pem_格式来指定
example.com.pem
。这告诉 HAProxy,此前端将处理此 IP 地址和端口 443 (HTTPS)上的输入网络流量。 - reqadd X-Forwarded-Proto: https: 添加 https 标题到 HTTPS 请求 的端末端。 **default_endback www-end-back:
后台配置
完成配置前端后,继续添加您的后端,添加以下行. 请确保用您的Web服务器的各自私人IP地址替换突出的单词:
1backend www-backend
2 redirect scheme https if !{ ssl_fc }
3 server www-1 www_1_private_IP:80 check
4 server www-2 www_2_private_IP:80 check
以下是对上面的后端配置片段中的每个行意味着什么的解释:
- backend www-backend:指定名为 www-backend_ _)* redirect scheme https if!{ ssl_fc }:此行将HTTP请求重定向到HTTPS,使您的网站只使用HTTPS。如果您希望允许HTTP和HTTPS,请删除此行
- 服务器 www-1...:指定名为 _www-1_的后端服务器,私人IP(您必须取代)和端口,它正在收听, 80。 _check_选项使负载平衡器定期在这个服务器
- 服务器 www-2...:类似于前一条。添加类似此的额外行,添加适当的名称和
现在保存并退出haproxy.cfg
。HAProxy现在已经准备好启动,但让我们先启用登录。
启用 HAProxy 记录
在 HAProxy 中启用登录非常简单. 首先,编辑 rsyslog.conf 文件:
1sudo vi /etc/rsyslog.conf
然后找出以下两行,并解除评论以启用UDP syslog接收. 完成后应该看起来如下:
1$ModLoad imudp
2$UDPServerRun 514
3$UDPServerAddress 127.0.0.1
现在重新启动 rsyslog 以启用新的配置:
1sudo service rsyslog restart
HAProxy 登录已启用! HAProxy 启动后,日志文件将创建在 `/var/log/haproxy.log。
启动HAProxy
** 在 haproxy-www** 上,启动 HAProxy 以实施您的配置更改:
1sudo service haproxy restart
HAProxy 现在正在执行 SSL 终止和负载平衡您的 Web 服务器! 您的负载平衡服务器现在可以通过您的负载平衡器的公共 IP 地址或域名访问您的用户, haproxy-www! 有一些事情你会想检查,以确保一切都设置正确。
事情要检查
- 如果您尚未更新您的名称服务器,以便将您的域名指向您的 haproxy-www 服务器的公共 IP 地址
- 如果您希望您的服务器只使用 HTTPS,您将想要确保您的 Web 服务器(例如 www-1, www-2, 等)只在端口上收听他们的私人 IP 地址 80。否则,用户将能够通过 HTTP (未加密)访问您的 Web 服务器,以他们的公共 IP 地址.
- 访问 haproxy-www 通过 HTTPS 并确保它工作
- 访问 haproxy-www 通过 HTTP 并确保它重定向到 HTTPS (除非您配置允许 HTTP 和 HTTPS)(_M
** 注意:** 如果你正在使用一个需要知道自己的URL的应用程序,如WordPress,你需要改变你的URL设置从http
到HTTPS。
结论
现在你有一个负载平衡解决方案,可以处理你的SSL连接,并可用于横向扩展你的服务器环境. 您可以自由地将本指南中学到的内容与其他HAProxy指南相结合,以进一步改善您的环境!