如何在弹性平衡器等负载平衡器后面设置双 http 和 https 服务器

Posted

技术标签:

【中文标题】如何在弹性平衡器等负载平衡器后面设置双 http 和 https 服务器【英文标题】:How to setup dual http and https servers behind a load balancer like elastic balancer 【发布时间】:2014-12-11 04:26:17 【问题描述】:

我有一个nodejs+expressjs应用,只需要在http上正常运行即可。我向应用程序添加了几个管理视图,并使用身份验证和我自己的自签名证书通过 https 提供这些视图。这意味着在我的应用程序中同时运行 http 和 https 服务器。在我的本地系统上,这适用于我的“donotcheckin”目录中的 https 证书。

现在我正试图让它在负载平衡的弹性 beanstalk 设置上运行。我已经通过 IAM 上传了证书和私钥,这似乎有效(我的 eb 应用程序的 http 和 https url 都可以访问)。

我现在很困惑的是如何在我的应用程序代码中部署 http 和 https 服务器。请通过阐明这两个选项(或建议其他选项)来帮助您。

    既然负载均衡器已经处理了 https,我可以完全放弃 https 服务器吗?如果是这样,负载均衡器是否保证将标头信息传递给应用程序的标准 http 服务器,以便它可以检测是否正在安全地访问管理视图?

    我还可以将证书留在负载平衡器以及应用程序的 https 服务器上。但是,在这个弹性 beanstalk 自动缩放环境中,让这个 https 服务器访问证书和私钥文件的正确方法是什么?

感谢您的帮助。

【问题讨论】:

【参考方案1】:

    如您所说,您可以将 ELB 配置为将所有 HTTPS 和 HTTP 流量转发到您的应用程序 http 服务器,从而无需处理应用程序中的任何 https 配置。您可以参考 'X-Forwarded-Proto' 标头来检测请求是否以 http 和 https 的形式出现。

    对于我的用例,我将所有流量转发到 https,因此如果标头类型为 http,我只需重定向:

    app.use(req, res, next) 
      if(req.headers['x-forwarded-proto'] == 'http' && process.env.NODE_ENV!=="development")
        res.redirect('https://' + req.headers.host + req.path);
       else 
        next();
      
    
    

    如果您希望将证书保留在应用程序中,那么只需将它们放在应用程序目录中的某个位置并在创建服务器时加载它们,例如 this

【讨论】:

感谢您确认第一个选项。在过去的几个小时里,我努力使双 http/https 服务器选项工作,因为该设置已经在开发中为我工作。不过,在弹性豆茎环境中,这是一场艰苦的战斗。以安全的方式为每个新实例获取这些证书和私钥是一个棘手(但可以解决)的问题。即使是内置的 nginx 设置也只侦听和转发 1 个端口,因此必须对 nginx 配置进行一些自定义黑客攻击。不值得:) @lastoneisbearfood,我强烈建议您使用 Opsworks 路线。我们曾经在 Beanstalk 中进行部署,但灵活性不够。 Opsworks 将让您通过 EC2 面板创建自己的弹性负载均衡器,然后自定义端口转发。有问题可以私信

以上是关于如何在弹性平衡器等负载平衡器后面设置双 http 和 https 服务器的主要内容,如果未能解决你的问题,请参考以下文章

为啥从亚马逊弹性负载均衡器后面发送重定向时收到 502 错误网关?

AWS 通过弹性负载均衡器发送 http 请求

如何调试失败的 AWS 弹性负载均衡器健康检查

使用弹性负载均衡器处理 SSH 流量

如何使用适用于 node.js 的单实例弹性负载均衡器设置 HTTPS?

如何使 HTTP 调用到达 App Engine 负载平衡器后面的所有实例?