【问题标题】:The best deployment architecture for angularjs nodejs appangularjs nodejs 应用的最佳部署架构
【发布时间】:2013-11-27 21:17:21
【问题描述】:

我在 angularjs 和 nodejs 中有 Moto Adverts 应用程序。 Angularjs-client-side 在 Apache HTTP Server (localhost:8000) 上运行,但 nodejs-server-side 作为 node.js http server (localhost:3000) 运行。

一段客户端代码(angularjs):

var motoAdsServices = angular.module('motoAdsServices', ['ngResource']);

motoAdsServices.factory('Brand', ['$resource', function($resource) {
    return $resource('http://localhost\\:3000/api/:id', {}, {
      query: {
        method: 'GET',
        params: {
          id: 'brands'
        },
        isArray: true
      }
    });
  }]);

一段服务器端代码(nodejs):

var express = require('express');
var path = require('path');
var http = require('http');
var brands = require('./routes/brands');

var app = express();

var allowCrossDomain = function(req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "X-Requested-With");
  next();
};

app.configure(function() {
  app.set('port', process.env.PORT || 3000);
  app.use(express.logger('dev'));  /* 'default', 'short', 'tiny', 'dev' */
  app.use(express.bodyParser()),
  app.use(allowCrossDomain);
  app.use(express.static(path.join(__dirname, 'public')));
});

app.get('/api/brands', brands.findAll);

http.createServer(app).listen(app.get('port'), function() {
  console.log("Express server listening on port " + app.get('port'));
});

我的问题是:

  1. 如何在同一台服务器上运行客户端和服务器端。 a) 在 Apache HTTP 服务器 (localhost:8000) 上。 b) 在 (localhost:3000) 上的 Node.js 自我 http 服务器上。
  2. 哪种架构最适合生产使用 - 两个独立的服务器用于客户端和服务器端,还是只有一个?
  3. 在服务器端使用跨域资源共享 (CORS) 是否是一种好习惯(如果我应该有两个独立的服务器)?
  4. 我应该怎么做才能不将 http://localhost:3000/api/brands 硬编码到服务器端(最佳实践)?

【问题讨论】:

  • 在进行 ajax 调用时要注意跨域问题。以后最好设计一个瘦代理来将ajax请求路由到你的服务器端。
  • 我会在 Node.js 的 3000 端口上托管(客户端和服务器代码),并通过 Apache 在端口 80 上代理它们。然后您可以要求 Apache 缓存您的静态资产(如客户端 JS 和CSS ),这样你就可以两全其美。
  • @sza 你说的瘦代理是什么意思?
  • @lukpaw 一个轻量级服务器端逻辑放在每个客户端的同一主机上,用于路由请求。
  • @Hector Correa 如何在 Node.js 中同时托管两者?扩展我的服务器端代码以服务客户端?将 web-server.js 写入服务器所有内容?你知道一些关于它的模式或文章吗?

标签: node.js angularjs


【解决方案1】:
  1. Node.js
  2. 一台服务器将更易于维护。如果需要,您可以稍后使用 nginx 缓存静态文件以进行优化。 (只需搜索“nginx Node.js static”,但如果您的流量较小且没有大量静态文件,则它可以正常工作)。我不会将 Apache 用于任何事情。

这是一个示例 nginx 配置:

server {
  listen 80;
  server_name myserver.net;

  root /mnt/app;
  index index.html index.htm;

  location /static/ {
       try_files $uri $uri/ =404;
  }

  location /api/ {
       proxy_pass http://127.0.0.1:8080;
  }
}
  1. 您将不需要 CORS。
  2. 端口将相同,所以这不是问题。

【讨论】:

    【解决方案2】:

    我相信这是 apache nodejs angularjs 最流行的架构。

    图中的(A)。

    我建议您通过 nodejs 服务器提供所有文件,包括静态文件,正如我在图中所写的那样。 另一方面,您可以仅将节点服务器用于动态内容,并使用 apache 来提供静态文件,包括您的客户端代码(如果您愿意)。 但是如果你这样做了,即使你开发你的应用程序,你也总是需要 apache 服务器。感觉会很麻烦。

    图中的(B)。

    您可以通过将它们定位在public 目录中来提供包括其他静态文件在内的客户端代码。 如果您决定从 nodejs 服务器提供所有文件,则可以在没有 apache 的情况下进行开发,并避免在代码中编写特定的端口号。 我认为您的应用程序代码不应该知道您将使用的端口号。

    我希望这可以回答您的所有问题。

    【讨论】:

    • 感谢您的图表,这有助于理解将两个应用程序放在同一台服务器上的架构
    • 听到这个我毕业了!
    【解决方案3】:

    我应该怎么做才能在同一台服务器上运行客户端和服务器端。 a) 在 Apache HTTP 服务器 (localhost:8000) 上。 b) 在 (localhost:3000) 上的 Node.js 自我 http 服务器上。

    回答: 您不需要将 nodejs 作为自托管运行。而是通过 Apache 服务器运行 nodejs 并使用融合乘客。 fusion 乘客将永远在后台运行您的节点应用程序。就我个人而言,我更喜欢将 Nginx + fusion 用于我的 nodejs 应用程序。

    哪种架构最适合生产使用 - 两个独立的服务器用于客户端和服务器端,还是只有一个?

    回答: 我不明白你的意思是有两台服务器,一台用于客户端,一台用于服务器端。将您的客户端和服务器代码保存在单个服务器上。

    在服务器端使用跨域资源共享 (CORS) 是否是一种好习惯(如果我应该有两个独立的服务器)?

    Ans : 如果您的服务器和您的客户端在同一个域下,那么您无需担心 CORS,但如果将来您想将您的 API 公开给您的任何客户端应用程序,那么您将需要进行 CORS 配置。

    我应该怎么做才能不将地址 http://localhost:3000/api/brands 硬编码到服务器端(最佳实践)?

    回答: 我使用常量来声明我的基本路径,然后在我的服务和工厂中执行 DI,以进行 API 调用。

    motoAdsServices.constant("API", {
            "endpoint": "http://localhost:8080",
        })
    
    motoAdsServices.factory('Brand', ['$resource','API', function($resource,API) {
        return $resource(API.endpoint + '/api/:id', {}, {
          query: {
            method: 'GET',
            params: {
              id: 'brands'
            },
            isArray: true
          }
        });
      }]);
    

    【讨论】:

      猜你喜欢
      • 2022-01-16
      • 2015-01-18
      • 1970-01-01
      • 1970-01-01
      • 2022-01-06
      • 2020-09-19
      • 1970-01-01
      • 2013-05-07
      • 2011-01-04
      相关资源
      最近更新 更多