将图像请求重定向到不同的Web服务器的最佳方法?

时间:2008-12-16 18:12:46

标签: scalability webserver firewall load-balancing iptables

我正在尝试通过添加“图像服务器”(用于处理图像请求的专用服务器)以及将.gif,.jpg,.png等所有请求重定向到网络服务器来减轻负载。< / p>

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

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

感谢您就最佳方式提出任何建议。

- 更新 -

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

2 个答案:

答案 0 :(得分:3)

你可以做到的链越往上越好。

理想情况下,通过为图片使用不同的域(例如imgs.example.com)在DNS级别执行此操作

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

-Update -

您可能还想看一下apache的mod_rewrite的两个特色。它们都在http://httpd.apache.org/docs/1.3/misc/rewriteguide.html处得到了很好的描述。

第一个是在上面文档中的“Dynamic Miror”标题下,它使用mod_rewrite Proxy标志[p]。这使您的服务器可以静默地从另一个域获取文件并将其返回。

第二种方法是将请求重定向到新域。第二个选项减少了服务器的压力,但是仍然需要进入请求,这会减慢页面的最终呈现速度,因为每个请求都需要首先向服务器发出基本冗余的请求。

答案 1 :(得分:1)

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

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

变为

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

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


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

GET images/Brett.jpg HTTP/1.1

自动转换为:

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

这样您就不必做任何工作,除了将图像复制到其他Web服务器。

我真的不知道该怎么做。


通过使用短语“NAT”,它意味着防火墙/路由器接收HTTP请求,并且如果HTTP请求是针对图像文件,则您希望将请求转发到其他内部服务器。

这就引出了关于你实际想要保存的问题。无论HTTP请求哪个内部Web服务器服务,数据仍然必须流经防火墙/路由器的管道。

我提出它的原因是因为有人想要从不同服务器提供图像的常见情况是因为他们想要从实际逻辑中分离出高带宽,大部分是静态的,低CPU成本的内容。 p>

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

另一个原因可能是因为图像不是系统上的静态内容,而是

的请求
GET images/Brett.jpg HTTP/1.1

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

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

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

我理解你希望的内容,通过网络数据包检查覆盖NAT规则并将其发送到另一台服务器 - 我从未见过任何可以做到这一点的事情。

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

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

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

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


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

但我宁愿自己开头。