您现在的位置是:首页 > 为Nginx开启HTTP2支持
为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版本:
1
|
openssl version |
如果版本达不到要求,可以按照下面的方法升级:
1、先到官网(https://www.openssl.org/source/)下载合适的openssl版本并解压。
1
2
|
tar -zxf openssl-1.1.0k.tar.gz |
2、编译安装
1
2
3
|
cd openssl-1.1.0k.tar.gz ./config make install |
3、替换新版本的openssl
1
2
|
mv `which openssl` /tmp ln -s /usr/local/bin/openssl /usr/bin/openssl |
4、验证版本
1
|
openssl version |
二、升级nginx
首先检查nginx的版本
1
|
nginx -v |
如果版本不满足要求,安装下面的方法升级
1、卸载已经安装的nginx(放心做,会保留配置文件)
1
|
apt-get remove nginx nginx-common |
2、添加ondrej nginx安装源
1
|
add-apt-repository ppa:ondrej/nginx |
3、先更新源,然后安装
1
2
|
apt-get update apt-get install nginx |
4、最后验证nginx版本
1
|
nginx -v |
在上面条件满足后,我们需要修改nginx的配置开启HTTP2。
1
2
3
4
5
6
7
8
9
10
11
12
|
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; } |
1
|
上面是一个网站的简单配置文件,我们只需要在https端口添加http2指令就好了,配置完成后,先检查一下配置文件有没有问题: |
1
|
nginx -t |
如果没有问题,重启nginx服务
1
|
service nginx restart |
最后验证我们的网站是否真的启用了HTTP2,这里提供2种验证方法:
1、通过查看请求的Protocol验证
用chrome浏览器打开待验证的网址并开启控制台,首先我们需要将控制台network中的Protocol列调出来,方法如下图:
然后刷新网页,可以看到我们的网站已经是HTTP2传输的了。
2、通过代码验证
用chrome浏览器打开待验证的网址并开启控制台,输入以下代码:
1
2
3
4
5
6
7
8
9
10
11
12
|
(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”