为什么诸如Facebook,Twitter和Google之类的网站将其图像和CSS托管在外部域上,例如:


Facebook:static.ak.fbcdn.net

Twitter:a0.twimg.com

Google:ssl.gstatic.com


问题:




是性能吗?还是安全性?


#1 楼

@toomanyairmiles是部分正确的-此技术的目的是允许从Web浏览器到服务器的并行连接。 Web浏览器应允许到一个主机的最少两个同时连接,但是许多新的浏览器最多可以管理60个。无论如何,浏览器与Web服务器之间的并发同时连接是主要的速度瓶颈。
从Google的资源:HTTP 1.1规范(第8.1.4节)规定,浏览器每个主机名最多应允许两个并发连接(尽管较新的浏览器允许更多的并发连接:请参阅Browserscope以获得列表)。如果HTML文档所包含的对资源的引用(例如CSS,JavaScript,图像等)超过一台主机上允许的最大引用数,则浏览器会发出对该数量资源的请求,并将其余资源排入队列。一旦某些请求完成,浏览器就会发出对队列中下一个资源数量的请求。重复该过程,直到下载了所有资源。换句话说,如果页面从单个主机引用的X个外部资源超过X个,其中X是每个主机允许的最大连接数,则浏览器必须顺序下载它们,一次X个,每X个资源产生1个RTT。总往返时间为N / X,其中N是要从主机获取的资源数。例如,如果浏览器每个主机名允许4个并发连接,并且页面引用同一域上的100个资源,则每4个资源将产生1个RTT,总下载时间为25个RTT。

因此,解决此问题的方法是将请求“分片”到不同的域或主机:
再次从相同的Google资源:

在主机名之间平衡可并行化资源。
可以并行处理对大多数静态资源的请求,包括图像,CSS和其他二进制对象。尽可能在主机名之间平衡对所有这些对象的请求。如果不可能,作为经验法则,请尝试确保没有一台主机的服务比所有主机的平均服务多50%。因此,例如,如果您有40个资源和4个主机,则理想情况下,每个主机应提供10个资源。在最坏的情况下,没有主机可以提供超过15个资源。如果您有100个资源和4个主机,则每个主机应提供25个资源;没有人可以提供38个以上的服务。

但是,还有一个难题。每个请求通常带有其自己的开销,通常以cookie的形式。静态元素(例如图像,CSS和JavaScript)不需要传输Cookie数据,因此从无Cookie的(子)域提供它们可以提高往返速度:

静态内容(例如图像, JS和CSS文件不需要附带Cookie,因为用户无需与这些资源进行交互。您可以通过不提供Cookie的域提供静态资源来减少请求延迟。对于引用大量很少缓存的静态内容(例如,频繁更改的图像缩略图或不经常访问的图像档案)的页面,此技术特别有用。对于任何提供5种以上静态资源的页面,我们建议使用此技术。 (对于服务于此资源较少的页面,不值得设置额外的域。)
要保留无cookie的域来提供静态内容,请注册一个新的域名并配置DNS具有CNAME记录的数据库
,该记录将新域指向您现有的域A记录。配置您的Web服务器以提供来自新域的静态资源,并且
不允许在此域的任何位置设置任何cookie。在您的网页
页面中,在URL中引用静态资源的域名。


#2 楼

过去,Web浏览器一次只能下载两个项目(现在为6个或更多),因此从各个域下载资源比单个域下载速度更快。这适用于从图像到JavaScript的所有内容。

许多公司还使用CDN,该工具可确保最终用户从地理位置上接近他们的服务器上获取数据,并通过减少资源请求的往返时间来提高站点性能。 br />

#3 楼

大型站点会将其静态内容(图像,JS和CSS文件)移动到Content Delivery Network或CDN,因为在多个地理位置分散的服务器上部署内容将使用户的页面加载速度更快。

由于CDN具有不同的域名,因此它还提供了域分片的好处。

#4 楼

2项限制不再是问题。虽然这是HTTP规范的建议,但所有现代浏览器都至少允许6个并发连接。

#5 楼

对于使用外部域名未设置任何Cookie的情况下发送到标头的不良cookie仍需要这样做,因此加载内容的速度要快得多。

所以是的,出于速度目的,仍然需要它。

评论


接受的答案已经表明,没有为外部域发送Cookie。这个答案没有说其他答案尚未涵盖的任何内容。

–斯蒂芬·奥斯特米勒(Stephen Ostermiller)
19年4月8日在18:18