7.9 KiB
NGINX Plus 现在完全支持 HTTP/2
本周早些时候,我们发布了对 HTTP/2 支持的 NGINX Plus R7。作为 HTTP 协议的最新标准,HTTP/2 的设计对现在的 web 应用程序带来了更高的性能和安全性。
NGINX Plus 使用 HTTP/2 协议可与现有的网站和应用程序进行无缝衔接。最微小的变化就是不管用户选择什么样的浏览器,NGINX Plus 都能为用户提供 HTTP/1.x 与HTTP/2 并发运行带来的最佳体验。
要支持 HTTP/2 仅需提供 nginx‑plus‑http2 软件包。nginx‑plus 和 nginx‑plus‑extras 软件包支持 SPDY 协议,目前推荐用于生产站点,因为其被大多数浏览器所支持并且代码也是相当成熟了。
为什么要使用 HTTP/2?
HTTP/2 使数据传输更高效,对你的应用程序更安全。 HTTP/2 相比于 HTTP/1.x 有五个提高性能特点:
-
完全复用 – HTTP/1.1 强制按严格的顺序来对一个请求建立连接。请求建立必须在下一个进程开始之前完成。 HTTP/2 消除了这一要求,允许并行和乱序来完成请求的建立。
-
单一,持久连接 – 由于 HTTP/2 允许请求真正的复用,现在通过单一连接可以并行下载网页上的所有对象。在 HTTP/1.x 中,使用多个连接来并行下载资源,从而导致使用底层 TCP 协议效率很低。
-
二进制编码 – Header 信息使用紧凑二进制格式发送,而不是纯文本格式,节省了传输字节。
-
Header 压缩 – Headers 使用专用的算法来进行压缩,HPACK 压缩,这进一步降低数据通过网络传输的字节。
-
SSL/TLS encryption – 在 HTTP/2 中,强制使用 SSL/TLS。在 RFC 中并没有强制,其允许纯文本的 HTTP/2,它是由当前 Web 浏览器执行 HTTP/2 的。 SSL/TLS 使你的网站更安全,并且使用 HTTP/2 所有性能会有提升,加密和解密过程的性能也有所提升。
要了解更多关于 HTTP/2:
- 请阅读我们的 白皮书,它涵盖了你需要了解HTTP/2 的一切。
- 下载由 Google 的 Ilya Grigorik 编写的 特别版的高性能浏览器网络电子书 。
NGINX Plus 如何实现 HTTP/2
实现 HTTP/2 要基于对 SPDY 的支持,它已经被广泛部署(使用了 NGINX 或 NGINX Plus 的网站近 75% 都使用了 SPDY)。使用 NGINX Plus 部署 HTTP/2 时,几乎不会改变你应用程序的配置。本节将讨论 NGINX Plus如何实现对 HTTP/2 的支持。
一个 HTTP/2 网关
NGINX Plus 作为一个 HTTP/2 网关。它谈到 HTTP/2 对客户端 Web 浏览器支持,但传输 HTTP/2 请求返回给后端服务器通信时使用 HTTP/1.x(或者 FastCGI, SCGI, uWSGI, 等等. – 取决于你目前正在使用的协议)。
向后兼容性
在不久的未来,你需要同时支持 HTTP/2 和 HTTP/1.x。在撰写本文时,超过50%的用户使用的 Web 浏览器已经支持 HTTP/2,但这也意味着近50%的人还没有使用。
为了同时支持 HTTP/1.x 和 HTTP/2,NGINX Plus 实现了将 Next Protocol Negotiation (NPN协议)扩展到 TLS 中。当 Web 浏览器连接到服务器时,其将所支持的协议列表发送到服务器端。如果浏览器支持的协议列表中包括 h2 - 即,HTTP/2,NGINX Plus 将使用 HTTP/2 连接到浏览器。如果浏览器不支持 NPN 或在发送支持的协议列表中没有 h2,NGINX Plus 将继续使用 HTTP/1.x。
转向 HTTP/2
NGINX,公司尽可能无缝过渡到使用 HTTP/2。本节通过对你应用程序的改变来启用对 HTTP/2 的支持,其中只包括对 NGINX Plus 配置的几个变化。
前提条件
使用 nginx‑plus‑http2 软件包升级到 NGINX Plus R7 . 注意启用 HTTP/2 版本在此时不需要使用 nginx‑plus‑extras 软件包。
重定向所有流量到 SSL/TLS
如果你的应用程序尚未使用 SSL/TLS 加密,现在启用它正是一个好的时机。加密你的应用程序可以保护你免受间谍以及来自其他中间人的攻击。一些搜索引擎甚至在搜索结果中对加密站点 提高排名。下面的配置块重定向所有的普通 HTTP 请求到该网站的加密版本。
server {
listen 80;
location / {
return 301 https://$host$request_uri;
}
}
启用 HTTP/2
要启用对 HTTP/2 的支持,只需将 http2 参数添加到所有的 listen 指令中,包括 SSL 参数,因为浏览器不支持不加密的 HTTP/2 请求。
server {
listen 443 ssl http2 default_server;
ssl_certificate server.crt;
ssl_certificate_key server.key;
…
}
如果有必要,重启 NGINX Plus,例如通过运行 nginx -s reload 命令。要验证 HTTP/2 是否正常工作,你可以在 Google Chrome 和 Firefox 中使用 “HTTP/2 and SPDY indicator” 插件来检查。
注意事项
-
在安装 nginx‑plus‑http2 包之前, 你必须删除配置文件中所有 listen 指令后的 SPDY 参数(使用 http2 和 ssl 参数来替换它以启用对 HTTP/2 的支持)。使用这个包后,如果 listen 指令后有 spdy 参数,NGINX Plus 将无法启动。
-
如果你在 NGINX Plus 前端使用了 Web 应用防火墙(WAF),请确保它能够解析 HTTP/2,或者把它移到 NGINX Plus 后面。
-
此版本在 HTTP/2 RFC 不支持 “Server Push” 特性。 NGINX Plus 以后的版本可能会支持它。
-
NGINX Plus R7 同时支持 SPDY 和 HTTP/2。在以后的版本中,我们将弃用对 SPDY 的支持。谷歌在2016年初将 弃用 SPDY,因此同时支持这两种协议也非必要。
-
如果 ssl_prefer_server_ciphers 设置为 on 或者 ssl_ciphers 列表被定义在 Appendix A: TLS 1.2 Ciper Suite Black List 使用时,浏览器会出现 handshake-errors 而无法正常工作。详细内容请参阅 section 9.2.2 of the HTTP/2 RFC。
特别感谢
NGINX,公司要感谢 Dropbox 和 Automattic,他们是我们软件的重度使用者,并帮助我们实现 HTTP/2。他们的贡献帮助我们加速完成这个软件,我们希望你也能支持他们。
O'REILLY'S BOOK ABOUT HTTP/2 & PERFORMANCE TUNING
via: https://www.nginx.com/blog/http2-r7/
作者:Faisal Memon 译者:strugglingyouth 校对:校对者ID