从另一个主机名提供图像与 Apache 重写过载

从另一个主机名提供图像与 Apache 重写过载

我们正在尝试进一步提高一些使用较旧 HTML 的网站的速度,以便获得更好的 SEO 结果。我们现在已经应用了一些最小化措施,结合了 html、css 等。我们使用一个小型虚拟化基础设施,我们一直想使用轻量级 + 标准 http 服务器配置,这样第一个可以提供图像和静态内容,而另一个可以提供 php、重写等。我们现在可以使用虚拟机轻松做到这一点,使用与 apache 上的 vhosts(绑定挂载)相同的文件和配置,但几乎不加载任何模块。这意味着轻量级 httpd 将具有更小的指纹,这将使我们能够提供更多更快的服务,运行更多的 minSpareServer 等。

因此,由于浏览器也可以从不同的主机名加载静态内容,我们考虑在主服务器(main.com)上构建重写规则,以将所有图像和 css *.jpg、*.gif、*.css 等“重定向”到相同的服务器,比如 cdn.main.com,这样浏览器就可以拥有更多的连接。

问题是,假设我们已经有一套非常复杂的重写规则(我们手动操作许多旧 URL 以进行 SEO),它是否值得?

我的意思是,主 apache 的额外负载是否必须将 main.com/image.jpg 重定向(我理解我们必须执行 301)到 cdn.main.com/image.jpg + 然后 cdn.main.com 必须为其提供服务,这会大于我们在浏览器上存档的收益吗?

页面上所有图片的 301 排名超出范围会被谷歌惩罚吗?

大公司是如何解决这个问题的,原始代码是否已经包含从 cdn 链接的具有绝对路径的图像?

编辑 澄清一下,我们关心的不是服务器性能或带宽。我们显然可以使用外部 CDN 服务器,但我们有足够的 CPU 和带宽。

我们关心的是如何让拥有大量半静态 HTML 内容的“旧”网站受益于通过 apache 分割图像和静态内容的连接,而不必将 html 更改为绝对路径(即将 image.jpg 更改为 cdn.main.com/image.jpg 发生在服务器上而不是代码上)

答案1

将 main.com/image.jpg 重定向(我知道我们必须执行 301)到 cdn.main.com/image.jpg

这是一个坏主意,不要这么做。

你的问题太长了,有点让人难以理解。据我所知,你担心的是服务器负载,而不是网站为最终用户加载的速度。

如果您担心服务器容量,请执行以下操作:

  • 获得更大的服务器或
  • 在 HTTP 服务器(Squid、Varnish、Apache Traffic Server)前面使用 RAM 代理服务器或
  • 使用廉价的内容分发网络将您的静态内容缓存到更靠近最终用户的位置,从而减少页面加载时间和服务器负载。

从而使浏览器能够拥有更多的连接。

浏览器并行下载限制有点像是转移注意力的噱头——现代浏览器从同一主机名并行下载 6-8 个文件。只有旧版浏览器(IE6、IE7)才真正受到此限制。

如果您担心最终用户的页面加载速度,那么请使用 CDN,这在您的用户分布在广阔的地理区域(即您拥有全球受众)的所有情况下都是一个好建议。

页面上所有图片的 301 都会被谷歌惩罚吗?

有可能。但更有可能的是,它会被用户讨厌。对于每个图片请求,您首先提供 301,然后从另一个 URL 提供正确的图片。这意味着每张图片都要往返服务器 2 次,因此用户的页面加载时间会显著延长。

答案2

过去几周,我在公司也遇到了类似的问题。以下几点需要注意:

  1. 浏览器的多个域名:这是一个需要调整的微妙界限。一方面,浏览器对从同一域名同时加载的资源数量有限制(在这方面,加载的域名越多越好)。另一方面,您调用的每个域名都需要进行 DNS 查找,这可能会影响加载速度。我自己一直使用 5 个不同域名的经验法则。
  2. 接下来,如果我没有看错你的描述(我还在喝咖啡,所以可能没有看错),你仍然会向“main.com”发出初始请求,并让“重型”apache 重定向到“轻型”apache。这根本帮不了你。如果你选择这条路,最好将“main.com”设置为轻型 apache,并让它反向代理任何非静态内容到‘重型’ apache。
  3. 然而,2 号并没有充分利用“多域”的改进,因为所有请求都是通过域推送的主页。所以我们所做的就是设置一个域(按照您的示例名称)cdn.main.com作为“轻量级”Apache,并让其在内部重定向到适当的资源。您可以查看mod_cache还。

答案3

通常情况下,获得另一台每月可用带宽为 20TB 的服务器的成本比 CDN 对相同流量收取的费用要低得多(好吧,由于 CDN 的普及,速度可能会更快,但无论如何它并不便宜)

无论如何,我正在尝试以下设置(如果您认为我这里可能有错误,请对此发表评论)

服务器地址运行所有 php/mysql 内容并提供所有静态文件(图像、css 等)静态服务器。(我已将所有基本 URL 地址设置为变量,以便我可以随意更改它们)在静态服务器将有一个重写规则来检查图像是否存在于本地,如果不存在,则将其从服务器地址通过 shell 脚本/scp/rsync 命令。然后,下次需要时,它已经在那里了。因此,该特定图像/文件不需要第二条重写规则。您始终可以选择只更改保存静态内容路径的一个变量,然后再次从主服务器提供所有内容。图像也会在那里。

这样,图像调用将直接转到我的静态服务器,而所有其他内容将转到 php/mysql 服务器。如果您不在静态服务器上运行任何 php,则进程不会变得很大,因此您可以并行运行更多服务器来提供图像,并且不会占用主计算机的带宽。

如果您发现静态服务器上浪费了大量的 CPU,您也可以将 mysql 移到那里,这样就可以平衡两者之间的负载。

对于上面的例子,你可以看看这个(几乎是一样的:)

http://mrphp.com.au/code/image-cache-using-phpthumb-and-modrewrite

编辑:我说的是在这里使用两个独立的服务器(并且在 mysql 运行在另一台服务器上的情况下,物理位置足够接近)


我应该在上面补充的另一件事是,你可以在静态服务器指向您想要的任何服务器。(甚至与应用程序的其余部分相同)。因此,您可以将静态内容的地址硬编码为例如static.server.com/image1.jpg。应用上述解决方案只需要设置 DNS 条目以将 static.server.com 域指向您的缓存机器。,

相关内容