Comments 19
Это решение совершенно не подходит для production-использования.
Конкретнее:
— Рано или поздно потребуется создавать более сложные правила поведения (например ограничение частоты запросов для одного ip-адреса, кеширование ответов целиком). Нагружать всеми этими условиями event loop одного приложения — плохая идея.
— Отдача статических файлов нужна 99.9% сайтов. Делать это при помощи node.js далеко не лучший способ.
— Перезагрузить 1 сайт в вашем случае не получится. На время перезапуска будут остановлены все сайты.
— Все сайты запускаются в одном процессе и имеют общий event loop. Тормоз в одном из них приведёт к тормозам во всех.
— Переполнение памяти в одном из сайтов уронит все сайты.
А самое главное, это всё очень просто реализуется при помощи nginx без костылей, велосипедов и нагрузки приложения лишним функционалом к нему не относящимся.
Конкретнее:
— Рано или поздно потребуется создавать более сложные правила поведения (например ограничение частоты запросов для одного ip-адреса, кеширование ответов целиком). Нагружать всеми этими условиями event loop одного приложения — плохая идея.
— Отдача статических файлов нужна 99.9% сайтов. Делать это при помощи node.js далеко не лучший способ.
— Перезагрузить 1 сайт в вашем случае не получится. На время перезапуска будут остановлены все сайты.
— Все сайты запускаются в одном процессе и имеют общий event loop. Тормоз в одном из них приведёт к тормозам во всех.
— Переполнение памяти в одном из сайтов уронит все сайты.
А самое главное, это всё очень просто реализуется при помощи nginx без костылей, велосипедов и нагрузки приложения лишним функционалом к нему не относящимся.
+9
Конечно, я не утверждаю что это надо использовать на production, для серьезных проектов такая простая схема не подходит, это очевидно, и в конце статьи перечислены ограничения.
Запущенный node.js сервер без проблем можно проксировать через nginx с его правилами.
Все только для удобства разработки, ничего лишнего.
Запущенный node.js сервер без проблем можно проксировать через nginx с его правилами.
Все только для удобства разработки, ничего лишнего.
0
Разработка в середе отличной от той, в которой будет использоваться приложение чревата последствиями. На сервере для разработки nginx установлен 1 раз. Файл конфигурации для каждого сайта отличается только путём к www-root, портом для проксирования и кастомными настройками. Копипастом это делается за пару минут и забывается об этом на весь цикл разработки.
По поводу удобства разработки с таким решением тоже не согласен. Кроме озвученного выше несоответствия production-окружения и окружения разработки, есть ещё такие моменты как существенное затруднение отладки кода с помощью дебагера, т.к. трейсы будут содержать кучу мусора совершенно не относящегося к логике текущего приложения. Можно очень долго гоняться за утечкой памяти, которая происходит в другом приложении. Время перезапуска нескольких сайтов больше времени перезпуска одного сайта, что увеличивает время ожидания.
По поводу удобства разработки с таким решением тоже не согласен. Кроме озвученного выше несоответствия production-окружения и окружения разработки, есть ещё такие моменты как существенное затруднение отладки кода с помощью дебагера, т.к. трейсы будут содержать кучу мусора совершенно не относящегося к логике текущего приложения. Можно очень долго гоняться за утечкой памяти, которая происходит в другом приложении. Время перезапуска нескольких сайтов больше времени перезпуска одного сайта, что увеличивает время ожидания.
+4
Здравствуйте, BVadim! А можно попросить в двух словах, как сделать аналог (того, что написал автор поста) при помощи nginx? Структуру опишите.
0
Так делать не надо. Как уже выше сказали, нужно использовать nginx, или HA Proxy или любой иной аналогичный продкут.
+1
Хотите изоляции более высокого уровня — наймите админа для настройки виртуальных серверов или jails.
+1
А можно попросить в двух словах, как сделать аналог (того, что написал автор поста) при помощи nginx? Структуру опишите.
0
Все тривиально, запускаете nginx и указываеме ему в качестве upstream (директива rtfm) все ваши серверы Node.
0
Пока не понятно.
Во-первых что за еще «ваши серверы Node»? У меня один сервер на котором допустим 5 приложений, которые заняли 5 портов.
Во-вторых я правильно вас понял, что вы предлагаете одновременный запуск 5-ти копий node? То есть чтобы они заняли 5 портов, а nginx перенаправлял запросы на них по своим правилам (допустим с пяти доменов на каждую копию).
Во-первых что за еще «ваши серверы Node»? У меня один сервер на котором допустим 5 приложений, которые заняли 5 портов.
Во-вторых я правильно вас понял, что вы предлагаете одновременный запуск 5-ти копий node? То есть чтобы они заняли 5 портов, а nginx перенаправлял запросы на них по своим правилам (допустим с пяти доменов на каждую копию).
0
я предполагаю одну копию node на одно процессорное ядро. Это стандартно для Unix.
0
А можно спросить, каким образом это делается? Я так думал что если второй раз запущу node, то в ОЗУ появится его вторая копия. Собственно по этой причине заинтересовал скрипт автора статьи. И к сожалению не знал, что как-то можно этого избежать другим способом.
0
Лень уже обьяснть. попробуйте хотя бы node cluster.
var cluster = require('cluster');
var http = require('http');
var numCPUs = require('os').cpus().length;
if (cluster.isMaster) {
// Fork workers.
for (var i = 0; i < numCPUs; i++) {
cluster.fork();
}
cluster.on('exit', function(worker, code, signal) {
console.log('worker ' + worker.process.pid + ' died');
});
} else {
// Workers can share any TCP connection
// In this case its a HTTP server
http.createServer(function(req, res) {
res.writeHead(200);
res.end("hello world\n");
}).listen(8000);
}
0
Не надо разжевывать, хотя бы направление поисков задайте) Спасибо за ответ. Попробую node cluster.
0
Кластеризация не подходит для решения проблемы. Там так называемые воркеры вызываются случайным образом. А мне нужно, как и автору статьи, чтобы воркер был привязан к домену. Если запрос приходит с домена № 1, то должен запускаться воркер № 1, но никак №2 и прочие… Кластеризация для масштабирования веб-приложения, но никак не для создания виртуального хостинга…
0
1) Для uncaughtException у express.js есть специальный плагин.
2) Forever + Cluster API (Node) + upstart/rc.d/init.d/w.e.
2) Forever + Cluster API (Node) + upstart/rc.d/init.d/w.e.
0
Sign up to leave a comment.
Запуск нескольких node.js сайтов на одном сервере