【问题标题】:Deploying a decoupled front + backend of an application部署应用程序的前后端解耦
【发布时间】:2014-12-06 09:31:20
【问题描述】:

我使用两个完全解耦的组件编写了一个 Web 应用程序:

  1. 一个基于 Place Framework 并服务于以下请求的 API 输入:/api/* 给任何客户。
  2. 基于AngularJS 使用grunt build 构建的解耦前端

现在,前端与API 对话,但我希望这两个单元都部署在代理后面,例如nginx,可以将传入请求代理到相应的组件。例如,我希望将所有 /web/* 请求从包含所有客户端源(js/html/etc.)的 Web 目录和所有 /api/* 请求代理到我的 Play 框架服务器(我们需要将路径传递给服务器以确保返回正确的路径)以返回所有 API 相关数据。例如,像GET domain.com/api/users 这样的请求应该在内部代理到GET 127.0.0.1:9000/api/users。

我在网上看到了一些关于这个的讨论,我仍然想通过你们来看看哪种是这种部署的最佳方法。

最终,我想要一个面向服务的架构,并且我想要进一步解耦事物的灵活性。

【问题讨论】:

    标签: angularjs nginx playframework proxy


    【解决方案1】:

    我已经构建并部署了 Play Framework + AngularJS 应用程序,发现 nginx 是一个很好的方法。

    随着应用架构的发展,Nginx 还为您提供了处理更多服务的增长路径。例如,您可以为/api/user/* 添加专用服务,同时为所有其他/api/* 路由保留标准服务。

    在某些时候你可能需要使用商业产品,但就我现在和可预见的未来的需求而言,nginx 非常棒。

    我的 nginx 配置的相关部分是:

    server {
        listen       80;
    
        # Without this, Play serves the assets from within it's bundled jar. That's
        # fine and works but seems unnecessary when nginx can serve the files directly.
        location /assets {
            alias /app/live/my-play-app-here/active/public;
        }
    
        location / {
            proxy_pass            http://localhost:9000;
            proxy_set_header      X-Real-IP  $remote_addr;
        }
    }
    

    这里的关键部分是/assets URI 空间。您的可能会有所不同,因为您完全独立地打包 AngularJS 应用程序。我的 Angular 应用位于 Play 应用的 /app/assets/javascripts 文件夹中。这有利有弊(我非常喜欢你将其完全分开的想法)。我对/assets 块所做的事情是允许 nginx 直接提供静态内容,因为当 nginx 做得很好时,Play 似乎很愚蠢。

    这在您的场景中并不那么相关,但对于在 Play 中拥有一切的其他人来说,要使上述服务静态资产策略起作用,部署过程需要从 play dist 制作的存档中解压缩 public 目录,类似这样的内容(摘自我的 bash 部署脚本):

        unzip lib/$SERVICE_BASE_NAME.$SERVICE_BASE_NAME-$VERSION.jar "public/*"
    

    对于您的特定场景,以下内容可能是一个好的开始:

    server {
        listen       80;
    
        location /api {
            proxy_pass            http://localhost:9000;
            proxy_set_header      X-Real-IP  $remote_addr;
        }
    
        location / {
            alias /app/live/my-angularjs-app-here/active/public;
        }
    }
    

    【讨论】:

    • +1 在 nginx 上。我们使用 Play + EmberJS。不过,对 OP 的 URL 方法有一条评论。您可能会考虑将您的公共 Web 界面(例如 domain.com)和您的 API(例如 api.domain.com)使用的主机名分开。此外,如果您这样做,请注意 nginx。您需要设置 CORS 标头以允许 domain.com 使用调用 api.domain.com 上的 URL 的 javascript。另请参阅headers_more nginx 模块以正确设置。
    • 这对我来说就像一个魅力,有一些陷阱。 grunt 和我的关系似乎很糟糕——我在构建时遇到了严重的问题,而且我几乎总是以一个破损的包裹而告终。不过,这并不是一个严重的问题,因为我手动将丢失的组件复制到了dist/ 文件夹中。我后来通过向dist 中丢失的文件夹添加静态符号链接永久解决了这个问题。
    猜你喜欢
    • 2018-05-14
    • 2021-12-14
    • 1970-01-01
    • 2020-03-13
    • 2014-06-29
    • 2018-08-10
    • 1970-01-01
    • 2019-10-31
    • 1970-01-01
    相关资源
    最近更新 更多