适用于angularjs nodejs应用程序的最佳部署体系结构

我有Moto Adverts应用程序在angularjs和nodejs。 Angularjs客户端在Apache HTTP Server(localhost:8000)上运行,但nodejs-server-side以node.js http服务器(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 /品牌到服务器端(最佳实践)?

       

网上收集的解决方案 "适用于angularjs nodejs应用程序的最佳部署体系结构"

  1. Node.js的
  2. 一台服务器将更易于维护。 如果需要,为了优化您可以在之后使用nginxcaching静态文件。 (只要search'nginx的Node.js静态',但它会正常工作,如果你有轻的stream量,而不是一吨静态文件)。 我不会使用Apache的任何东西。

这里是一个nginxconfiguration示例:

 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. 港口将是相同的,所以这不是一个问题。

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

在这里输入图像描述

(A)在图中。

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

(B)。

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

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

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

答: 你不需要将nodejs作为自己的hosts来运行,而是通过Apache服务器来运行nodejs,也可以使用fusion乘客。 融合的乘客将永远照顾在后台运行你的节点应用程序。 就我个人而言,我更喜欢Nginx + fusion为我的nodejs应用程序。

哪种体系结构最适合用于生产 – 为客户端和服务器端提供两个独立的服务器,还是只有一个服务器?

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

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

Ans: 如果你的服务器和你的客户端在同一个域中,那么你不需要担心CORS,但是如果将来你想把你的API暴露给你的任何客户端应用程序,那么你需要做CORSconfiguration。

我应该做的不是硬编码地址http:// localhost:3000 / api /品牌到服务器端(最佳实践)?

Ans: 我使用常量来声明我的基本path,然后在我的服务和工厂进行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 } }); }]);