为动态网站使用 CDN
Employing a CDN for a dynamic website
我有一个网站论坛,用户可以在主页上互相交换照片和文字。主页显示 20 个最新对象 - 无论是照片还是文本。第 21 个物体被推出视线之外。每 5 秒上传一张新照片。每秒发布一个新的文本字符串。大约 20 秒后,出现在顶部的照片在底部消失了。
我的问题是:如果我在组合中引入 CDN,是否会提高性能?
既然内容在变化,看来我不应该这样做。但是,当我从逻辑上考虑时,似乎我会通过为我的照片引入 CDN 来提高性能。这是如何做。假设一张照片被发布,在 t=1 时出现在页面上并一直保留到 t=20。第一个访问该页面的人(接近 t=1)将使照片能够被拉到边缘服务器。此后,任何访问照片的人都将从 CDN 接收照片;这将持续到 t=20,之后照片消失。这是名副其实的性能提升。
任何人都可以评论我推理中的缺陷,and/or我没有考虑到什么?也很高兴知道我可以为像我这样的网站做哪些替代性能优化。提前致谢。
你说得对。只要有人在图像在视图中的 20 秒内访问照片,它就会被拉到边缘服务器。然后根据后续请求,其他访问者将从最近的边缘服务器收到缓存的响应。
只要您使用 CDN 仅传送静态资产,您的设置应该没有问题。
此外,您可能需要查看支持 HTTP/2 的 CDN。这将为您提供改进的性能。查看 cdncomparison.com 比较流行的 CDN 提供商。
您需要考虑 所有 请求到达您的服务器,其中包括主要动态生成的 HTML 文档,但也包括所有静态资产,如 CSS 文件, Javascript 文件,是的,还有图像文件(包括静态内容和用户上传的内容)。 HTML 文档将引用其他几个资产,每个资产都需要单独下载,因此会导致服务器命中。假设每个访问者都有一个空的本地缓存,单个页面加载可能会为您的服务器带来大约 50 次资源命中。
实际上 需要 由您的服务器处理的唯一请求可能是动态生成的 HTML 文档,如果它特定于用户(因为它们是登录)。 所有其他 49 个资源请求对所有访问者来说都是相同的,并且可以很容易地分流到 CDN。那些只会[每个区域]访问您的服务器一次,然后由 CDN 缓存并很少再打扰您的服务器。您甚至可以拥有 CDN 缓存 public HTML 文档,例如对于 non-logged 用户,您可以让 CDN 缓存 HTML 文档约 5 秒,具体取决于 up-to-date 您希望站点显示的方式;因此 CDN 可以处理整个浏览 session 而根本不会访问您的服务器。
如果您每秒大约有一个新的上传,这意味着每秒可能有更多的被动 访问者 。如果您可以让 CDN 处理大约 99% 的请求,那将 戏剧性地 减少对您服务器的实际点击。如果您对缓存的内容和缓存时间以及根据匿名用户和经过身份验证的用户的特定组合很聪明,则可以轻松地将服务器负载减少一两个数量级。另一方面,您相应地加快了访问者的页面加载时间。
对于每一个 HTML 文档和其他资产,认真考虑是否可以缓存以及缓存多长时间:
对于HTML个文档,用户是否登录?如果没有,并且没有其他特定的 cookie 跟踪或类似的事情发生,那么资产是静态的并且 public 用于所有意图和目的并且可以被缓存。确定文档的最长期限并让 CDN 缓存它。当您每秒获得 1000 次点击时,即使只缓存一秒钟也会产生巨大的差异。
如果用户是登录,设置缓存pragma为private
,但仍然让访问者的浏览器缓存几秒.这些 headers 必须由您的论坛软件在生成文档时决定。
对于不受访问限制的所有其他资产:让 CDN 将其缓存 长 时间,您几乎可以忘记曾经需要服务那些特定的文件再次出现。这些 headers 可以为 Web 服务器中的整个目录静态配置。
我有一个网站论坛,用户可以在主页上互相交换照片和文字。主页显示 20 个最新对象 - 无论是照片还是文本。第 21 个物体被推出视线之外。每 5 秒上传一张新照片。每秒发布一个新的文本字符串。大约 20 秒后,出现在顶部的照片在底部消失了。
我的问题是:如果我在组合中引入 CDN,是否会提高性能?
既然内容在变化,看来我不应该这样做。但是,当我从逻辑上考虑时,似乎我会通过为我的照片引入 CDN 来提高性能。这是如何做。假设一张照片被发布,在 t=1 时出现在页面上并一直保留到 t=20。第一个访问该页面的人(接近 t=1)将使照片能够被拉到边缘服务器。此后,任何访问照片的人都将从 CDN 接收照片;这将持续到 t=20,之后照片消失。这是名副其实的性能提升。
任何人都可以评论我推理中的缺陷,and/or我没有考虑到什么?也很高兴知道我可以为像我这样的网站做哪些替代性能优化。提前致谢。
你说得对。只要有人在图像在视图中的 20 秒内访问照片,它就会被拉到边缘服务器。然后根据后续请求,其他访问者将从最近的边缘服务器收到缓存的响应。
只要您使用 CDN 仅传送静态资产,您的设置应该没有问题。
此外,您可能需要查看支持 HTTP/2 的 CDN。这将为您提供改进的性能。查看 cdncomparison.com 比较流行的 CDN 提供商。
您需要考虑 所有 请求到达您的服务器,其中包括主要动态生成的 HTML 文档,但也包括所有静态资产,如 CSS 文件, Javascript 文件,是的,还有图像文件(包括静态内容和用户上传的内容)。 HTML 文档将引用其他几个资产,每个资产都需要单独下载,因此会导致服务器命中。假设每个访问者都有一个空的本地缓存,单个页面加载可能会为您的服务器带来大约 50 次资源命中。
实际上 需要 由您的服务器处理的唯一请求可能是动态生成的 HTML 文档,如果它特定于用户(因为它们是登录)。 所有其他 49 个资源请求对所有访问者来说都是相同的,并且可以很容易地分流到 CDN。那些只会[每个区域]访问您的服务器一次,然后由 CDN 缓存并很少再打扰您的服务器。您甚至可以拥有 CDN 缓存 public HTML 文档,例如对于 non-logged 用户,您可以让 CDN 缓存 HTML 文档约 5 秒,具体取决于 up-to-date 您希望站点显示的方式;因此 CDN 可以处理整个浏览 session 而根本不会访问您的服务器。
如果您每秒大约有一个新的上传,这意味着每秒可能有更多的被动 访问者 。如果您可以让 CDN 处理大约 99% 的请求,那将 戏剧性地 减少对您服务器的实际点击。如果您对缓存的内容和缓存时间以及根据匿名用户和经过身份验证的用户的特定组合很聪明,则可以轻松地将服务器负载减少一两个数量级。另一方面,您相应地加快了访问者的页面加载时间。
对于每一个 HTML 文档和其他资产,认真考虑是否可以缓存以及缓存多长时间:
对于HTML个文档,用户是否登录?如果没有,并且没有其他特定的 cookie 跟踪或类似的事情发生,那么资产是静态的并且 public 用于所有意图和目的并且可以被缓存。确定文档的最长期限并让 CDN 缓存它。当您每秒获得 1000 次点击时,即使只缓存一秒钟也会产生巨大的差异。
如果用户是登录,设置缓存pragma为
private
,但仍然让访问者的浏览器缓存几秒.这些 headers 必须由您的论坛软件在生成文档时决定。对于不受访问限制的所有其他资产:让 CDN 将其缓存 长 时间,您几乎可以忘记曾经需要服务那些特定的文件再次出现。这些 headers 可以为 Web 服务器中的整个目录静态配置。