HTTP/2 的优势
相比 HTTP/1.x,HTTP/2 在底层传输做了很大的改动和优化:
- HTTP/2 采用二进制格式传输数据,而非 HTTP/1.x 的文本格式。二进制格式在协议的解析和优化扩展上带来更多的优势和可能。
- HTTP/2 对消息头采用 HPACK 进行压缩传输,能够节省消息头占用的网络的流量。而 HTTP/1.x 每次请求,都会携带大量冗余头信息,浪费了很多带宽资源。头压缩能够很好的解决该问题。
- 多路复用,直白的说就是所有的请求都是通过一个 TCP 连接并发完成。HTTP/1.x 虽然通过 pipeline 也能并发请求,但是多个请求之间的响应会被阻塞的,所以 pipeline 至今也没有被普及应用,而 HTTP/2 做到了真正的并发请求。同时,流还支持优先级和流量控制。
- Server Push:服务端能够更快的把资源推送给客户端。例如服务端可以主动把 JS 和 CSS 文件推送给客户端,而不需要客户端解析 HTML 再发送这些请求。当客户端需要的时候,它已经在客户端了。
升级HTTP2和TLS1.3必要条件
- nginx必须大于1.3
- 必须支持https
- openssl必须大于1.1.0
我的nginx小于1.3,故而选择安装nginx-1.14.2版本,不覆盖原安装路径,如果是升级nginx,切记最后不要make install
软件安装位置
openssl
1、编译位置
/usr/local/openssl
软链接位置/usr/bin/openssl
/usr/include/openssl
nginx
1、编译及配置文件位置
软链接位置
/usr/local/data/ngin
编译位置
/usr/local/data/nginx-14.2
升级openssl
#备份旧版
mv /usr/bin/openssl /usr/bin/openssl.old
mv /usr/include/openssl /usr/include/openssl.old
#
wget https://www.openssl.org/source/openssl-1.1.1i.tar.gz --no-check-certificate
tar zxvf openssl-1.1.1i.tar.gz
cd openssl-1.1.1i
./config --prefix=/usr/local/openssl shared zlib
make depend
make && make install
ln -s /usr/local/openssl/bin/openssl /usr/bin/openssl
ln -s /usr/local/openssl/include/openssl /usr/include/openssl
echo /usr/local/openssl/lib >> /etc/ld.so.conf
ldconfig
openssl version
OpenSSL 1.1.1i 8 Dec 2020
#查看支持的tls版本
openssl s_client -help 2>&1 | awk '/-(ssl|tls)[0-9]/{print $1}'
-tls1
-tls1_1
-tls1_2
-tls1_3
/usr/local/openssl/bin/openssl s_client -connect test.lovepik.com:443 -tls1_3
安装nginx
wget -q -nc http://nginx.org/download/nginx-1.14.2.tar.gz
tar zxvf nginx-1.14.2.tar.gz
#改之前
cat nginx-1.14.2/auto/lib/openssl/conf
CORE_INCS="$CORE_INCS $OPENSSL/.openssl/include"
CORE_DEPS="$CORE_DEPS $OPENSSL/.openssl/include/openssl/ssl.h"
CORE_LIBS="$CORE_LIBS $OPENSSL/.openssl/lib/libssl.a"
CORE_LIBS="$CORE_LIBS $OPENSSL/.openssl/lib/libcrypto.a"
#改之后
CORE_INCS="$CORE_INCS $OPENSSL/include"
CORE_DEPS="$CORE_DEPS $OPENSSL/include/openssl/ssl.h"
CORE_LIBS="$CORE_LIBS $OPENSSL/lib/libssl.a"
CORE_LIBS="$CORE_LIBS $OPENSSL/lib/libcrypto.a"
cd nginx-1.14.2
./configure --prefix=/usr/local/data/nginx-1.14.2
--user=ooopic
--group=ooopic
--with-http_stub_status_module
--with-http_ssl_module
--with-pcre
--with-http_flv_module
--with-http_gzip_static_module
--with-http_secure_link_module
--with-openssl-opt=enable-tlsext
--with-http_v2_module
--with-openssl=/usr/local/openssl
--with-openssl-opt=enable-tls1_3
make && make install #(升级nginx,不要执行make install操作)
#复制旧版nginx中的配合到新版
#修改https配置
listen 443 http2;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
#批量修改(vhosts下面的配置文件必须都改才能生效,由于我这个下面存在多个子域名,改了其中两个,折腾一下午)
sed -i 's/ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;/ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;/' *.conf
sed -i 's/ssl_protocols TLSv1 TLSv1.1 TLSv1.2;/ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;/' *.conf
sed -i 's/443/443 http2/' *.conf
测试
/usr/local/openssl/bin/openssl s_client -connect test.lovepik.com:443 -tls1_3
返回信息包含一下内容则说明配置成功
SSL-Session:
Protocol : TLSv1.3
Cipher : TLS_AES_256_GCM_SHA384
Session-ID: 98BB361E1DF0546E2887B3C52F89D8E3D33B0B5D9BAECF579196D902ACAE4A34
Session-ID-ctx:
Resumption PSK: 1B8D6677552D1DD0C03EB07EDD4EEB50A66E027CEB6E0D8CEA2B2C4E94D270BA8373CD2A44EDD06DC9BAEB5965AF136E
PSK identity: None
PSK identity hint: None
SRP username: None
TLS session ticket lifetime hint: 300 (seconds)
配置参考链接
服务器租用托管,机房租用托管,主机租用托管,https://www.e1idc.com