如何将 docker 容器中的 nginx 从 http 1.x 升级到 http 2.0?

HTTP/2(超文本传输协议第 2 版,最初命名为 HTTP 2.0),是 HTTP 协议的的第二个主要版本,使用于万维网。HTTP/2 是 HTTP 协议自 1999 年 HTTP 1.1 发布后的首个更新,主要基于 SPDY 协议(是 Google 开发的基于 TCP 的应用层协议,用以最小化网络延迟,提升网络速度,优化用户的网络使用体验)。

相比较于 1.x, http 2.0 有如下几方面的改进:

  • HTTP/2 采用二进制格式而非文本格式
  • HTTP/2 是完全多路复用的,而非有序并阻塞的(只需一个连接即可实现并行)
  • 使用报头压缩,HTTP/2 降低了开销
  • HTTP/2 让服务器可以将响应主动“推送”到客户端缓存中

为了在不改变现有硬件配置,和后台架构的基础上,给网站带来性能上的提升我想将 nginx 从 1.x 升级到 2.0,要怎么做?

注: 我的 ngnix 运行在 docker 容器中。

1 个解决方案

AllenJiang
中间件研发,关注微信公众号 : 小哈学Java, 回复"666", 即可免费领取10G学习&面试资料

这里说说我实现 docker nginx 1.x 升级到 http 2.0 的步骤:

第一步,我 pull 的 Nginx 版本是 alpine:

大家应该有注意到我镜像的前缀带有 docker.io, 因为我使用了 DaoCloud 镜像加速,具体配置查看 https://www.exception.site/question/52

查看我已经处于运行状态的 nginx container 中 nginx 的版本:

运行命令:

docker exec -it nginx nginx -V

得到:

[root@iZbp1j8y1bab0djl9gdp33Z docker]# docker exec -it nginx nginx -V
nginx version: nginx/1.13.12
built by gcc 6.4.0 (Alpine 6.4.0) 
built with OpenSSL 1.0.2o  27 Mar 2018
TLS SNI support enabled

可以看到我的 OpenSSL 的版本是 1.0.2, 刚好满足最低版本要求,如果你的 OpenSSL 不满足,还需要单独安装,如何安装,这里就不详细介绍了,为了不那么麻烦,推荐你和下载的镜像版本一致。

确定好前提满足后,我们需要修改配置文件,打开我们运行 nginx 容器时,挂载的配置文件目录中的配置文件,添加如下配置:

listen 443 ssl http2;

如图:

然后,重启 nginx 容器:

docker restart nginx

查看请求日志 access.log, 确认是否更改为 http 2.0:

大功告成!