如何在速度较慢的家庭互联网连接上每天为超过10万个网页提供服务

2020-05-08 14:14:31

运行网站最便宜的方式是通过您已经拥有的家庭互联网连接。它基本上是免费的,如果你在一台非常低功耗的计算机上托管你的网站,比如一台树莓PI。这种方法的问题是,家庭互联网连接上的上传带宽通常非常有限,因此您的网站可能偶尔会在高流量期间错过潜在的流量。出于这个原因,也因为从你实际拥有的计算机上托管网站会带来令人头疼的问题,传统的看法是,你不应该从家里的服务器上托管网站。然而,即使在许多低带宽的家庭互联网连接上,也有捕获高流量峰值的方法。让我们看几个数字。在美国,人们可以获得的互联网服务类型因地而异。因此,许多美国人被困在不利于托管家庭网络服务器的家庭互联网连接上。让我们假设您唯一的选择是AT&;T&T;的12Mbit/s DSL服务,其上传速度在每秒64KBytes/s到12KBytes/s(512Kbit/s到1Mbit/s之间)之间波动。这意味着扣除与连接相关的开销后,您的平均数据上传速度仅为90KBytes/s。现在,假设您的网站是一个相当一般的博客,每月访问量约为3000次,页面浏览量约为6000次。在90Kb/s的连接上,您的Web服务器在正常情况下处理这种流量应该完全没有问题。

然而,在极少数情况下,你在社交媒体上发布了那篇黄金文章,这篇文章迅速走红,想要阅读的人比往常多得多。让我们假设每个读者从您的服务器访问一篇特定的文章平均需要2.16秒。这意味着它在24小时内只能被阅读大约4万次。由于一些因素,事情变得稍微复杂了一些,其中包括读者不会源源不断地涌入的事实。但是,让我们说,对于这个假设的场景,这对你来说是最好的情况,读者确实是相当稳定的。假设有7万人在你发帖后的第一天就试图阅读这篇文章。这意味着在第一天的流量高峰期间,30,000名读者将无法阅读你的文章。由于你的网站每年通常只有大约72,000页浏览量,在一天的流量高峰期间错过了30,000页浏览量意味着你失去了一年中很大一部分潜在读者。

不过,现在不要放弃希望。有一些方法可以捕捉到这些罕见的流量高峰。既然你不能提高上传速度,也不能告诉你的读者等到明天再阅读你的文章,你通常只有两个可行的选择可以在短时间内将你的文章发送给更多的读者:1)减少必须上传的数据量,2)最大限度地提高服务器实际传输数据的时间百分比,而不是做其他事情,比如连接到访问者的浏览器,SSL握手,等待访问者的浏览器进行下一次数据传输。

在我们进入细节之前,让我先大致谈谈当访问者在他的浏览器中打开您的网页时会发生什么。我将只给出概括性的说明,因为我们真正关心的只是事件的链条以及如何提高每个事件的速度。首先,访问者的浏览器查询DNS服务器以获取您网站的IP地址。然后,他的浏览器连接到您的Web服务器,并就他的浏览器和他的计算机的特性进行基本上单向的对话。这称为页面传输的连接部分。然后,如果您的网站是HTTPS网站,将在建立将要使用的TLS协议的情况下进行SSL握手,Web服务器向其提供SSL证书,然后浏览器验证该证书是否合法。仅SSL握手就可能需要长达三分之一秒的时间。一旦浏览器信任Web服务器并建立了安全连接,就可以开始数据传输了。

网页上的数据是分阶段传输的,称为请求。在不同的请求中请求每种类型的数据。首先,访问者的浏览器请求页面的HTML文件。然后,针对HTML代码中引用的每个文件,一次发送一个请求。可以在HTML代码中引用的文件示例有CSS数据文件、图片文件、视频文件、声音文件和收藏夹图标文件。如果您的网页包含50张图片,则访问者的浏览器必须发出50个请求才能获取全部50张图片。

每次请求后,浏览器都会等待Web服务器接收请求并开始发回数据。数据传输开始到达浏览器总是需要一定的等待时间。取决于与

你在创建网页时可能会犯很多类型的错误,所以我不会在这里一一列举。谷歌网页控制台和网页加载速度测试器,如Pingdom网站速度测试,会查找你网页上的错误,并向你显示他们发现的任何错误。要提高网页的加载速度,您需要做的第一件事就是消除所有这些错误。

静态网页通常比动态网页加载快得多,并且需要更少的带宽。原因之一是静态页面不需要将JavaScript发送到访问者的浏览器。如果您必须包含一些动态内容,请考虑使用在您的服务器上运行的PHP代码,而不是访问者的计算机。但请记住,您在服务器上运行的代码越多,您的服务器就必须越强大,而电力的增加意味着电力成本的增加。如果你有一个低带宽的互联网连接,并且不想有高电费,你应该忘记你的网页上的动画。忘掉数据库程序吧。忘掉在网页中运行的非常简单的代码之外的任何事情。如今,你在互联网上看到的大多数令人眼花缭乱的东西都是通过高速互联网连接由服务器提供的,每个服务器的成本高达数千美元,这些服务器属于大公司,这些公司有能力支付这些服务器的费用和运行这些服务器的电费。不幸的是,您可能找到的关于开发网站的最佳方法的几乎所有信息都是关于这些类型的网站的。不要落入认为这些是你唯一可以建立的网站类型的陷阱。

如果您一定要包含一些动态内容,请仔细考虑将其最小化的方法。例如,与其编写完整的分析包,不如编写您自己的PHP代码,它只会统计页面的访问次数。与其运行一些需要您运行数据库程序的商业访问者注释代码,不如编写您自己的更小、更快的代码。或者,使用Babbleweb进行访问者评论。此外,在某篇文章累积了20或30条评论后,可以考虑禁用评论。

减少服务器必须上载的每个网页的数据量可以显著提高页面加载速度。例如,在90KByte/s的Internet连接上,从一页上的三张500KB图片到一张50KB图片可以节省16秒以上。即使通过更简洁地编写或将一篇长文章拆分成两篇或更短的文章来减少HTML文本的数量也会有所帮助。而且,如果CSS代码与HTML代码位于不同的文件中,则应该清理CSS代码以删除任何不再使用的内容,并最大限度地减少注释数量。不用说,与以音频或视频文件格式呈现的相同信息相比,文本文件上载所需的时间要短得多。

不要忘记使用图片文件格式来最小化图片的文件大小。你应该尝试像Picresize和Compress.io这样的网站,看看你能得到多少压缩,并且仍然有图片不会影响你网站的整体外观。

正如本文的引言所指出的,访问者的浏览器为获取网页的全部内容而必须发出的请求数量会对页面加载时间产生很大影响。因此,最大限度地减少网页中包含的不必要图片和其他类型数据的数量是值得的。还可以考虑将CSS代码放在HTML文件中,而不是放在单独的文件中。将CSS代码放在由多个HTML文件使用的单独文件中可以更轻松地更改网站的外观,但这也意味着必须为包含该CSS文件的每个网页发出额外的请求。

任何试图通过HTTP访问您网站上的页面并且必须转移到HTTPS页面的访问者都会接受额外的请求。想办法把这种情况发生的次数降到最低。说到HTTP与HTTPS的对比,似乎没有人提到为增加HTTPS的安全性而付出的代价是增加带宽和CPU需求。仅SSL握手就可以将页面加载时间增加四分之一秒以上。

大多数网络服务器可以在将内容上传到访问者浏览器之前自动压缩内容。这可以将HTML和CSS代码必须上载的数据量减少50%到70%。据我所知,压缩不会占用很多CPU资源。我还注意到,当一个动态网页接收大量流量时,Lighttpd Web服务器似乎会将动态压缩的页面保存在RAM中一段时间,这样它就不必在每次上传之前重新压缩该页面了。我还注意到,当一个动态网页接收到大量流量时,Lighttpd Web服务器似乎会将该动态压缩的页面保存在RAM中一段时间,因此它不必在每次上传之前重新压缩该页面。静态网页只压缩一次,无论上传多少次。

您应该先压缩图片文件,然后再将其包含在网页中。因此,要求您的服务器再次压缩图片并不会显著减小它们的文件大小。这只会增加您的CPU需求。所以,你应该告诉你的网络服务器不要压缩图片。

不使用商业网站开发软件几乎与互联网上其他人告诉你的一切背道而驰。然而,对于低带宽的互联网连接来说,这是正确的做法。为了说明我的观点,我从马特·穆伦韦格(Matt Mullenweg)在Wordpress上运行的博客中选择了这个网页。我之所以选择这个网页,是因为它大部分是文字,只有几张图片,没有广告。读者可以看到这个页面有9669字节的文本,但是由于Wordpress的帮助,HTML文件包含了144591字节的HTML代码!为了进行比较,我从我的网站上选择了这篇文章,这篇文章是我自己用HTML编写的。它只有一张图片,没有广告。读者可以看到9698字节的文本,而Html文件只包含15074字节的代码。这大约是马特文章中代码的十分之一!如果我真的想要的话,我很可能会把它减少到12000字节以下。顺便说一下,我的HTML文件中还包含一个3105字节的CSS文件。马特的HTML文件包括三个CSS文件,我没有费心去找它们的大小。

现在,让我们来看看让Wordpress创建您的HTML代码的成本。通过90KB/s的互联网连接上传我文章中的15074字节的HTML码所需的时间是0.167秒。通过相同的互联网连接上传马特·穆伦韦格的HTML码的时间为1.607秒。HTML代码通常在发送给阅读器之前被压缩,因此时间差不会那么大,但仍然很重要。

根据https://tools.pingdom.com,仅加载我文章中压缩的HTML部分、相关的压缩css文件和一个小的收藏夹图标文件(稍作调整以模拟90KB/s连接)的平均时间为0.496秒,其中0.076秒是由于上传我的已压缩到6.8KB的HTML文件。假设马特的文章以同样的比例压缩,仅他文章的超文本标记语言代码就需要大约(0.496-0.076+(6.815.1)*1.144/90)=1.144秒才能在读者的浏览器中显示出来。这意味着,在不考虑嵌入图片的情况下,我的文章(1.144/0.496=2.31)中约有2.3%的内容可以在与马特的文章相同的时间内上传给读者。因此,通过一个可以上传90KBytes/s的互联网连接,读者每天大约可以看到马特文章的纯文本部分约76000次,而我的文章的纯文本部分每天约有174000次。换句话说,我的文章每天的浏览量比马特多98000次。对于一个小网站来说,这98000额外的页面浏览量可能是一年流量的很大一部分。因此,即使使用HTML代码压缩,编写您自己的HTML代码仍然是值得的。

请注意,我简化了我的分析,没有考虑到许多同时请求页面的访问者可能会因为网页的并行交付而获得的轻微改善。然而,我的网页每天的阅读量比马特的多几万人,这一基本事实仍然是正确的。

对于典型的网页,图片文件通常比HTML文件包含更多的数据,因此在带宽方面,在Web服务器之外的其他地方托管图片是非常有益的。您可以将图片移动到CDN(内容分发网络)。然后,网页的HTML文件将具有指向CDN上的图片的链接,而不是指向Web服务器上的图片的链接。对于那些不想依赖CDN永久托管部分内容的人来说,还有另一种方法。大多数流量高峰发生在社交媒体上发布新文章的第一周内。因此,您可能只需要在发布新文章后的第一周将图片放在CDN上。在那之后,你可以把你的照片放到你自己的网络服务器上。对于小型网站,CDN可能会根据托管的内容数量(而不是下载数量)收费,因此一次只托管几张图片可能意味着您使用CDN服务只需支付很少的费用,甚至是免费的。

以下是我建议的七种方法,用于捕获您的Web服务器上可能偶尔出现的峰值流量峰值:

通过使用这些方法,您可以将您的Web服务器在低带宽家庭Internet连接上可以处理的峰值流量增加到原来的四倍、五倍甚至更多。这可以让你继续在家中免费托管你的网站,即使你的网站偶尔会出现流量高峰,每天的浏览量超过10万次。

如果你觉得这篇文章值得,请把它分享到你最喜欢的社交媒体上。你会在页面顶部找到链接。