【问题标题】:grails serve index.html from CDNgrails 从 CDN 提供 index.html
【发布时间】:2013-12-06 21:19:04
【问题描述】:

我希望我的 grails 应用程序部署在我的域的根目录中:

www.example.com

而不是

www.example.com/myapp

但是 www.example.com/index.html 将是静态的(静态 html、图像等)。我担心让应用程序服务器提供主页的性能。我可以将我的 grails 应用程序/cdn 配置为提供 index.html 及其内容,并让应用程序服务器处理动态页面吗?

我正在使用 grails 2.2.4 我将使用 Amazon S3 + ElasticBeanstalk + CloudFront。

或者我应该完全担心性能吗?我是 grails 的新手,但我的理解是静态内容应该由网络服务器 (Apache) 提供。由于没有 apache,我正在寻找另一种选择来保持网络服务器的负载。 CDN 似乎是个好主意。

【问题讨论】:

    标签: performance grails amazon-web-services amazon-elastic-beanstalk


    【解决方案1】:

    你当然可以做到。我个人的建议是将您的图像保留在 S3 上并在此基础上使用 Cloud Front。除非你的静态 HTML 本身太大,否则我建议让 Grails 成为 Grails,并像典型的 Grails 项目一样利用 Grails 资源来处理 JS 和 CSS——即使你的索引页面不会做任何动态的事情现在。你越是打破 Grails 的约定,构建和持续集成之类的事情就会变得越复杂。看看使用缓存,缩小插件,性能非常好。

    至于部署到根“/”上下文,您可以通过“prod war ROOT.war”为您的 Tomcat(或任何地方)部署执行此操作,或者您可以将其构建为“whateverapp.war”并处理路由Apache mod_jk 规则适用于更复杂的情况。

    我已经完成了大约十几个 Grails 项目,现在使用的架构非常相似。

    【讨论】:

      【解决方案2】:

      最简单的做法是从 CloudFront 为您的整个域提供服务,然后从您的 Grails 应用程序提供主页。您可以将 CloudFront 配置为将请求缓存到主页,从而最大限度地减少对 Grails 的请求数量。您可以将 CloudFront 直接映射到 Elastic Beanstalk 环境中运行的 ELB。

      默认的 Elastic Beanstalk 配置不会为您提供任何从 Apache 提供静态文件的方式;对 Elastic Beanstalk 的所有请求都代理到 Tomcat。不过,您可以使用高级配置进行设置(使用.ebextensions 机制)。

      您还可以设置Cache plugin 以在服务器端设置整页缓存(我建议也使用Cache EhCache plugin)。将服务器端缓存与 CDN 缓存相结合将使您走得更远。

      顺便说一句,提供静态内容的另一个不错的选择是使用 S3 本身来提供页面。如果您没有做任何太复杂的事情,它将为您省去设置和运行 Web 服务器的工作,尽管使用 Elastic Beanstalk 并没有太多工作要做。

      【讨论】: