pfSense book之Web服务器负载平衡配置示例

简介:

  在pfsense的网关和服务器中有两种类型的负载平衡功能。网关负载平衡可以通过多个WAN连接分发Internet绑定的流量。服务器负载平衡管理传入流量,因此它利用多个内部服务器进行负载分配和冗余,服务器负载平衡允许流量在多个内部服务器之间分配,它最常用于Web服务器和SMTP服务器。下面我们就以实例来介绍服务器负载平衡的设置。

  下面介绍如何通过pfsense2.32配置Web服务器的负载平衡。

网络环境

../_images/diagrams-serverlb-example.png

服务器负载平衡示例网络环境

上图为示例网络环境。它由单个防火墙组成,使用其WAN IP地址池,DMZ段上有两个Web服务器。

配置地址池

  • 导航到 Services > Load Balancer

  • 单击Pools 标签

  • 单击 fa-plus 添加一个新的地址池

  • 如图所示,使用以下设置:

    Name: WebServers
    Mode: Load Balance
    Description: Web server Pool
    Port: 80
    Retry: 5
    Pool Members: 添加两个Web服务器 (10.6.0.11 和10.6.0.12
  • 单击Save

../_images/serverlb-pool.png

地址池配置

配置虚拟服务器

../_images/serverlb-virtualserver.png

虚拟服务器配置

  • 单击Virtual Servers标签

  • 单击 fa-plus 添加一个新的虚拟服务器

  • 如图所示,使用以下设置:

    Name: WebVirtualServer
    Description: Web Server
    IP Address: The firewall’s WAN IP address, 198.51.100.6
    Port: 80
    Virtual Server Pool:

    WebServers
    Fall Back Pool: None
  • 单击 Submit(提交)

  • 单击 Apply Changes(应用更改)



注意

在这个示例中,如果两个池服务器都关闭,则虚拟服务器无法访问。 如果没有配置虚拟服务器,防火墙将会起作用。 如果防火墙上的某些应用绑定到80端口,那么客户端就会直达绑定了这个端口的应用。 这可能包括通过端口80访问内置Web GUI,因此应该在System > Advanced Admin Access 选项卡上禁用或采用其他端口。


配置防火墙规则

防火墙规则必须配置为允许访问池中的服务器。 规则必须允许流量使用内部IP地址和端口,并且对虚拟服务器配置中使用的外部IP地址和端口不需要任何规则限制。

创建一个包含池中所有服务器的别名,因此可以使用单个防火墙规则进行访问。

  • 导航到Firewall > Aliases

  • 单击 fa-plus 添加 一个别名

  • 如图所示,使用以下设置:

    Name: www_servers
    Type: Hosts
    Hosts: 两个Web服务器IP地址: 10.6.0.11 和 10.6.0.12
  • 单击 Save

  • 单击 Apply Changes(应用更改)


图中的“Name”显示了用于此示例配置的别名,其中包含两个Web服务器。

../_images/serverlb-alias.png

Web 服务器别名设置

下一步,用这个别名创建一个防火墙规则: 导航到Firewall > Rules ,切换到外部连接访问的接口(例如WAN), 单击 fa-level-up 在顶部添加一条新规则,设置如下:

Interface: WAN
Protocol: TCP
Source: any
Destination Type:

Single Host or Alias
Destination Address:

www_servers
Destination Port Range:

HTTP
Description: Allow to Web Server
  • 单击 Save

  • 单击 Apply Changes(应用更改)

下图为Web服务器设置的防火墙规则,未显示的选项保留默认值。

../_images/serverlb-fwruleedit.png

为Web服务器添加防火墙规则

列表中显示的规则。

../_images/serverlb-fwrule.png

Web 服务器防火墙规则

查看负载平衡状态

现在已经配置了负载平衡器,要查看其状态,请浏览到Status > Load Balancer,然后单击“Virtual Servers”选项卡。此页面显示整个服务器的状态,通常列为“Active(联机”或“Down(脱机”。

Pools选项卡显示池的每个成员的单独状态(如图池状态)。如果服务器处于联机状态,服务器的行为绿色,如果服务器处于脱机状态,则为红色。

此外,池中的每个服务器都有一个复选框。 已检查的服务器在池中处于活动状态,池中已禁用未选中的服务器,与在池编辑页面上启用和禁用列表之间移动的服务器相同。 要禁用服务器:取消选中它,然后单击保存。 

../_images/serverlb-status-online.png

池状态

如果在其中一个服务器上停止了Web服务器服务,或者如果使用ICMP监视器将服务器完全从网络中删除,则状态将更新为“脱机”,并将服务器从池中删除。

验证负载平衡

为了验证负载平衡, curl 是确保Web浏览器缓存和持久连接不影响测试结果的最佳选择。curl 可以从 curl 官方网站下载,有各种操作系统的版本。 要使用它,只需运行以下命令:

curl http://mysite

在该命令中,将198.51.100.6替换为站点的IP地址或主机名。 这必须从网络外部进行测试(例如,从WAN上的远程网络或客户端)。 例如,在外网用curl进行测试:

# curl http://198.51.100.6
 This is server www2 - 10.6.0.12
# curl http://198.51.100.6
 This is server www1 - 10.6.0.11

测试负载平衡时,设置每个服务器返回指定其主机名、IP地址或两者,因此明确哪个服务器响应该请求。 如果未启用粘性连接,则不同的服务器将响应每个请求。

故障排除


不能连接到负载平衡

不能连接到负载平衡器通常是使用测试方法不当造成的,这通常是HTTP特有的。 Web浏览器通常会保持与Web服务器建立的连接,并且点击刷新会重新使用现有的连接。 单个连接将永远不会更改为另一个平衡服务器。 另一个常见的问题是网络浏览器缓存,浏览器只从缓存读取数据,未真正再次刷新页面。 最好使用诸如curl等命令行工具来测试,因为它确保测试不受Web浏览器测试中固有问题的影响。curl没有缓存,并在每次运行时都会重新建立与服务器的新连接。 

如果启用了粘性连接,请确保从多个源IP地址执行测试。来自单个源IP地址的测试将转到单个服务器,除非连接尝试之间经过了较长的时间。

关闭服务器未标记为脱机

如果服务器关闭但没有标记为脱机,那是因为负载平衡守护程序执行的监视信号仍然处于启动状态。 如果使用TCP监视器,TCP端口必须仍然接受连接。 该端口上的服务可以以多种方式断开,仍然可以回复TCP连接。 对于ICMP监视器,这个问题更加严重,因为服务器可以挂起或故障,没有任何监听服务,仍然可以回答ping。

在线服务器未标记为在线

如果服务器在线,但没有标记为在线,那是因为从负载平衡守护程序监视器的角度来看,它不是联机的。 服务器必须在所使用的TCP端口上回答或响应来自最靠近服务器的防火墙接口IP地址的ping。

例如,如果服务器在LAN上,则服务器必须应答从防火墙的LAN IP地址发起的请求。 要验证ICMP监视器,请导航到到Diagnostics > Ping,并使用服务器所在的接口Ping服务器IP地址。

对于TCP监视器,请使用“Diagnostics > Test Port”,并选择防火墙的LAN接口作为源,将Web服务器的IP地址和端口作为目标。

另一种测试方法是使用防火墙的shell提示符,使用console或ssh菜单选项8nc命令

# nc -vz 10.6.0.12 80nc: 
connect to 10.6.0.12 port 80 (tcp) failed: Operation timed out

上面是一个失败的例子。

下面是一个成功连接的例子:

# nc -vz 10.6.0.12 80
Connection to 10.6.0.12 80 port [tcp/http] succeeded!

如果连接失败,请在Web服务器上进一步进行故障排除。

与池服务器在同一子网中的客户端无法访问虚拟服务器

与池服务器在同一子网中的客户端系统将无法使用此负载平衡方法正确连接。 relayd将连接转发到具有客户端源地址的Web服务器。然后,服务器将尝试直接响应客户端。如果服务器具有到客户端的直接路径,例如通过同一子网中的本地连接的NIC,它将不会正常通过防火墙回流,客户端将从服务器的本地IP地址收到回复,而不会在relayd中收到该IP地址。然后,由于从客户端的角度看,服务器IP地址不正确,连接被丢弃为无效。


这样做的一个方法是使用手动出站NAT和制定手动出站NAT规则,以便从LAN子网到达Web服务器的内部接口(LAN)的流量转换为LAN的接口地址。这样,流量似乎源于防火墙,服务器将响应到防火墙,然后防火墙将该流量中继到客户端使用的预期地址。原始的客户端源IP地址在该过程中丢失,最佳的解决方案是将服务器移动到不同的网段。










本文转自 鐵血男兒 51CTO博客,原文链接:http://blog.51cto.com/fxn2025/1967084,如需转载请自行联系原作者
目录
相关文章
|
3月前
|
算法 Java Go
【GoGin】(1)上手Go Gin 基于Go语言开发的Web框架,本文介绍了各种路由的配置信息;包含各场景下请求参数的基本传入接收
gin 框架中采用的路优酷是基于httprouter做的是一个高性能的 HTTP 请求路由器,适用于 Go 语言。它的设计目标是提供高效的路由匹配和低内存占用,特别适合需要高性能和简单路由的应用场景。
360 4
|
10月前
|
移动开发 数据挖掘 开发者
服务器发送事件(SSE)在现代Web开发中的关键作用
服务器发送事件(SSE)是HTML5标准协议,用于服务器主动向客户端推送实时数据,适合单向通信场景。相比WebSocket,SSE更简洁高效,基于HTTP协议,具备自动重连、事件驱动等特性。常见应用场景包括实时通知、新闻推送、数据分析等。通过Apipost等工具可轻松调试SSE,助力开发者构建高效实时Web应用。示例中,电商平台利用SSE实现秒杀活动通知,显著减少延迟并简化架构。掌握SSE技术,能大幅提升用户体验与开发效率。
|
6月前
|
存储 Linux Apache
在CentOS上配置SVN至Web目录的自动同步
通过上述配置,每次当SVN仓库中提交新的更改时,`post-commit`钩子将被触发,SVN仓库的内容会自动同步到指定的Web目录,从而实现代码的连续部署。
211 16
|
弹性计算 开发工具 git
2分钟在阿里云ECS控制台部署个人应用(图文示例)
作为一名程序员,我在部署托管于Github/Gitee的代码到阿里云ECS服务器时,经常遇到繁琐的手动配置问题。近期,阿里云ECS控制台推出了一键构建部署功能,简化了这一过程,支持Gitee和GitHub仓库,自动处理git、docker等安装配置,无需手动登录服务器执行命令,大大提升了部署效率。本文将详细介绍该功能的使用方法和适用场景。
2分钟在阿里云ECS控制台部署个人应用(图文示例)
|
安全 编译器 Linux
深入解析与防范:基于缓冲区溢出的FTP服务器攻击及调用计算器示例
本文深入解析了利用缓冲区溢出漏洞对FTP服务器进行远程攻击的技术,通过分析FreeFlow FTP 1.75版本的漏洞,展示了如何通过构造过长的用户名触发缓冲区溢出并调用计算器(`calc.exe`)。文章详细介绍了攻击原理、关键代码组件及其实现步骤,并提出了有效的防范措施,如输入验证、编译器保护和安全编程语言的选择,以保障系统的安全性。环境搭建基于Windows XP SP3和Kali Linux,使用Metasploit Framework进行攻击演示。请注意,此内容仅用于教育和研究目的。
447 4
|
XML 前端开发 JavaScript
PHP与Ajax在Web开发中的交互技术。PHP作为服务器端脚本语言,处理数据和业务逻辑
本文深入探讨了PHP与Ajax在Web开发中的交互技术。PHP作为服务器端脚本语言,处理数据和业务逻辑;Ajax则通过异步请求实现页面无刷新更新。文中详细介绍了两者的工作原理、数据传输格式选择、具体实现方法及实际应用案例,如实时数据更新、表单验证与提交、动态加载内容等。同时,针对跨域问题、数据安全与性能优化提出了建议。总结指出,PHP与Ajax的结合能显著提升Web应用的效率和用户体验。
329 3
|
JavaScript 前端开发 开发工具
web项目规范配置(husky、eslint、lint-staged、commit)
通过上述配置,可以确保在Web项目开发过程中自动进行代码质量检查和规范化提交。Husky、ESLint、lint-staged和Commitlint共同作用,使得每次提交代码之前都会自动检查代码风格和语法问题,防止不符合规范的代码进入代码库。这不仅提高了代码质量,还保证了团队协作中的一致性。希望这些配置指南能帮助你建立高效的开发流程。
749 5
|
机器学习/深度学习 移动开发 JavaScript
Web实时通信的学习之旅:SSE(Server-Sent Events)的技术详解及简单示例演示
Web实时通信的学习之旅:SSE(Server-Sent Events)的技术详解及简单示例演示
6438 0
|
网络协议 安全 JavaScript
Web实时通信的学习之旅:WebSocket入门指南及示例演示
Web实时通信的学习之旅:WebSocket入门指南及示例演示
2385 0