Skip to main content

谷歌瀏覽器 HTTP/2 降級回 HTTP/1.1?

Dev
Table of Contents

Nginx Mainline 的分支已經支持了 HTTP/2 好一段時間。谷歌 Chrome 游覽器,v51 開始不支持 Openssl NPN,改用 ALPN。不支持 ALPN 的伺服器,游覽器會自動降級到 HTTP/1.1。

Operating SystemOpenSSL VersionALPN and NPN Support
CentOS/Oracle Linux/RHEL 5.10+0.9.8eNeither
CentOS/Oracle Linux/RHEL 6.5+, 7.0+1.0.1eNPN
Ubuntu 12.04 LTS1.0.1NPN
Ubuntu 14.04 LTS1.0.1fNPN
Ubuntu 16.04 LTS1.0.2gALPN and NPN
Debian 7.01.0.1eNPN
Debian 8.01.0.1kNPN

資料來自 Nginx 博客 1

目前衹有 Ubuntu 16.04 LTS 本身可以通過 apt-get 安裝 openssl 1.0.2 (sudo apt-get install openssl)。其它系統衹能手動添加 nginx 配置,才能恢復 Nginx 的 HTTP/2 功能。

解決方案
#

  1. 升級系統
  2. 下載 openssl 1.0.2,重新編譯
  3. 用容器,docker 之類

第一個選項

如果你從 14.x 升級到 16.04,NGINX 需要重新安裝一次,因爲你看看 nginx -V 這個命令查看用了哪個版本的 OpenSSL:

nginx version: nginx/1.10.0 (Ubuntu)
built with OpenSSL 1.x.x  ...

如果不是上面表格,需要重新安裝一次 NGINX。可以 apt-get remove,再 install 一次。重新安裝時,選保留 config 文件就可以了。

第二個選項的方法

1、去 OpenSSL 官網下載 1.0.2, https://www.openssl.org/source/ ,解壓就可以了

2、nginx 重新編譯時,添加 最新版的 openssl 的參數 --with-openssl

./configure ... --with-openssl=/path/to/openssl-1.0.2h

當然,這不是最好的方案。畢竟,OpenSSL 這貨差不多每個月都有漏洞。不過等系統升級 OpenSSL,要等到何年何月。。。

參考來源
#