【问题标题】:Can I (DNS) map one subdomain to multiple Play Framework entry points我可以 (DNS) 将一个子域映射到多个 Play Framework 入口点吗
【发布时间】:2014-08-08 20:06:46
【问题描述】:

下面的情况可能吗?警告我只了解 DNS 的基本形式。

我们有一个 API(使用 Play 构建),我们想通过一个地址提供它,比如 http://api.publicname.com

但是,我们希望将此 API 拆分为 2 个 Play 项目(例如 myapione 和 myapitwo)。 然后仅使用 1 个域但两个单独的“子文件夹”访问它们

所以我一直在寻找映射的可能性说...

http://myinternal.domain:9000http://api.publicname.com/myapione

...和另一个Play 应用程序

http://myinternal.domain:9001http://api.publicname.com/myapitwo

我们正在寻找的最终结果如下所示。 我们的电话看起来像......

http://myinternal.domain:9000/products/123 也是http://api.publicname.com/myapione/products/123

http://myinternal.domain:9001/orders/456 也是http://api.publicname.com/myapitwo/orders/456

【问题讨论】:

  • 我不这么认为,但你总是可以在两个播放应用程序前面放置一些代理(Apache/nginx)并进行正确的重定向

标签: web-services networking playframework dns


【解决方案1】:

目标:

Public URL              -> maps to -> internal URL
http://api.publicname.com/myapione -> http://localhost:9000
http://api.publicname.com/myapitwo -> http://localhost:9001

正如@applicius 所说,通过“前端”或“源”HTTP 服务器将请求代理到较低级别的“应用程序”或“服务”HTTP 服务器来实现。不过,这实际上与虚拟主机无关。

Nginx、Apache 等很常见。我认为nginx很棒。 Zeus 或 ZXTM 是一款出色的商业产品。我想它已经被买断了,所以我不确定它是否仍然可以单独使用。

上面的 nginx 配置,类似于:

server {
    listen       80;
    server_name  api.publicname.com/myapione;

    location /myapione {
        proxy_pass        http://localhost:9000;
        proxy_set_header  X-Real-IP  $remote_addr;
    }

    location /myapitwo {
        proxy_pass        http://localhost:9001;
        proxy_set_header  X-Real-IP  $remote_addr;
    }
}

这种方法可以让您将任意数量的服务“拼接”在一起,并在外部调用者面前显示为一个。例如,为static 下的静态文件资产和/ 下不匹配的所有内容提供一个前置 HTML 服务器:

    location /static/ {
        alias /app/myapp-pages/static;
    }

    location / {
        proxy_pass        http://localhost:8000;
        proxy_set_header  X-Real-IP  $remote_addr;
    }

有了它:

Public URL              -> maps to -> internal URL
http://api.publicname.com/myapione -> http://localhost:9000
http://api.publicname.com/myapitwo -> http://localhost:9001
http://api.publicname.com/static   -> local file assets
http://api.publicname.com/...      -> http://localhost:8000

这不会做任何负载平衡,但您可以将其他服务放在执行负载平衡的某个 host:port 上,然后将 nginx 指向它。

ZXTM 产品很有趣,因为它同时进行了上述代理和负载平衡。 (我并不赞同它超过其他任何东西,只是我已经看到它在生产中使用并且令人印象深刻。)

请注意,Play 虽然非常出色,但更适合呈现页面并提供更高级别的 API,该 API 结合了对较低 HTTP 服务的调用。可以使用 DropWizard 之类的工具包编写较低级别的 HTTP 服务,该工具包只专注于提供 API 而不是页面。

【讨论】:

    【解决方案2】:

    Play 不管理虚拟主机概念。如果需要,您必须使用 HTTP 前端服务器:Apache、Nginx、Varnish

    例如在 Nginx 中:

    server {
      listen: 80
      server_name main.virtual.host alias.virtual.host;
    
      proxy_pass http://localhost:3000;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-08
      • 2013-08-24
      • 2016-10-08
      • 2017-05-17
      • 1970-01-01
      • 2016-04-26
      • 2022-12-09
      • 2016-06-02
      相关资源
      最近更新 更多