如何改进 NGINX 配置文件节省带宽?

如何改进 NGINX 配置文件节省带宽?

May 24, 2020
Nginx

2014年,Admiral William H. McRaven 在得克萨斯大学发表了著名的演讲,他说,如果你想改变世界,就从整理床铺开始。有时候小事情会有很大的影响——不管是在早上整理床铺,还是对网站的HTTP服务器配置做一些更改。

这是不是有点言过其实了?2020年的头几个月,我们对世界上正常和合理的事物的所有定义都付之东流。由于COVID-19大流行,地球上几乎一半的人口被锁在家里,互联网已经成为他们唯一的交流、娱乐、购买食物、工作和教育方式。每周互联网的网络流量和服务器负载都比以往任何时候都要高。根据BroadbandNow在3月25日发表的一份报告,“在我们分析的200个城市中,有88个(44%)在过去一周内,相比之前的十周,经历了某种程度的网络退化”。

为了保护网络链接,Netflix 和 YouTube 等主要媒体平台正在限制其传输质量,为人们工作、与家人交流或在学校上虚拟课程提供更多带宽。但这仍然不够,因为网络质量逐渐恶化,许多服务器变得过载。

你可以通过优化你的网站来提供帮助

如果您拥有一个网站并可以管理其HTTP服务器配置,则可以提供帮助。一些小的更改可以减少用户生成的网络带宽和服务器上的负载。这是一个双赢的局面:如果你的网站目前负载很重,你可以减少它,使你能够为更多的用户服务,并可能降低你的成本。如果不是在高负载下,更快的加载可以改善用户的体验(有时会对你在谷歌搜索结果中的位置产生积极影响)。

如果你有一个每月拥有数百万用户的应用程序,或者一个有烤菜谱的小博客,那就没什么关系了——每千字节的网络流量,你就消除了那些迫切需要在线检查医疗检测结果或创建包裹标签以向亲属发送重要信息的人的空闲容量。

在这个博客中,我们提供了一些简单但强大的更改,您可以对您的 NGINX 配置。作为一个真实世界的例子,我们使用了 Rogalove 的朋友的电子商务网站,Rogalove 是一家位于波兰的生态化妆品制造商。该网站是一个相当标准的 woomerce 安装,运行 NGINX 1.15.9 作为其web服务器。为了便于我们的计算,我们假设网站每天有100个独立用户,30%的用户是经常访问的,每个用户在会话期间平均访问4个页面。

这些技巧是您可以立即采取的简单步骤,以提高性能和减少网络带宽。如果要处理大量流量,可能需要实现更复杂的更改以产生重大影响,例如调整操作系统和 NGINX、提供正确的硬件容量,以及(最重要的)启用和调整缓存。查看以下博客文章了解详细信息:

为HTML、CSS和JavaScript文件启用Gzip压缩

如您所知,用于在现代网站上构建页面的HTML、CSS和JavaScript文件可能非常庞大。在大多数情况下,web服务器可以动态压缩这些和其他文本文件,以节省网络带宽。

查看web服务器是否正在压缩文件的一种方法是使用浏览器的开发工具。对于许多浏览器,可以使用F12键访问工具,相关信息位于“网络”选项卡上。下面是一个例子:

正如您在左下角看到的,没有压缩:文本文件的大小为1.15 MB,并且传输了这么多数据。

默认情况下,NGINX 中禁用压缩,但根据安装或Linux发行版的不同,可以在默认的 nginx.conf 文件中启用某些设置。在这里,我们在 NGINX 配置文件中启用 gzip 压缩:

gzip on;
gzip_types application/xml application/json text/css text/javascript application/javascript;
gzip_vary on;
gzip_comp_level 6;
gzip_min_length 500;

正如您在下面的屏幕截图中看到的,通过压缩,数据传输仅下降到260kb,降幅约为80%!对于页面上的每个新用户,您可以节省大约917KB的数据传输。对于我们的 Woocomerce 安装,每天62MB,每月1860MB。

设置缓存头

当浏览器检索网页的文件时,它会将副本保存在本地磁盘缓存中,这样当您再次访问该网页时,它就不必从服务器重新提取该文件。每个浏览器都使用自己的逻辑来决定何时使用文件的本地副本,以及在服务器上发生更改时何时再次获取该文件。但是作为网站所有者,您可以在发送的HTTP响应中设置缓存控制和过期头,以使浏览器的缓存行为更加高效。从长远来看,不必要的HTTP请求要少得多。

一个好的开始,您可以为字体和图像设置一个很长的缓存过期时间,这些字体和图像可能不会经常更改(即使更改,它们通常也会得到一个新的文件名)。在下面的示例中,我们指示客户端浏览器将字体和图像保存在本地缓存中一个月:

location ~* \.(?:jpg|jpeg|gif|png|ico|woff2)$ {
    expires 1M;
    add_header Cache-Control "public";
}

启用 HTTP/2 协议支持

HTTP/2 是下一代网页服务协议,旨在提高网络和主机服务器的利用率。根据Google文档,它可以更快地加载页面:

由此产生的协议对网络更友好,因为与HTTP/1.x相比,使用的TCP连接更少。这意味着与其他流和存活时间更久的连接的竞争更少,进而导致可用网络容量的更好利用。

NGINX 1.9.5 及更高版本(以及 NGINX Plus R7 及更高版本)支持 HTTP/2 协议,您只需启用它😀. 为此,请在 NGINX 配置文件的 listen 指令中包含 http2 参数:

listen 443 ssl http2;

注意,在大多数情况下,还需要启用 TLS 以使用HTTP/2。

您可以使用 HTTP2.Pro 服务验证您的(或任何)站点是否支持HTTP/2:

优化日志记录

给自己准备一杯你最喜欢的饮料,舒舒服服地坐着,想想:你最后一次查看访问日志文件是什么时候?上周,上个月,从来没有?即使您将它用于站点的日常监视,您可能只关注错误(400500 状态代码,等等),而不是成功的请求。

通过减少或消除不必要的日志记录,可以节省服务器上的磁盘存储、CPU和I/O操作。这不仅使您的服务器更快—如果您部署在云环境中,释放的I/O吞吐量和CPU周期可以更好地服务驻留在同一物理机上的另一个虚拟机或应用程序。

有几种不同的方法可以减少和优化日志记录。在这里我们强调三点。

方法1:禁用页面资源请求的日志记录

如果不需要记录检索普通页面资源(如图像、JavaScript文件和CSS文件)的请求,这是一个快速而简单的解决方案。您只需创建一个与这些文件类型匹配的新位置块,并禁用其中的日志记录。(您也可以将此访问日志指令添加到上面设置缓存控制头的位置块中。)

location ~* \.(?:jpg|jpeg|gif|png|ico|woff2|js|css)$ {
    access_log off;
}

方法2:禁用成功请求的日志记录

这是一个更强大的方法,因为它放弃了带有2xx3xx响应代码的查询,只记录错误。它比方法1稍微复杂一些,因为它取决于NGINX日志的配置方式。在我们的例子中,我们使用包含在Ubuntu服务器发行版中的标准nginx.conf文件,因此不管虚拟主机是什么,所有请求都会记录到/var/log/nginx/access.log.

使用官方NGINX文档中的一个示例,我们打开条件日志记录。创建一个变量$loggable,对于带有2xx3xx响应代码的请求,将其设置为0,否则设置为1。然后在access_log指令中将此变量作为条件引用。

下面是位于 /etc/nginx/nginx.conf 文件中的 http 上下文的的原始指令:

access_log /var/log/nginx/access.log;

添加一个映射块并从 access_log 指令中引用它:

map $status $loggable {
    ~^[23] 0;
    default 1;
}

access_log /var/log/nginx/access.log combined if=$loggable;

注意,尽管 combined 是默认的日志格式,但是在包含 if 参数时需要显式地指定它。

方法3:使用缓冲以减少I/O操作

即使要记录所有请求,也可以通过打开访问日志缓冲来减少I/O操作。使用此指令,NGINX 将暂时不将日志数据写入磁盘,直到512KB缓冲区被填满或自上次刷新以来已过1分钟(以先发生者为准)。

access_log /var/log/nginx/access.log combined buffer=512k flush=1m;

限制特定URL的带宽

如果您的服务器提供了较大的文件(或较小但非常流行的文件,如表单或报表),则设置客户端下载这些文件的最大速度可能会很有用。如果您的站点已经处于高网络负载,限制下载速度会留下更多带宽,以保持应用程序的关键部分响应。这是硬件制造商使用的一个非常流行的解决方案-虽然有成千上万的其他人同时下载,您仍然可以获得您的下载,只是您可能需要等待更长的时间才能为打印机下载3GB驱动程序。😉

使用 limit_rate 指令来限制特定URL的带宽。在这里,我们将每个文件在/download 下的传输速率限制为每秒50kb。

location /download/ {
    limit_rate 50k;
}

您可能还希望只对较大的文件进行速率限制,可以使用 limit-rate-after 指令执行此操作。在本例中,每个文件(从任何目录)的前500kb传输没有速度限制,之后的所有文件都限制在50kb/s。这样可以加快网站关键部分的传输速度,同时减慢其他部分的传输速度。

location / {
    limit_rate_after 500k;
    limit_rate 50k;
}

请注意,速率限制适用于浏览器和 NGINX 之间的各个HTTP连接,因此不要阻止用户使用下载管理器绕过速率限制。

最后,还可以限制到服务器的并发连接数或请求速率。有关详细信息,请参阅我们的文档

总结

我们希望这五个技巧有助于优化您的网站的性能。速度和带宽增益因网站而异。即使优化 NGINX 配置似乎并没有显著地释放带宽或提高速度,数千个网站单独调整 NGINX 配置的总体影响也会增加。我们的全球网络使用效率更高,这意味着在需要时提供最关键的服务。

如果您在您的网站上对 NGINX 有任何问题,我们将提供帮助!在COVID-19大流行期间,NGINX 员工和社区正在监视 Stackoverflow 网站上的 Nginx 板块,并尽快响应问题和请求。

如果您在流行病前线的组织工作,并且有高级需求,那么您可以获得最多5个免费的NGINX Plus许可证以及更高级别的F5 DNS负载平衡器云服务。有关详细信息,请参阅受COVID-19影响的网站的免费资源

还可以查看上述链接,了解其他简单的方法,使用NGINX和F5的免费资源来提高网站性能。

译文来源