我有一个原生支持 HTTPS 和 HTTP/2 的 Web 服务。它由 nginx 进行反向代理。
在 nginx 和应用程序上启用 SSL 和 HTTP/2 与仅在 nginx 上启用相比,有哪些权衡?
答案1
如果服务器之间的网络不受信任,则 Web 服务器和后端服务器之间的 HTTPS 可以提高安全性。这可能是公共云或共享数据中心的最佳做法,但如果服务器位于同一虚拟机上或受信任的网络上,则这可能是不必要的开销。
HTTP 的开销显然比加密连接要小。HTTPS 和 HTTP2 over HTTPS 的连接设置成本要高得多,但确实有重用连接的机制。这意味着您不必总是等待连接建立,但加密会产生开销。
关于 HTTP2,该协议比 HTTPS 更高效,因此它可以提高性能或减少资源使用,但这只是我的推测。我一直在搜索之前读过的有关 http2 协议的信息,但无法立即找到。
CloudFlare 支持客户端使用 HTTP2,但似乎没有在源服务器上使用 HTTP2。我的 Nginx 服务器支持通过 HTTPS 进行 http/2,但 CloudFlare 使用的是 HTTPS 1.1。
答案2
两者各有利弊。
最大的优点是您将提高安全性,因为 nginx 和应用程序之间的流量将无法嗅探。但是,如果应用程序和 nginx 托管在同一台服务器中,这毫无意义。即使应用程序在私有网络中,不加密两个连接也是可以接受的。事实上,如果在前者和应用程序之间有另一个端点,如果您将 gninx 用作 HTTPS 终止符,则 gninx 就失去了意义。在这种情况下,我会直接提供对应用程序的公共访问。
另一方面,缺点是处理 2 个加密连接比处理一个连接要消耗双倍的计算资源。只有当应用程序托管在具有公共 IP 的平衡服务器中时才有意义。在这种情况下,我会加密两个连接,尽管我会使用 HAProxy 而不是 nginx。虽然这不是最佳设计,也不安全,但我不推荐它。
我的方法是将应用程序部署在私有网络中,部署到尽可能多的服务器上来服务客户(这称为自动扩展 [1])。然后,我将使用 HAProxy 作为应用服务器的 HTTPS 终结器和均衡器[2]。
[1]http://docs.aws.amazon.com/autoscaling/latest/userguide/WhatIsAutoScaling.html [2]https://www.digitalocean.com/community/tutorials/how-to-implement-ssl-termination-with-haproxy-on-ubuntu-14-04)