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

本文翻译转载自nginx官网,原文地址javascript

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

如你所知,用于在现代网站上构建页面的HTMLCSSJavaScript文件可能很是庞大。在大多数状况下,Web服务器能够即时压缩这些和其余文本文件,以节省网络带宽。css

查看Web服务器是否正在压缩文件的一种方法是使用浏览器的开发人员工具。对于许多浏览器,你可使用F12键访问这些工具,而且相关信息位于Network 选项卡上。这是一个例子:html

img

如你在左下方所见,没有压缩:文本文件的大小为1.15 MB,而且传输了不少数据。java

默认状况下,NGINX中禁用压缩,可是根据你的安装或Linux发行版,某些设置可能会在默认的nginx.conf文件中启用。在这里,咱们在NGINX配置文件中启用gzip压缩:nginx

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安装,天天62 MB,或每个月1860 MB。web

img

二、设置缓存头

当浏览器检索网页的文件时,它会将副本保留在本地磁盘缓存中,这样,当你再次访问该页面时,它没必要从服务器从新获取文件。每一个浏览器都使用本身的逻辑来决定什么时候使用文件的本地副本以及什么时候在服务器上更改了文件时再次获取它。可是,做为网站全部者,你能够在发送的HTTP响应中设置缓存控制和过时标头,以提升浏览器的缓存行为的效率。从长远来看,你会收到不少没必要要的HTTP请求。json

首先,你能够为字体和图像设置较长的缓存过时时间,这些字体和图像可能不会常常更改(即便更改,它们一般也会得到新的文件名)。在如下示例中,咱们指示客户端浏览器将字体和图像在本地缓存中保留一个月:浏览器

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配置文件中http2listen指令中包含参数:

listen 443 ssl http2;
复制代码

请注意,在大多数状况下,你还须要启用TLS才能使用HTTP / 2。

你能够经过HTTP2.Pro服务验证你(或任何站点)是否支持HTTP / 2 :

在这里插入图片描述

四、优化日志

让本身喝一杯本身喜欢的饮料,温馨地坐着,而后思考:你上次查看访问日志文件是何时?上周,上个月,历来没有?即便将其用于站点的平常监视,你也可能只关注错误(400500状态代码等),而不关注成功的请求。

经过减小或消除没必要要的日志记录,能够节省服务器上的磁盘存储,CPU和I / O操做。这不只使你的服务器更快一点-若是将你部署在云环境中,则释放的I / O吞吐量和CPU周期可能为同一虚拟机上的其余虚拟机或应用程序节省生命。

有几种不一样的方法能够减小和优化日志记录。在这里,咱们重点介绍三个。

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

若是你不须要记录检索普通页面资源(例如图像,JavaScript文件和CSS文件)的请求,则这是一种快速简便的解决方案。你须要作的就是建立一个location与这些文件类型匹配的新块,并禁用其中的日志记录。(你也能够将此access_log指令添加到咱们设置标头的上方location块中。)Cache-Control

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

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

这是一种更强大的方法,由于它会丢弃带有或响应代码的查询,仅记录错误。它比方法1稍微复杂一点,由于它取决于如何配置NGINX日志记录。在咱们的示例中,咱们使用Ubuntu Server发行版中包含的标准nginx.conf,所以,不管虚拟主机如何,全部请求都记录到**/var/log/nginx/access.log中**。2*xx*``3*xx*

使用官方NGINX文档中的示例,让咱们打开条件日志记录。建立一个变量$loggable,并将其设置为,0以使用和代码进行请求,不然设置为 。而后在指令中将此变量做为条件引用。2*xx*``3*xx*``1``access_log

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

access_log /var/log/nginx/access.log;
复制代码

添加一个map块并从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会等待将日志数据写入磁盘,直到填满512 KB缓冲区或自上次刷新以来通过1分钟(以先发生者为准)。

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

五、限制特定URL的带宽

若是服务器提供较大的文件(或较小但很是受欢迎的文件,例如表单或报表),则设置客户端下载文件的最大速度可能颇有用。若是你的站点已经承受了很高的网络负载,则限制下载速度会留下更多带宽,以使应用程序的关键部分保持响应速度。这是硬件制造商使用的很是流行的解决方案–你可能须要等待更长的时间才能为打印机下载3 GB的驱动程序,可是同时有成千上万的其余人下载你仍然能够下载。

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

location /download/ {
    limit_rate 50k;
}
复制代码

你可能还但愿仅对较大的文件进行速率限制,这可使用limit_rate_after指令进行。在此示例中,每一个文件(来自任何目录)的前500 KB都不受速度限制地进行传输,以后的全部内容均以50 KB / s为上限。这样能够加快网站关键部分的交付速度,同时下降其余部分的速度。

location / {
    limit_rate_after 500k;
    limit_rate 50k;
}
复制代码

请注意,速率限制适用于浏览器和NGINX之间的单个HTTP链接,所以请不要阻止用户使用下载管理器来解决速率限制。

最后,你还能够限制到服务器的并发链接数或请求速率。有关详细信息,请参见咱们的文档