angularjs nodejs app的最佳部署架构

时间:2013-11-14 17:54:17

标签: node.js angularjs

我在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 Server上(localhost:8000)。 b)在Node.js上的自身http服务器上(localhost:3000)。
  2. 哪种架构最适合生产使用 - 两个独立的服务器用于客户端和服务器端,或者只有一个?
  3. 在服务器端使用跨源资源共享(CORS)是不错的做法(如果我应该使用两个独立的服务器)?
  4. 我应该怎样做才能将 http:// localhost:3000 / api / brands 硬编码到服务器端(最佳做法)?

3 个答案:

答案 0 :(得分:13)

  1. Node.js的
  2. 一台服务器将更易于维护。为了优化,您可以在以后根据需要使用nginx缓存静态文件。 (只需搜索'nginx Node.js static',但如果你有轻量流量而不是大量的静态文件,它将正常工作。)我不会用Apache做任何事情。
  3. 以下是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. 端口将是相同的,因此这不是问题。

答案 1 :(得分:12)

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

enter image description here

(A)在图中。

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

(B)在图中。

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

我希望这可以解答你的所有问题。

答案 2 :(得分:6)

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

Ans: 您不需要将nodejs作为self hosted.instead运行nodejs通过Apache服务器并使用fusion passenger也是如此。 fusion passenger将永远负责在后台运行您的节点应用程序。我个人更喜欢Nginx + fusion用于我的nodejs应用程序。

哪种架构最适合生产使用 - 客户端和服务器端的两个独立服务器或仅一个?

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

在服务器端使用跨源资源共享(CORS)是不错的做法(如果我应该有两个独立的服务器)?

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

我应该怎样做才能将http://localhost:3000/api/brands硬地址代码服务器端(最佳做法)?

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

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
      }
    });
  }]);