基于ubuntu为nginx开启HTTP2

HTTP2出来已经好久了,我的博客也运行了好几年了,不管是之前用的apache服务器还是最近刚换的nginx服务器,我的博客一直运行的HTTP1/3版本上,在看了诸多HTTP2的有点,也了解了一些HTTP2的弊端之后,还是决定将博客升级到HTTP2,在正式升级之前,先了解一下HTTP2的优缺点。

HTTP2的优点:

1、HTTP2采用二进制格式传输数据,而HTTP/1.x用的是文本格式,二进制格式在协议的解析和优化扩展上带来更多的优势和可能。

2、HTTP2会对消息头采用HPACK进行压缩传输,这样能够节省下消息头占用的网络流量,而HTTP/1.x 每次请求,都会携带大量冗余头信息,浪费了很多带宽资源。

3、HTTP2的多路复用,HTTP2会将所有的请求通过一个TCP连接中并发完成。HTTP/1.x虽然能利用一个连接完成多次请求,但是多个请求之间是有先后顺序的,后面发送的请求必须等待上一个请求返回才能发送响应。这会很容易导致后面的请求被阻塞,而HTTP2做到了真正的并发请求,减少了服务端的压力,内存占用更少,连接吞吐量更大。同时, 流还支持优先级和流量控制。

4、HTTP2的服务端推送,也就是说,除了对原始请求的响应之外,服务器还可以主动向客户端推送额外的资源,而不需要客户端明确请求每一个资源!

任何事物都有2面,HTTP2有他优势的一面,当然也有他做的不好的地方:

1、HTTP2是基于TCP的,自然避免不了TCP的一些固有问题,比如慢启动,如果拥塞窗口尺寸设置不合理,TCP的性能会急剧下降。

2、HTTP2中的传输连接虽然可以多路复用,但仍然无法避免队头阻塞的情况出现,TCP是需要保证有序的,如果单个TCP连接同时承载了四路逻辑连接,其中某个逻辑连接丢包了,则其它三路都会受影响,都必须从丢包的时刻开始重传,这无疑是极大的浪费。测试表明,如果丢包率超过2%,那么HTTP/2甚至不如HTTP 1.1,因为HTTP 1.1中各连接物理隔离,不会互相影响。

在了解了HTTP2的优缺点之后,我们来开始升级我们的HTTP吧。

开启nginx http2支持的条件:

1、openssl >= 1.0.2

2、nginx >= 1.9.5

一、升级openssl

首先检查一下我们的openssl版本:

openssl version

如果版本达不到要求,可以按照下面的方法升级:

1、先到官网(https://www.openssl.org/source/)下载合适的openssl版本并解压。

wget https://www.openssl.org/source/openssl-1.1.0k.tar.gz
tar -zxf openssl-1.1.0k.tar.gz

2、编译安装

cd openssl-1.1.0k.tar.gz
./config
make install

3、替换新版本的openssl

mv `which openssl` /tmp
ln -s /usr/local/bin/openssl /usr/bin/openssl

4、验证版本

openssl version

二、升级nginx

首先检查nginx的版本

nginx -v

如果版本不满足要求,安装下面的方法升级

1、卸载已经安装的nginx(放心做,会保留配置文件)

apt-get remove nginx nginx-common

2、添加ondrej nginx安装源

add-apt-repository ppa:ondrej/nginx

3、先更新源,然后安装

apt-get update
apt-get install nginx

4、最后验证nginx版本

nginx -v

在上面条件满足后,我们需要修改nginx的配置开启HTTP2。

server {
  listen 443 ssl http2;
  listen [::]:443 ssl http2;
  server_name www.test.com;

  root /var/www/;
  index index.php;

  ssl on;
  ssl_certificate /ssl/www.test.com.pem;
  ssl_certificate_key /ssl/www.test.com.key;
}
上面是一个网站的简单配置文件,我们只需要在https端口添加http2指令就好了,配置完成后,先检查一下配置文件有没有问题:
nginx -t

如果没有问题,重启nginx服务

service nginx restart

最后验证我们的网站是否真的启用了HTTP2,这里提供2种验证方法:

1、通过查看请求的Protocol验证

用chrome浏览器打开待验证的网址并开启控制台,首先我们需要将控制台network中的Protocol列调出来,方法如下图:

然后刷新网页,可以看到我们的网站已经是HTTP2传输的了。

2、通过代码验证

用chrome浏览器打开待验证的网址并开启控制台,输入以下代码:

(function(){
    if(window.chrome && typeof chrome.loadTimes === 'function') {
        var loadTimes = window.chrome.loadTimes();
        var spdy = loadTimes.wasFetchedViaSpdy;
        var info = loadTimes.npnNegotiatedProtocol || loadTimes.connectionInfo;
        // 就以 「h2」作为判断标识
        if(spdy && /^h2/i.test(info)) {
            return console.info('本站点使用了HTTP/2');
        }
    }
    console.warn('本站点没有使用HTTP/2');
})();

如果是基于HTTP2传输的,那么会显示“本站点使用了HTTP/2”

  • 支付宝二维码 支付宝
  • 微信二维码 微信
相关文章