跳至内容

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 来提升权限。
  • 熟悉命令行编辑器。作者在这里使用 vivim,但可以用你喜欢的编辑器替换。
  • 能够更改几种 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 Nginx

或者

Pound Apache

使用“紧急”

使用像 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 服务器,那么您需要在负载均衡代理上为全世界打开httphttps服务。但是“后端”服务器呢?

它们只需要通过 Pound 服务器的端口访问,但由于 Pound 服务器正在将流量重定向到“后端”服务器的 8080 或 8081,并且由于“后端”服务器在这些后续端口上监听http,因此您只需使用这些“后端”服务器上防火墙命令的服务名称即可。

本节将处理这些问题,以及锁定所有内容所需的firewalld命令。

警告

这里假设您可以直接访问相关服务器,而不是远程访问它们。如果您是远程访问,在从firewalld区域中删除服务时要格外小心!

您可能会意外地把自己锁定在服务器之外。

防火墙 - Pound 服务器

对于 Pound 服务器,您希望允许全世界访问httphttps。最好考虑您是否需要允许全世界访问ssh。如果您是服务器本地用户,这可能不是这样。作者在此假设该服务器通过您的本地网络可用,并且您可以直接访问它,因此您将把ssh锁定在您的 LAN IP 上。

要实现这一点,您将使用 Rocky Linux 的内置防火墙firewalldfirewall-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

您还需要添加httphttps服务

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 负载均衡器的httphttps访问。

仅此而已。

同样,您将把ssh服务添加到您的“trusted”区域,使用与您的 pound 服务器使用的命令基本相同的命令。然后添加一个名为“balance”的区域,您将使用它来处理剩余的httphttps,并将源 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:

添加该新区域以处理httphttps。请记住,这里的源 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