更新:根据 Jesper Mortensen 的回复,以下是更多信息。这些应用程序基于 Perl 的HTTP::守护进程。我确实计划将它们部署在 Linux 服务器上。
每个应用程序执行的操作都不同。因此,这并不是真正的负载平衡,因为服务器不可互换。我对 Apache 比其他任何东西都更熟悉,但我从未将其配置为代理。
考虑这样一种情况:几个 Web 应用程序正在监听各个端口(例如8080
和8888
)。这些应用程序的 HTML 输出始终是动态的且特定于用户,因此不应缓存,但它们将使用一组通用的图像、CSS 和 JavaScript 文件。
是否可以让服务器分别监听针对静态内容和应用程序特定www.example.com:80
请求的重定向请求?此外,是否可以在端口上使用,并使用?localhost:8000
localhost:8080
localhost:8888
https
www.example.com
8000
8080
8888
http
我一直在阅读第 12 章实用的 mod_perl和鱿鱼示例而且看起来应该是可能的,但这是我第一次深入研究代理和反向代理,因此我不确定我应该如何进行,而且我不确定术语,所以任何指针/更正也将非常感谢。
答案1
是的,这是可能的,它甚至是相当标准的功能。不幸的是,您没有提供有关服务器环境的详细信息......
您可以在请求的许多部分上区分站点;但经典的当然是通过完全合格域名每个站点,即 sitename1.somedomain.com、sitename2.somedomain.com、sitename3.com 等等。
使用 mod_perl 和 Squid 听起来就像是在使用 Unix。Apache 的mod_rewrite可能是在 Unix 上实现此目的的最常见/最古老的方法。请注意,掌握 mod_rewrite 以设置安全代理需要一些工作。(如果您设置了不安全的代理,它将允许在代理的“外部”部分上发送代理请求,而垃圾邮件发送者可能会滥用它从您的 IP 地址进行表单提交等。)
Unix 上的另一种常见方法是在公共 IP 上安装一个“轻量级”HTTP 服务器/代理(即接收来自用户的请求),然后让“轻量级”服务器将请求分散到“较重”的 Apache/PHP/Perl/Python 实例。这样做的好处是可以更高效地处理许多打开的连接,并减少服务器上的 RAM 使用量。nginx(EngineX)是一个流行的服务器,它还有一个重写模块。
关于在“第一个”Web 服务器上处理 HTTPS/SSL;是的,这是一个很好的解决方案。您只需像平常一样设置 SSL,并让 Web 服务器代理该主机名的请求到后端服务器。编辑:前端“HTTPS 加速器”通常会向后端请求添加 HTTP 标头 (X-Forwarded-Proto),以便后端应用程序可以知道原始请求是通过加密连接发送的
您在这里看到的是 HTTP 负载平衡的一个子案例;即您在一台机器上安装 HTTP 代理,并使用它将请求分散到同一台机器上的其他 HTTP 服务器。有很多适用于 Unix 系统的良好软件负载平衡器。
如果你使用的是 Windows,那么微软的新“应用程序请求路由“ 非常好。版本 2 目前处于测试阶段,与版本 1 相比有很大改进 - 可在 iis.net 网站上找到它。编辑:应该说,IIS 的任何一个版本都不是那么快,而且可扩展性也很好。大多数 IIS 用户都懒得为单个 IIS 服务器设置 HTTP 代理,他们只是在 IIS 服务器本身上创建具有适当应用程序模型的虚拟主机。
答案2
我认为你说得对。我不确定如何通过 perl 或 squid 来做到这一点,但我通过 apache 确实做到了这一点。这是我的配置:
<VirtualHost *:443>
ProxyPass /doc http://127.0.0.1:81/gdoc
ProxyPassReverse /doc http://127.0.0.1:81/gdoc
ProxyPass /rp01 http://server01.mydomain.local/rp01
ProxyPassReverse /rp01 http://server01.mydomain.local/rp01
ProxyPass /bugzilla http://bugzilla.mydomain.local
ProxyPassReverse /bugzilla http://bugzilla.mydomain.local
</VirtualHost>