5

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

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

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

感谢您提供有关执行此操作的最佳方法的任何建议。

- 更新 -

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

4

2 回答 2

3

你能做的越远越好。

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

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

-更新-

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

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

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

于 2008-12-16T18:18:52.370 回答
1

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

<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

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

我真的不知道该怎么做。


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

这就引出了一个问题,即您实际上要保存什么。无论哪个内部 Web 服务器为 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 规则并将其发送到另一台服务器 - 我从未见过任何可以做到这一点的事情。

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

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

一位“安全顾问”坚持认为解决方案中的痛苦,显然他相信通过默默无闻来确保安全

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


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

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

于 2008-12-16T18:39:44.343 回答