【问题标题】:How to serve mulitple web applications on different subdomains?如何在不同的子域上提供多个 Web 应用程序?
【发布时间】:2019-04-05 19:56:51
【问题描述】:

不确定标题是否合适,但我目前拥有三个应用程序(静态内容):

  • public
  • app
  • admin

public 只是用于常规网络的内容,app 是为移动设备呈现的内容,admin 基本上是用于管理的工具。 它们都包含在同一个 Spring Boot 应用程序中,并通过example.com/api 与 REST API 通信。从技术上讲,我可以将它们放入resources/static 这样

resources/static/public
resources/static/admin
resources/static/app

这将允许我访问应用程序:

example.com/public/index.html
example.com/admin/index.html
example.com/app/index.html

但是,我的目标是具有以下结构:

      example.com     // For public
admin.example.com     // For admin
  app.example.com     // For app
      example.com/api // REST API

如何才能做到这一点,或者我可以做些什么来使这成为可能?

【问题讨论】:

标签: spring spring-boot


【解决方案1】:

听起来您拥有三个系统:公共、管理员和应用程序共享一个公共 REST api。最好的方法可能是使用 AWS CloudFront 或 Google Cloud CDN 等内容交付网络 (CDN) 为三个系统中的每一个系统提供静态资源。

另一种方法,虽然不太理想,是使用代理重定向应用程序请求(例如https://admin.example.comhttps://internal-spring-boot-server/admin)。您可以将 Apache mod_proxy 与反向代理一起使用(请参阅 https://httpd.apache.org/docs/2.4/mod/mod_proxy.html),或 NGNX 反向代理 https://docs.nginx.com/nginx/admin-guide/web-server/reverse-proxy/

【讨论】:

  • 嗨!现在我正在寻找最简单的解决方案。我从未使用过 CDN。现在我正在 Heroku 上进行部署,但不确定该信息是否相关。乍一看,代理解决方案似乎相当简单——虽然我不知道如何将它应用到我的 Spring 应用程序中。如果您有更多详细信息,我很乐意看看。
  • 我不熟悉 Heroku,但有一个名为 Edge (devcenter.heroku.com/articles/edge) 的插件可以使用 Amazon 的 CloudFront CDN。其他 CDN 可能还有其他插件。
  • 使用 Heroku 的 HTTP 路由 (devcenter.heroku.com/articles/http-routing),您可以设置多个指向同一个 Spring Boot 应用程序的应用程序入口点,但我对 Heroku 的工作原理一无所知。
  • 出于好奇,拥有一个包含管理员和非公共部分的应用程序仅通过菜单/链接向具有适当权限的授权用户呈现不是更好的用户体验吗?
【解决方案2】:

我认为有两种方法可以实现您想要做的事情。

您将在 DNS plesk/cpanel/.. 中配置您的子域以查看特定的文档根目录(每个应用程序主目录的路径。) 例如,当有人请求example.com 时,请求会请求example.com/main,当有人请求admin.example.com 时,请求会请求admin.example.com/admin 等等。这样,您基本上忽略了Spring 应用程序中的子域,而您使用 RequestMapping 值 main/admin/etc..

在@Controller 级别操作路由

或者,如果您不想弄乱 Provider 的控制面板,您可以按照this 回答的步骤操作。但是,您必须实现这三个自定义 RequestCondition 类,这可能不是最简单的方法。

不是最好的记录答案,但我希望我指出了正确的方向。

【讨论】:

  • 嗯,我不知道如何做第一个解决方案。我可以想象重定向会起作用,例如admin.example.com 重定向到 example.com/admin 但我实际上想完全隐藏它。我什至不确定这是否是一般人的做法。一种绝对可行的解决方案是将所有应用程序单独部署到服务器上,并配置我的 DNS 设置,将每个点都指向正确的应用程序。唯一的问题是,这意味着我需要 4 个 dynos(heroku 上的实例),此时成本太高了。
  • 是的,我猜这是“合法”的方式,将其拆分为四个不同的 Spring Boot 应用程序,具有您刚才提到的经济后果。怎么做的大致思路是“将子域重定向到子目录”,子目录将起到RequestMapping值的作用。此重定向在 .htaccess 文件中完成。在这里查看一个示例 stackoverflow.com/questions/8481005/… 但取决于您的 DNS 提供商,可能还会有一些 gui 来配置它。
  • 好吧,我得看看那个,但我现在不知道如何对 Spring 的嵌入式 Tomcat 做到这一点 - 我想这就是我必须做出改变的地方.
  • 是的,这是真的。您需要对 tomcat 进行子域配置。好消息是,因为它是一个启动应用程序,无论您在哪里部署,您都可以随身携带配置好的 tomcat。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-22
  • 2019-01-01
  • 1970-01-01
相关资源
最近更新 更多