部署应用程序的分离前端+后端

时间:2014-10-11 08:10:42

标签: angularjs nginx playframework proxy

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

  1. 基于Place Framework并提供请求的API 输入:/api/*给任何客户。
  2. 基于使用AngularJS
  3. 构建的grunt build的分离前端

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

    我已经在网上看到了一些有关此问题的讨论,我仍然希望通过这些讨论来了解哪种方法可以用于此类部署。

    最终,我喜欢面向服务的架构,我希望能够灵活地将事情进一步解耦。

1 个答案:

答案 0 :(得分:2)

我已经构建并部署了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应用程序。我的角度应用程序位于Play应用程序的/app/assets/javascripts文件夹中。这有利有弊(我非常喜欢你把它完全分开的想法)。我对/assets块所做的事情是允许nginx直接提供静态内容,因为当nginx做得很好时,Play服务似乎很愚蠢。

它在您的方案中并不那么重要,但对于其他拥有Play内部所有内容的人来说,为了使上述服务静态资产策略起作用,部署过程需要从public目录解压缩由play dist制作的存档,类似这样的内容(摘自我的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;
    }
}