如何在 Ubuntu 14.04 上使用 HAProxy 实施 SSL 终结

介绍

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证书的步骤的一些教程:

创建一个组合的 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 Server on HTTP

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

如果您不熟悉基本的负荷平衡概念或术语,如7层负荷平衡或后端或ACL,这里有一篇文章解释了基本知识: HAProxy和负荷平衡概念的介绍

我们的目标

在本教程结束时,我们希望有一个看起来像这样的环境:

HAProxy SSL Termination

也就是说,您的用户将通过通过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,分为两个主要部分:

  • 全球:设置整个流程的参数
  • **代理:由 defaultslistenfrontendbackend 部分 组成

再次,如果您不熟悉 HAProxy 或基本的负荷平衡概念和术语,请参阅此链接: HAProxy 和负荷平衡概念的介绍

HAProxy 配置: 全球

**所有HAProxy配置都应该在您的HAProxy VPS上完成, haproxy-www

在编辑器中打开 haproxy.cfg:

1sudo vi /etc/haproxy/haproxy.cfg

您将看到已经定义的两个部分: globaldefaults

您要做的第一件事是将 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指南相结合,以进一步改善您的环境!

Published At
Categories with 技术
comments powered by Disqus