Подтвердить что ты не робот

Лучшая архитектура развертывания для приложения angularjs nodejs

У меня есть приложение Moto Adverts в angularjs и nodejs. Angularjs-client-side работает на HTTP-сервере Apache (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'));
});

Мои вопросы:

  • Что мне нужно сделать, чтобы запустить клиентскую и серверную стороны на одном сервере. a) На HTTP-сервере Apache (localhost: 8000). b) На сервере node.js self http на (localhost: 3000).
  • Какая архитектура будет лучшей для использования в производстве - два независимых сервера для клиентской и серверной сторон или только один?
  • Хорошо ли использовать совместное использование ресурсов Cross-origin (CORS) на стороне сервера (если мне нужно два автономных сервера)?
  • Что я должен сделать, чтобы не жестко кодировать адрес http://localhost: 3000/api/brands на серверной стороне (лучшая практика)?
4b9b3361

Ответ 1

  • Node.js
  • Один сервер будет более ремонтопригодным. Для оптимизации вы можете кэшировать статические файлы с помощью 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, как я писал на моем рисунке. С другой стороны, вы можете использовать сервер node только для динамического содержимого и использовать apache для обслуживания статических файлов, включая ваши коды на стороне клиента, если хотите. Но если вы это сделаете, вам нужен сервер Apache ВСЕГДА, даже когда вы разрабатываете свое приложение. Я чувствую, что это будет хлопотно.

(B) на рисунке.

Вы можете обслуживать ваши коды на стороне клиента, включая другие статические файлы, размещая их в каталоге public. Если вы решите обслуживать все файлы с сервера nodejs, вы можете разрабатывать без apache и избегать записи определенного номера порта в вашем коде. Я думаю, что ваш код приложения не должен осознавать номер порта, который вы будете использовать.

Надеюсь, это может быть ответом на все ваши вопросы.

Ответ 3

Что я должен сделать, чтобы запустить клиентскую и серверную стороны на одном сервере. a) На HTTP-сервере Apache (localhost: 8000). b) На сервере Node.js self http on (localhost: 3000).

Ans: вам не нужно запускать nodejs как self hosting.instead, запускать nodejs через сервер Apache и использовать Fusion-пассажир. Fusion-пассажир позаботится о том, чтобы запустить ваше приложение node в фоновом режиме навсегда. Лично я предпочитаю Nginx + fusion для своих приложений nodejs.

Какая архитектура будет наилучшей для использования в производстве - два независимых сервера для клиентской и серверной сторон или только один?

Ans: Я не понимаю, что вы имеете в виду, имея два сервера для клиента и один для серверных. Сохраняйте код клиента и сервера на одном сервере.

Хорошо ли использовать совместное использование ресурсов Cross-origin (CORS) на стороне сервера (если у меня должно быть два независимых сервера)?

Ans:, если ваш сервер и ваш клиент находятся в одном домене, тогда вам не нужно беспокоиться о CORS, но если в будущем вы захотите открыть свой API для любого из ваших клиентских приложений, вам нужно будет сделать конфигурации CORS.

Что я должен сделать, чтобы не указать жесткий адрес http://localhost:3000/api/brands на стороне сервера (лучшая практика)?

Ans: Я использую константу для объявления моего базового пути, а затем выполняю DI в моих службах и factory, которые вызывают вызовы 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
      }
    });
  }]);