Nginx Config

Posted by 察说花园 on May 3, 2020

本文

https://www.nginx.com/blog/help-the-world-by-healing-your-nginx-configuration/

在2014年德克萨斯大学的著名演讲中,威廉·麦克雷文上将说,如果你想改变世界,那就从铺床开始。 有时候,小事情可能会产生很大的影响——无论是早上整理床铺,还是对网站的 HTTP 服务器配置做一些改动。

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

像 Netflix 和 YouTube 这样的主要媒体平台正在限制他们的传输质量,以保护网络链接,为人们提供更多的带宽来工作,与家人交流,或者在学校参加虚拟课程。 但这仍然是不够的,因为网络质量逐渐恶化,许多服务器成为过载。

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

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

如果你有一个每月拥有数百万用户的应用程序,或者一个有烘焙食谱的小博客,这都不重要——你消除的每千字节网络流量都会为那些迫切需要在线检查医疗检测结果或创建一个包裹标签以便向亲属发送重要信息的人释放能力。

在这个博客中,我们提出了一些简单但强大的变化,您可以使您的 NGINX 配置。 作为一个现实世界的例子,我们使用我们朋友在 Rogalove 的电子商务网站,这是一个生态化妆品制造商,就在我居住的波兰。 该网站是一个相当标准的 WooCommerce 安装 NGINX 1.15.9作为其网络服务器。 为了我们的计算,我们假设该网站每天有100个独立用户,30% 的用户是经常访问者,每个用户在一个会话期间平均访问4个网页。

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

为性能调整 NGINX

  • 性能调优-技巧与窍门
  • 应用程序性能的10个小贴士 -在裸机服务器上部署 NGINX Plus 的规模指南
  • 使用 NGINX 和 NGINX Plus 缓存指南
  • 使用 NGINX 进行微缓存的好处
  • 为 HTML、 CSS 和 JavaScript 文件启用 Gzip 压缩

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

一种检测 web 服务器是否在压缩文件的方法是使用浏览器的开发工具。 对于许多浏览器,您使用 F12键访问工具,相关信息在 Network 选项卡上。 下面是一个例子:

正如您在左下角看到的,没有压缩: 文本文件的大小为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;

正如你在下面的截图中看到的,通过压缩,数据传输下降到只有260 KB ——大约减少了80% ! 对于页面上的每个新用户,可以节省大约917 KB 的数据传输。 对于我们的 WooCommerce 安装,每天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:

优化日志记录

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

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

有几种不同的方法可以减少和优化日志记录。

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

如果您不需要记录检索普通页面资源(如图像、 JavaScript 文件和 CSS 文件)的请求,那么这是一个快速简单的解决方案。 您所需要做的就是创建一个与这些文件类型匹配的新位置块,并禁用其中的日志记录。 (您还可以将这个访问日志指令添加到我们设置 Cache-Control 头部的位置块中。)

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

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

这是一个更强大的方法,因为它丢弃了具有2xx 或3xx 响应代码的查询,只记录错误。 它比方法1稍微复杂一些,因为它取决于如何配置 NGINX 日志记录。 在我们的示例中,我们使用了 Ubuntu Server 发行版中包含的标准 nginx.conf,因此无论虚拟主机是什么,所有请求都被记录到/var/log/nginx/access.log 中。

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

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

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

添加一个 map 块并从 access log 指令中引用它:

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

注意,虽然组合是默认的日志格式,但是在包含 if 参数时需要显式地指定它。

方法3: 使用缓冲最小化 i/o 操作

即使您想记录所有请求,也可以通过打开访问日志缓冲来最小化 i/o 操作。 使用这个指令 NGINX 等待将日志数据写入磁盘,直到512 kb 的缓冲区被填满或者从最后一次刷新到现在已经过去了1分钟,以哪一个先发生为准。

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

特定 url 的带宽限制

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

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

location /download/ {
    limit_rate 50k;
}

您可能还希望仅对较大的文件进行速率限制,可以在指令之后使用限制速率。 在这个示例中,每个文件(来自任何目录)的前500 KB 都是在没有速度限制的情况下传输的,之后的所有内容都限制在50 KB/s。 这样可以更快地传递网站的关键部分,同时减慢其他部分的速度。

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

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

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

小结

我们希望这五条建议能够帮助优化你的网站性能。 速度和带宽收益因网站而异。 即使调整你的 NGINX 配置似乎并没有显著地释放带宽或提高速度,数以千计的网站单独调整他们的 NGINX 配置的总体影响加起来。 我们的全球网络得到了更有效的利用,这意味着最关键的服务可以在需要的时候提供。

如果您有任何问题与 NGINX 在您的网站,我们在这里帮助! 在 COVID-19大流行期间,NGINX 雇员和社区正在监测 Stack Overflow上的 NGINX 频道,并尽快对问题和请求作出回应。

如果你工作的组织在前线的流行病和有先进的需求,你可能有资格获得多达五个免费 NGINX Plus 许可证,以及更高层次的 F5 DNS 负载平衡云服务。 详情请参阅受 COVID-19影响的网站的免费参考资料。

同时也可以通过 NGINX 和 F5的免费资源了解其他提高网站性能的简单方法。