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

NGINX Jun 16, 2016

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

Operating System OpenSSL Version ALPN and NPN Support
CentOS/Oracle Linux/RHEL 5.10+ 0.9.8e Neither
CentOS/Oracle Linux/RHEL 6.5+, 7.0+ 1.0.1e NPN
Ubuntu 12.04 LTS 1.0.1 NPN
Ubuntu 14.04 LTS 1.0.1f NPN
Ubuntu 16.04 LTS 1.0.2g ALPN and NPN
Debian 7.0 1.0.1e NPN
Debian 8.0 1.0.1k NPN

資料來自 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,要等到何年何月。。。

參考來源

Footnote


  1. https://www.nginx.com/blog/supporting-http2-google-chrome-users/ ↩︎

Wai Tsang

💥8➕26.