使用 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个独立的应用程序(一个是播放应用程序)