使用 Boxfuse 将播放框架应用程序部署到 Amazon AWS 时出现“不允许主机”错误

Posted

技术标签:

【中文标题】使用 Boxfuse 将播放框架应用程序部署到 Amazon AWS 时出现“不允许主机”错误【英文标题】:"host not allowed" error when deploying a play framework application to Amazon AWS with Boxfuse 【发布时间】:2017-07-13 01:47:21 【问题描述】:

我正在尝试将使用 Scala 中的 Play Framework 编写的简单 Web 应用程序部署到 Amazon Web 服务。

Web 应用程序在我的本地机器上在开发模式和生产模式下运行良好,我已将其默认端口更改为 80。

我按照建议使用 Boxfuse 部署到 AWS。

我首先运行“sbt dist” 然后“boxfuse run -env=prod

事情进展顺利。图像被融合并推送到 AWS。 AMI 已创建。实例已启动,我的应用程序正在运行。

i-0f696ff22df4a2b71 => 2017-07-13 01:28:23.940 [info] play.api.Play - 应用程序已启动(产品)

然后出现错误信息:

警告:Healthcheck (http://35.156.38.90/) 返回 400 而不是 200。正在重试接下来的 300 秒...

i-0f696ff22df4a2b71 => 2017-07-13 01:28:24.977 [信息] p.c.s.AkkaHttpServer - 在 /0.0.0.0:80 上侦听 HTTP

i-0f696ff22df4a2b71 => 2017-07-13 01:28:25.512 [警告] p.f.h.AllowedHostsFilter - 不允许主机:35.156.38.90

3分钟后重复尝试,实例被终止。它给出了如下警告:

确保您的应用程序在端口 80 上以 HTTP 200 响应

但我已经确保应用程序在本地机器上响应,并且我尝试了 Windows 和 Ubuntu,一切正常。

另外,在本地机器上运行“boxfuse run”,我可以使用“http://localhost”连接到它,但仍然有错误。

希望有经验的人能给我一些建议。提前致谢。

ps:不确定是否相关,我将这些设置添加到 application.conf

http 
        address = 0.0.0.0
        port = 80
    

【问题讨论】:

【参考方案1】:

从错误信息来看,问题可能与play.filters.hosts.allowed未在application.conf中设置有关。过滤器允许您配置哪些主机可以访问您的应用程序。有关 Play 过滤器的更多详细信息,请访问here。

这是一个配置示例:

play.filters.hosts 
  allowed = ["."]

请注意,allowed = ["."] 匹配所有主机,因此不建议在生产环境中使用。

【讨论】:

这样安全吗? 当然不是万能的安全解决方案,但像这样的主机访问过滤措施确实有助于防止网络cache poisoning attacks等攻击。 谢谢。我问这个是因为我在播放文档中看到了这一点:“您可以使用 . 模式来匹配所有主机(在生产中不推荐)。请注意,过滤器还会从主机末尾去除点字符,因此示例。 com 模式将匹配 example.com。”我觉得这在弹性豆茎环境中很困难,因为并不总是清楚主机是什么...... 我明白了。感谢您指出。 allowed = ["."] 旨在成为解决 OP 访问问题的简单(和惰性)配置。绝对值得注意的是,在生产环境中应避免此类配置。答案已更新。 理想情况下,过滤器应该有条目“35.156.38.90”??还是一个网址?【参考方案2】:

如Boxfuse Play Documentation中所述:

如果您的应用程序使用允许的主机过滤器,您必须确保 application.conf 中的 play.filters.hosts.allowed 允许来自任何地方的连接,否则此过滤器会导致 ELB 健康检查失败。例如:

play.filters.hosts 
  allowed = ["."]

更多信息请关注official Play documentation。

【讨论】:

我尝试了这种方法,它仍然给我主机不允许错误。

以上是关于使用 Boxfuse 将播放框架应用程序部署到 Amazon AWS 时出现“不允许主机”错误的主要内容,如果未能解决你的问题,请参考以下文章

播放框架重定向错误

播放框架,将阻止用户重定向到某个页面

多项目gradle构建部署为2个独立的应用程序(一个是播放应用程序)

播放框架:如何将数据库演化应用到伪造的应用程序测试数据库

使用 systemd 在 Ubuntu 16.04 上播放框架部署

如何将视频从 Play 2 框架流式传输到 HTML5 播放器