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 功能。
解決方案#
- 升級系統
- 下載 openssl 1.0.2,重新編譯
- 用容器,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,要等到何年何月。。。