Nginx启用HTTP2

HTTP/2介绍

什么是HTTP/2

HTTP/2(超文本传输协议第2版,最初命名为HTTP 2.0),简称为h2(基于TLS/1.2或以上版本的加密连接)或h2c(非加密连接)[1],是HTTP协议的的第二个主要版本.

为什么不是HTTP/1.2

为了实现 HTTP 工作组设定的性能目标,HTTP/2 引入了一个新的二进制分帧层,该层无法与之前的 HTTP/1.x 服务器和客户端向后兼容,因此协议的主版本提升到 HTTP/2。

HTTP/2发展背景

起初是Google 2009年中旬开发的一个SPDY实验性协议,主要目标是通过解决HTTP/1.1 中一些性能限制来减少网页的加载延迟,首次发布后不久Google的两位软件工程师Mike Belshe 和 Roberto Peon 就分享了他们对这个新实验性 SPDY 协议的实现结果、文档和源代码,发现性能的提升特别明显,页面加载速度最高加快了55%,到了2012年,这个实验性协议得到Chrome、Firefox和Opera的支持,越来越多的大型网站(Twitter、Facebook)和小型网站开始部署SPDY,被行业越来越多的采用之后,SPDY已经具备成为一个标准的条件。

HTTP工作组(HTTP-WG)观察到这一趋势后,便将这一工作提上议事日程,吸取 SPDY的经验教训,并在此基础上制定了官方“HTTP/2”标准。在拟定宣言草案、向社会征集 HTTP/2建议并经过内部讨论之后,HTTP-WG决定将SPDY规范作为新HTTP/2协议的基础。在接下来几年中,SPDY和HTTP/2继续共同演化,SPDY作为实验性分支,用于为HTTP/2 标准测试新功能和建议。理论不一定适合实践(反之亦然),SPDY提供了一个测试和评估路线,可以对要包含到HTTP/2标准中的每条建议进行测试和评估。到2015年初,IESG审阅了新的HTTP/S标准并批准发布,之后不久,Google Chrome团队公布了他们为TLS弃用SPDY和NPN扩展的时间表(也就是2016年初),从此Google服务器开发转向HTTP/2,SPDY就此退出历史舞台。

Nginx配置HTTP/2环境

前提

(1)、Nginx 1.9.5版本支持HTTP/2,TLS扩展支持仅在OpenSSL版本1.0.2之上,为此先升级OpenSSL版本。
(2)、HTTP/2是加密传输,需要Nginx开启HTTPS模式,开启HTTPS就需要申请配置SSL证书。

升级OpenSSL版本

(1)、下载源码包编译安装

1
2
3
4
5
6
7
8
9
10
11
cd /tmp

wget https://www.openssl.org/source/openssl-1.1.1a.tar.gz

tar -xvf openssl-1.1.1a.tar.gz -C /usr/local/src/

cd /usr/local/src/openssl-1.1.1a

./config

make && make install

(2)、配置最新OpenSSL环境
把旧版本的openssl重命名

1
2
mv /usr/bin/openssl /usr/bin/openssl.bak
mv /usr/include/openssl /usr/include/openssl.bak

设置软连接指向刚编译好的新版本的openssl-1.1.1a

1
2
ln -s /usr/local/bin/openssl /usr/bin/openssl
ln -s /usr/local/include/openssl /usr/include/openssl

添加libssl.so.1.1的软链接

1
2
ln -s /usr/local/lib64/libssl.so.1.1 /usr/lib64/libssl.so.1.1
ln -s /usr/local/lib64/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1

查看openssl版本

1
openssl version

安装Nginx HTTP/2环境

nginx -V 查看configure编译参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
cd /tmp

wget https://nginx.org/download/nginx-1.14.2.tar.gz

tar -xvf nginx-1.14.2 -C /usr/local/src/

cd /usr/local/src/nginx-1.14.2

./configure \
...
安装nginx -V 的configure参数直接填,然后添加下面三个模块
--with-http_ssl_module \
--with-http_v2_module \
--with-openssl=/usr/local/src/openssl-1.1.1a #指定OpenSSL源码包解压后的路径

make执行完不需要在执行make install命令,不然当前Nginx配置环境会被覆盖安装成默认

重命名Nginx安装目录下的二进制文件

1
mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak

从刚刚编译过的源码包中拷贝Nginx二进制文件到Nginx安装目录下

1
cp objs/nginx /usr/local/nginx/sbin/

检测Nginx环境是否有错误

1
/usr/local/nginx/sbin/nginx -t

Nginx环境检测显示success打印信息就重载Nginx服务

1
/usr/local/nginx/sbin/nginx -s reload

完成后查看Nginx版本与参数是否添加成功

1
nginx -V

配置HTTP/2

配置Nginx vhost

1
2
3
4
5
6
7
8
9
10
server {
listen 443 ssl http2;
server_name example.com;

ssl on;
ssl_certificate /path/to/public.crt;
ssl_certificate_key /path/to/private.key;

.....
}

验证HTTP/2是否配置成功

(1)、在终端输入curl -I -k --http2 https://example.com; 显示HTTP/2.0则为开启成功
(2)、安装chrome插件HTTP/2 and SPDY indicator,插件显示蓝色闪电则为HTTP/2开启成功

优化Nginx SSL配置

访问https://mozilla.github.io/server-side-tls/ssl-config-generator/,选择对应的Web Server和OpenSSL版本,就会生成相应的配置。