Лучшая архитектура развертывания для приложения 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 на серверной стороне (лучшая практика)?
Ответы
Ответ 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;
}
}
- Вам не потребуется CORS с одним.
- Порты будут одинаковыми, так что это не проблема.
Ответ 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
}
});
}]);