Pound 代理服务器¶
EPEL-9 中缺少 Pound
在撰写本文时,在 Rocky Linux 9.0 上,无法从 EPEL 仓库安装 Pound。虽然有 SRPM 软件包的来源,但我们无法验证这些来源的完整性。因此,我们目前不建议在 Rocky Linux 9.0 上安装 Pound 代理服务器。如果 EPEL 再次接纳 Pound,情况可能会改变。此过程专门用于 Rocky Linux 8.x 版本。
介绍¶
Pound 是一款与 Web 服务器无关的反向代理和负载均衡器,设置和管理起来非常简单。它不使用 Web 服务,但会监听 Web 服务端口(http、https)。
现在,许多代理服务器选项存在,其中一些在这些文档页面中引用。关于使用 HAProxy 的文档在这里,并参考了在其他文档中使用 Nginx 作为反向代理。
负载均衡服务对于繁忙的 Web 服务器环境非常有用。许多代理服务器存在,包括之前提到的 HAProxy,并可用于许多服务类型。
就 Pound 而言,它只能用于 Web 服务,但它擅长自己的工作。
先决条件和假设¶
以下是对使用此过程的最低要求
- 希望在几个网站之间进行负载均衡,或者愿意学习新的工具来做同样的事情。
- 能够以 root 用户身份运行命令或使用
sudo
来提升权限。 - 熟悉命令行编辑器。作者在这里使用
vi
或vim
,但可以用你喜欢的编辑器替换。 - 能够更改几种 Web 服务器上的监听端口。
- 假设之前安装了 Nginx 和 Apache 服务器。
- 假设你在这里使用的是 Rocky Linux 服务器或容器。
- 虽然本文中包含有关
https
的各种声明,但这份指南只处理http
服务。要正确使用https
,你需要使用来自真实证书颁发机构的真实证书配置你的 pound 服务器。
提示
如果你没有安装这两个服务器中的任何一个,你可以在容器环境(LXD 或 Docker)或裸机上安装它们,并让它们运行起来。对于此过程,你必须使用各自的软件包安装它们,并启用和启动服务。我们不会以任何方式对它们进行重大修改。
dnf -y install nginx && systemctl enable --now nginx
或
dnf -y install httpd && systemctl enable --now httpd
约定¶
对于此过程,我们将使用两个 Web 服务器(称为后端服务器),一个运行 Nginx(192.168.1.111),另一个运行 Apache(192.168.1.108)。
我们的 Pound 服务器(192.168.1.103)是网关。
你将把后端服务器上的监听端口切换到 8080(对于 Nginx 服务器)和 8081(对于 Apache 服务器)。(下面展示了所有内容。)
注意
记住将相关 IP 更改为你自己环境中的 IP,并在整个过程中适当地替换它们。
安装 Pound 服务器¶
要安装 Pound,你需要先安装 EPEL(Enterprise Linux 的额外软件包)并运行更新
dnf -y install epel-release && dnf -y update
然后安装 Pound。(是的,那是大写的“P”)
dnf -y install Pound
配置 Pound¶
安装完软件包后,你需要配置 Pound。作者使用 vi
来更新它,但如果你更喜欢 nano
或其他东西,请替换掉它。
vi /etc/pound.cfg
该文件包含默认信息,这使得更容易看到 Pound 的大多数默认组件。
User "pound"
Group "pound"
Control "/var/lib/pound/pound.cfg"
ListenHTTP
Address 0.0.0.0
Port 80
End
ListenHTTPS
Address 0.0.0.0
Port 443
Cert "/etc/pki/tls/certs/pound.pem"
End
Service
BackEnd
Address 127.0.0.1
Port 8000
End
BackEnd
Address 127.0.0.1
Port 8001
End
End
仔细看看¶
- “用户”和“组” - 在安装过程中填充
- “控制”文件在任何地方都不使用
- “ListenHTTP”部分代表服务
http
(端口 80)和代理将监听的“地址”。您将将其更改为我们 Pound 服务器的实际 IP。 - “ListenHTTPS”部分代表服务
https
(端口 443)和代理将监听的“地址”。您将将其更改为 Pound 服务器的 IP。 - “Cert”选项是 Pound 安装过程提供的自签名证书。您需要在生产环境中使用以下步骤之一将其替换为真实证书:生成 SSL 密钥 或 使用 Let's Encrypt 生成 SSL 密钥.
- “服务”部分配置“后端”服务器及其监听端口。您可以根据需要设置任意数量的“后端”服务器。
更改配置¶
- 将每个监听选项下的 IP 地址更改为我们的 Pound 服务器 IP,即 192.168.1.103
- 将“后端”部分下的 IP 地址和端口更改为与我们在上面的“约定”中找到的配置匹配(IP 和端口)
当您完成对配置的修改后,您的文件将看起来像这样
User "pound"
Group "pound"
Control "/var/lib/pound/pound.cfg"
ListenHTTP
Address 192.168.1.103
Port 80
End
ListenHTTPS
Address 192.168.1.103
Port 443
Cert "/etc/pki/tls/certs/pound.pem"
End
Service
BackEnd
Address 192.168.1.111
Port 8080
End
BackEnd
Address 192.168.1.108
Port 8081
End
End
配置 Nginx 监听端口 8080¶
由于您已将 Nginx 的监听端口设置为我们在 Pound 配置中的 8080,因此您还需要在正在运行的 Nginx 服务器上进行更改。您可以通过修改nginx.conf
文件来实现。
vi /etc/nginx/nginx.conf
您只需将“监听”行更改为新的端口号即可
listen 8080 default_server;
保存更改并重新启动 nginx 服务
systemctl restart nginx
配置 Apache 监听端口 8081¶
由于您已将 Apache 的监听端口设置为我们在 Pound 配置中的 8081,因此您还需要在正在运行的 Apache 服务器上进行更改。您可以通过修改httpd.conf
文件来实现。
vi /etc/httpd/conf/httpd.conf
您需要将“监听”行更改为新的端口号
Listen 8081
保存更改并重新启动 httpd 服务
systemctl restart httpd
测试并启用¶
一旦您的 Web 服务启动并运行,并在每个服务器上的正确端口上监听,下一步就是在 Pound 服务器上启用 pound 服务
systemctl enable --now pound
警告
使用 Nginx 和 Apache,如这里为了演示而做的那样,将意味着 Nginx 服务器几乎总是首先响应。因此,为了有效地测试,您需要为 Nginx 服务器分配一个低优先级,这样您就可以看到两个屏幕。这充分说明了 Nginx 比 Apache 的速度。要更改 Nginx 服务器的优先级,您只需在 Nginx 服务器的“后端”部分添加一个优先级(1-9,其中 9 为最低优先级),如下所示
BackEnd
Address 192.168.1.111
Port 8080
Priority 9
End
当您在 Web 浏览器中打开代理服务器 IP 时,您将看到以下两个屏幕之一
或者
使用“紧急”¶
使用像 Pound 这样的负载均衡器时,您可能需要做的一件事是将生产服务器下线以进行维护,或者为完全停机提供一个“后端”备份。在pound.conf
文件中使用“紧急”声明来实现这一点。每个服务只能有一个“紧急”声明。在我们的例子中,这将出现在我们配置文件中“服务”部分的末尾
...
Service
BackEnd
Address 192.168.1.117
Port 8080
Priority 9
End
BackEnd
Address 192.168.1.108
Port 8081
End
Emergency
Address 192.168.1.104
Port 8000
End
End
此服务器可能只显示一条消息,上面写着“正在维护”。
安全注意事项¶
大多数关于负载均衡代理服务器的文档都不会处理安全问题。例如,如果这是一个面向公众的 Web 服务器,那么您需要在负载均衡代理上为全世界打开http
和https
服务。但是“后端”服务器呢?
它们只需要通过 Pound 服务器的端口访问,但由于 Pound 服务器正在将流量重定向到“后端”服务器的 8080 或 8081,并且由于“后端”服务器在这些后续端口上监听http
,因此您只需使用这些“后端”服务器上防火墙命令的服务名称即可。
本节将处理这些问题,以及锁定所有内容所需的firewalld
命令。
警告
这里假设您可以直接访问相关服务器,而不是远程访问它们。如果您是远程访问,在从firewalld
区域中删除服务时要格外小心!
您可能会意外地把自己锁定在服务器之外。
防火墙 - Pound 服务器¶
对于 Pound 服务器,您希望允许全世界访问http
和https
。最好考虑您是否需要允许全世界访问ssh
。如果您是服务器本地用户,这可能不是这样。作者在此假设该服务器通过您的本地网络可用,并且您可以直接访问它,因此您将把ssh
锁定在您的 LAN IP 上。
要实现这一点,您将使用 Rocky Linux 的内置防火墙firewalld
和firewall-cmd
命令结构。您还将使用两个内置区域“public”和“trusted”,以保持简单。
首先将我们的源 IP 添加到“trusted”区域。这是我们的 LAN(在我们的示例中:192.168.1.0/24)
firewall-cmd --zone=trusted --add-source=192.168.1.0/24 --permanent
然后,将ssh
服务添加到区域
firewall-cmd --zone=trusted --add-service=ssh --permanent
并使用以下命令重新加载防火墙
firewall-cmd --reload
列出区域,以便您可以使用firewall-cmd --zone=trusted --list-all
查看所有内容,这将为您提供类似以下内容的结果
trusted (active)
target: ACCEPT
icmp-block-inversion: no
interfaces:
sources: 192.168.1.0/24
services: ssh
ports:
protocols:
forward: no
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
接下来,您需要更改“public”区域,默认情况下该区域启用了ssh
服务。这需要仔细删除(再次,作者假设您不是服务器的远程用户!)使用以下命令
firewall-cmd --zone=public --remove-service=ssh --permanent
您还需要添加http
和https
服务
firewall-cmd --zone=public --add-service=http --add-service=https --permanent
然后重新加载防火墙以查看更改
firewall-cmd --reload
使用firewall-cmd --zone=public --list-all
列出“public”区域,这将显示类似以下内容的结果
public
target: default
icmp-block-inversion: no
interfaces:
sources:
services: cockpit dhcpv6-client http https
ports:
protocols:
forward: no
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
这些是我们在实验室环境中对 pound 服务器负载均衡器进行的唯一更改。
防火墙 - 后端服务器¶
对于“后端”服务器,您不需要允许全世界访问任何东西。您需要允许来自 LAN IP 的ssh
访问,以及来自 Pound 负载均衡器的http
和https
访问。
仅此而已。
同样,您将把ssh
服务添加到您的“trusted”区域,使用与您的 pound 服务器使用的命令基本相同的命令。然后添加一个名为“balance”的区域,您将使用它来处理剩余的http
和https
,并将源 IP 设置为负载均衡器的 IP。
为了简化操作,将您为“trusted”区域使用的所有命令组合到一组命令中
firewall-cmd --zone=trusted --add-source=192.168.1.0/24 --permanent
firewall-cmd --zone=trusted --add-service=ssh --permanent
firewall-cmd --reload
firewall-cmd --zone=trusted --list-all
之后,“trusted”区域将如下所示
trusted (active)
target: ACCEPT
icmp-block-inversion: no
interfaces:
sources: 192.168.1.0/24
services: ssh
ports:
protocols:
forward: no
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
再次,从 LAN 上的 IP 测试您的ssh
规则,然后从“public”区域中删除ssh
服务。请记住我们之前的警告,只有在您对服务器拥有本地访问权限的情况下才能执行此操作!
firewall-cmd --zone=public --remove-service=ssh --permanent
firewall-cmd --reload
firewall-cmd --zone=public --list-all
现在,“public”区域将如下所示
public
target: default
icmp-block-inversion: no
interfaces:
sources:
services: cockpit dhcpv6-client
ports:
protocols:
forward: no
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
添加该新区域以处理http
和https
。请记住,这里的源 IP 必须是您的负载均衡器(在我们的示例中:192.168.1.103)
注意
必须使用--permanent
选项添加新区域,并且在重新加载防火墙之前无法使用该区域。此外,不要忘记为该区域设置--set-target=ACCEPT
!
firewall-cmd --new-zone=balance --permanent
firewall-cmd --reload
firewall-cmd --zone=balance --set-target=ACCEPT
firewall-cmd --zone=balance --add-source=192.168.1.103 --permanent
firewall-cmd --zone=balance --add-service=http --add-service=https --permanent
firewall-cmd --reload
firewall-cmd --zone=balance --list-all
结果
balance (active)
target: ACCEPT
icmp-block-inversion: no
interfaces:
sources: 192.168.1.103
services: http https
ports:
protocols:
forward: no
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
在其他 Web 服务器后端重复这些步骤。
在将防火墙规则添加到所有内容后,再次从工作站浏览器测试您的 Pound 服务器。
其他信息¶
您可以在pound.conf
文件中使用许多选项,包括错误消息指令、日志记录选项、超时值等等。您可以通过此处找到可用的选项。
方便的是,Pound 会自动判断“后端”服务器之一是否离线并将其禁用,这样 Web 服务就可以无延迟地继续运行。它还会在“后端”服务器重新上线后自动再次检测到它们。
结论¶
对于那些不想使用 HAProxy 或 Nginx 进行负载均衡的人来说,Pound 提供了另一种选择。
Pound 作为负载均衡服务器非常易于安装、设置和使用。如这里所述,您可以使用 Pound 作为反向代理,并且存在许多代理和负载均衡选项。
在设置任何服务(包括负载均衡代理服务器)时,您应该始终牢记安全问题。
作者:Steven Spencer
贡献者:Ganna Zhyrnova