【问题标题】:Best way to redirect image requests to a different webserver?将图像请求重定向到不同的网络服务器的最佳方法?
【发布时间】:2010-09-27 04:40:34
【问题描述】:

我正在尝试通过添加“图像服务器”(用于处理图像请求的专用服务器)并将所有对 .gif、.jpg、.png 等的请求重定向到它来减少我的网络服务器的负载。

我的问题是,处理重定向的最佳方式是什么?

  • 在防火墙级别? (我可以使用 iptables 做到这一点吗?)
  • 在负载平衡器级别? (ldirectord 可以处理吗?)
  • 在 apache 级别 - 使用重写规则?

感谢您提供有关最佳方式的任何建议。

--更新--

我要补充的一点是,这些域是为第三方托管的,所以我不能指望所有开发人员都修改他们的代码并将他们的图像指向另一台服务器。

【问题讨论】:

  • "在 apache 级别 - 使用重写规则?"如果它在 Apache 级别,那么您已经在网络服务器上,因此重定向它仍然会稍微加载您的网络服务器。或者你有一个 Apache 反向代理层?你能描述一下你的架构吗? (包括您拥有的负载均衡器)
  • 现在我们在一个或另一个网络服务器上使用 ldirectord 进行负载平衡,两者前面都有一个 iptables 防火墙(专用框)。 (无反向代理)
  • 嗨布伦特,你做到了吗?这会带来多少性能提升?值得吗?

标签: scalability webserver firewall load-balancing iptables


【解决方案1】:

你能做的越远越好。

理想情况下,在 DNS 级别为您的图像使用不同的域(例如 imgs.example.com)

如果您负担得起,请使用 CDN(内容分发网络)让其他人来做。

-更新-

您可能还想查看 apache 的 mod_rewrite 的 2 个功能。它们都在http://httpd.apache.org/docs/1.3/misc/rewriteguide.html 上得到了很好的描述。

第一个在上述文档的“动态镜像”标题下,它使用了 mod_rewrite 代理标志 [p]。这使您的服务器可以静默地从另一个域中获取文件并返回它们。

第二个是将请求重定向到新域。第二个选项对您的服务器施加的压力较小,但仍然需要传入请求,并且会减慢页面的最终呈现速度,因为每个请求都需要首先向您的服务器发出本质上冗余的请求。

【讨论】:

  • CoralCache 还在吗?它有效吗?它曾经把我从 Slashdotting 中救了出来。
  • 我同意链条越往上越好。 DNS 对我来说完成这项工作有点高,但在防火墙 NATting 级别进行似乎更有希望。但到目前为止,所有细节都处于 apache 级别。
  • 防火墙级别不太实用。想一想:防火墙必须一直深入数据包,解释结果,并有选择地创建适当的返回数据包。这描述了像 Apache 这样的网络服务器,而不是防火墙
【解决方案2】:

我同意 rikh。如果您希望从不同的网络服务器提供图像,请在不同的网络服务器上提供它们。例如:

<IMG src="images/Brett.jpg">

变成

<IMG src="http://brettnesbitt.akamia-technologies.com/images/Brett.jpg">

任何类型的负载平衡器仍会从网络服务器的管道中提供图像,这是您要避免的。


我当然知道你真正想要什么。您真正想要的是任何请求,例如:

GET images/Brett.jpg HTTP/1.1

自动转换成:

HTTP/1.1 307 Temporary Redirect
Location: http://brettnesbitt.akamia-technologies.com/images/Brett.jpg

这样你不需要做任何工作,除了将图像复制到另一个网络服务器。

我真的不知道该怎么做。


使用短语“NAT”表示防火墙/路由器接收 HTTP 请求,如果 HTTP 请求是针对图像文件的,您希望将请求转发到不同的内部服务器。

这就引出了一个问题,即您实际上要保存什么。无论哪个内部网络服务器为 HTTP 请求提供服务,数据仍然必须通过防火墙/路由器的管道。

我提出这个问题的原因是,当有人想要从不同的服务器提供图像时,常见的场景是因为他们想要从他们的实际逻辑中分离出高带宽、主要是静态、低 CPU 成本的内容。

仅使用 NAT 重写数据包并将其发送到不同的服务器将无法解决该常见问题。

另一个原因可能是因为图像不是您系统上的静态内容,并且请求

GET images/Brett.jpg HTTP/1.1

实际上是动态构建映像,CPU 成本很高,或者仅使用对 ServerB 可用的数据(即 SQL Server 数据库)。

如果是这种情况,那么我仍然会在图像请求上使用不同的服务器名称:

GET http://www.brettsoft.com/default.aspx HTTP/1.1
GET http://imageserver.brettsoft.com/images/Brett.jpg HTTP/1.1

我了解您的希望,通过网络数据包检查来覆盖 NAT 规则并将其发送到另一台服务器 - 我从未见过任何可以做到这一点的东西。 p>

这听起来更像是“代理式”,网络代理就是这样做的。 (即 pfSense 和 m0n0wall 做不到)

这导致了我们曾经使用过的一种解决方案:一个自定义 Web 服务器,它分析请求,从某个内部服务器发出适当的请求,然后二进制将响应写入客户端。

“安全顾问”坚持认为解决方案中的痛苦,他显然相信security through obscurity。

我知道 IIS 不能为您自己做这些事情 - 我不知道其他网络服务器产品。


我只是四处询问,显然如果您想为基于 linux 的路由器编写一个自定义内核模块,您可以让它检查数据包并采取适当的措施。这样的模块可能存在。显然,还有很多其他开源模块可以作为起点。

但我宁愿朝自己的脑袋开枪。

【讨论】:

  • 我真正想要的是有一个单独的框(防火墙/负载平衡器)识别 HTTP 请求中的扩展,并相应地进行 NAT/重定向。
猜你喜欢
  • 1970-01-01
  • 2021-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-10
  • 1970-01-01
  • 2019-05-16
  • 1970-01-01
相关资源
最近更新 更多