什么是SPDY和HTTP / 2,以及如何在Nginx上启用它们

支持Web的核心技术之一是HTTP。 不幸的是,HTTP / 1.1是为静态HTML网站设计的,最近一次更新是在1999年左右。当今的网络已经发生了很大变化。 网站越来越动态,包含很多资源。 在本教程中,我将解释什么是SPDY和HTTP / 2,以及如何在Nginx上启用它们以及如何对其进行测试。

斯派迪

Google在2009年推出了一种新的协议,称为SPDY(发音为speedy)。 SPDY在HTTP / 1.1上提供了三个关键改进。

1.头压缩

每个HTTP请求和响应的标头中都包含相当数量的数据。 标头中有很多重复的元数据(用户代理和cookie)。 HTTP / 1.1只能压缩实际内容,而不能压缩标头。 SPDY大大缩小了页眉大小。 SPDY支持为整个连接发送一次标头,而不是为每个重复的单个连接发送标头。

2.并行请求

HTTP是基于消息的协议。 建立TCP连接并发送HTTP请求后,您必须在该站点上放置站点并等待响应到达,然后才能发送下一个请求。 每个此类请求都需要在浏览器和服务器之间进行至少一次往返,这可能需要数百毫秒。 这是一个很大的延迟。 如果响应之一很慢,它将延迟所有其他请求。 这就是所谓的 行头封锁。 尽管您可以打开多个并发连接以同时发送多个请求,但是现代浏览器通常限制每个主机4〜8个并发连接。

在HTTP中,请求消息和响应消息之间的关系是隐式的。 服务器未明确表示我是对该请求的响应。 您只能将请求确定为响应,因为响应按顺序跟随该请求。

SPDY提供真正的多路复用。 使用SPDY,您可以在单个连接上发送任意数量的请求,并以任意顺序获取响应。 因此,浏览器不必为每个主机名打开多个连接即可发送多个请求。 SPDY使他们能够为每个主机名打开一个连接。 这还将减少服务器上的负载,因为更少的连接意味着更少的套接字在服务器上打开。

3.服务器推送和服务器提示

在HTTP中,浏览器与服务器之间的所有通信均由浏览器启动。 如果服务器有话要说,它实际上必须等待浏览器询问信息。 当浏览器请求HTML时,服务器知道浏览器需要关联的css,JavaScript或图像,浏览器需要获取它们以完全呈现​​页面。 但是在HTTP中,服务器必须等待浏览器请求这些CSS,JavaScript和图像。

借助SPDY,服务器无需浏览器即可主动推送数据。

在某些情况下,服务器推送可能是浪费的。 例如,也许浏览器已经在其缓存中包含了css文件,而不会再次下载它。 SPDY具有服务器推送的精简版本,称为服务器提示,这意味着服务器仅向浏览器提供建议,但请求仍由客户端发出。

SPDY不再需要以下Web性能最佳实践,从而大大减少了开发人员的工作量。

  • CSS Sprite
  • 内嵌图片
  • 分片以改善并行请求。
  • CSS / JavaScript串联

局限性

SPDY很棒,但是仍然有一些限制。

  1. 首先是它仅限于HTTPS。
  2. SPDY与每个主机分别通信。 浏览器可能必须与多个主机进行通信才能完全呈现网页。 即使它们全部支持SPDY,浏览器仍必须为每个主机打开一个连接。 只能在每个主机的基础上进行复用。

如何在Nginx上启用SPDY

如前所述,您需要启用HTTPS才能使用SPDY。 幸运的是,现在您可以轻松地从Let’s Encrypt获得免费的SSL / TLS证书。 如果您尚未启用HTTPS,请使用以下链接获取免费的SSL / TLS证书。

使用Nginx进行HTTPS加密和加密SSL / TLS证书部署的概述

如果启用了HTTPS,请检查Nginx是否使用SPDY模块编译

sudo nginx -V

如果看到以下文本,则说明SPDY模块已包含在Nginx安装中。

--with-http_spdy_module

配置服务器阻止文件

sudo vi /etc/nginx/conf.d/yourdomain.conf

要么

sudo vi /etc/nginx/sites-available/yourdomain.conf

在里面 服务器 部分,添加 间谍 听443 ssl

server {
    listen 443 ssl spdy;
    server_name www.linuxbabe.com;

    ssl_certificate /etc/ssl/fullchain.pem;
    ssl_certificate_key /etc/ssl/privkey.pem;

......

然后保存并关闭文件。 重新加载Nginx配置。

sudo service nginx reload

要么

sudo systemctl reload nginx

您完成了。 很容易!

从Nginx 1.9.5开始,ngx_http_spdy_module被ngx_http_v2_module取代。 因此,如果使用的版本高于1.9.5,则无需启用SPDY。 请参阅以下文本以了解HTTP / 2以及如何使用Nginx启用它。

HTTP / 2

HTTP / 2基于SPDY。 HTTP / 2规范于2015年5月发布为RFC7540。HTTP/ 2的语义与HTTP / 1.1相同。 HTTP / 2是二进制的,而不是文本的。 HTTP / 2将响应分为头帧和数据帧。

对SPDY的改进

HPACK压缩

HPACK是一种更快,更智能的头压缩方式。 专为这项工作而设计。 Nginx的ngx_http_spdy_module默认禁用标头gzip压缩,因为它可能会受到CRIME的攻击。

不需要SSL / TLS

HTTP / 2协议本身不需要SSL / TLS连接。 但是所有主要浏览器供应商Firefox,Chrome,Opera的实施都表示他们将需要TLS。

阿尔普

使用ALPN,浏览器和服务器可以从一开始就建立HTTP / 2连接,而不是先建立HTTP / 1.1连接,然后再协商HTTP / 2连接。 ALPN是SPDY使用的NPN的改进。

在Nginx上启用HTTP / 2

从1.9.5版开始,Nginx支持HTTP / 2,因此您必须至少安装1.9.5版的Nginx。 我还建议使用ngx_pagespeed模块编译最新的Nginx,但这取决于您。 使用下面的链接查看完成情况。

在Ubuntu服务器上安装最新版本的Nginx

通过在Ubuntu服务器上使用ngx_pagespeed模块编译最新的Nginx版本来提高站点速度

与SPDY一样,在Nginx上启用HTTP / 2非常简单。 检查Nginx是否使用HTTP / 2模块编译

sudo nginx -V

由于您的Nginx版本至少为1.9.5,因此您应该在输出中看到以下文本。

--with-http_v2_module

然后配置服务器阻止文件

sudo vi /etc/nginx/conf.d/yourdomain.conf

要么

sudo vi /etc/nginx/sites-available/yourdomain.conf

在里面 服务器 部分,在之后添加http2 听443 ssl

server {
    listen 443 ssl http2;
    server_name www.linuxbabe.com;

    ssl_certificate /etc/ssl/fullchain.pem;
    ssl_certificate_key /etc/ssl/privkey.pem;

......

然后保存并关闭文件。 重新加载Nginx配置。

sudo service nginx reload

要么

sudo systemctl reload nginx

您完成了。 很容易!

如何检查HTTP / 2是否在您的网站上正常工作

转到https://tools.keycdn.com/http2-test。 并输入您的域名。 Cloudflare在有关测试和调试HTTP / 2的工具方面有出色的文章。

Sidebar