Pull to refresh

Comments 19

Это решение совершенно не подходит для production-использования.

Конкретнее:
— Рано или поздно потребуется создавать более сложные правила поведения (например ограничение частоты запросов для одного ip-адреса, кеширование ответов целиком). Нагружать всеми этими условиями event loop одного приложения — плохая идея.
— Отдача статических файлов нужна 99.9% сайтов. Делать это при помощи node.js далеко не лучший способ.
— Перезагрузить 1 сайт в вашем случае не получится. На время перезапуска будут остановлены все сайты.
— Все сайты запускаются в одном процессе и имеют общий event loop. Тормоз в одном из них приведёт к тормозам во всех.
— Переполнение памяти в одном из сайтов уронит все сайты.

А самое главное, это всё очень просто реализуется при помощи nginx без костылей, велосипедов и нагрузки приложения лишним функционалом к нему не относящимся.
Конечно, я не утверждаю что это надо использовать на production, для серьезных проектов такая простая схема не подходит, это очевидно, и в конце статьи перечислены ограничения.
Запущенный node.js сервер без проблем можно проксировать через nginx с его правилами.
Все только для удобства разработки, ничего лишнего.
Разработка в середе отличной от той, в которой будет использоваться приложение чревата последствиями. На сервере для разработки nginx установлен 1 раз. Файл конфигурации для каждого сайта отличается только путём к www-root, портом для проксирования и кастомными настройками. Копипастом это делается за пару минут и забывается об этом на весь цикл разработки.

По поводу удобства разработки с таким решением тоже не согласен. Кроме озвученного выше несоответствия production-окружения и окружения разработки, есть ещё такие моменты как существенное затруднение отладки кода с помощью дебагера, т.к. трейсы будут содержать кучу мусора совершенно не относящегося к логике текущего приложения. Можно очень долго гоняться за утечкой памяти, которая происходит в другом приложении. Время перезапуска нескольких сайтов больше времени перезпуска одного сайта, что увеличивает время ожидания.
Этот метод делает ровно то, что он делает, и не претендует на большее. Мне он пригодился и в определенных ситуациях был удобен.
Ваше право с ним не согласиться и не использовать.
Здравствуйте, BVadim! А можно попросить в двух словах, как сделать аналог (того, что написал автор поста) при помощи nginx? Структуру опишите.
Так делать не надо. Как уже выше сказали, нужно использовать nginx, или HA Proxy или любой иной аналогичный продкут.
Хотите изоляции более высокого уровня — наймите админа для настройки виртуальных серверов или jails.
А можно попросить в двух словах, как сделать аналог (того, что написал автор поста) при помощи nginx? Структуру опишите.
Все тривиально, запускаете nginx и указываеме ему в качестве upstream (директива rtfm) все ваши серверы Node.
Пока не понятно.

Во-первых что за еще «ваши серверы Node»? У меня один сервер на котором допустим 5 приложений, которые заняли 5 портов.

Во-вторых я правильно вас понял, что вы предлагаете одновременный запуск 5-ти копий node? То есть чтобы они заняли 5 портов, а nginx перенаправлял запросы на них по своим правилам (допустим с пяти доменов на каждую копию).
я предполагаю одну копию node на одно процессорное ядро. Это стандартно для Unix.
А можно спросить, каким образом это делается? Я так думал что если второй раз запущу node, то в ОЗУ появится его вторая копия. Собственно по этой причине заинтересовал скрипт автора статьи. И к сожалению не знал, что как-то можно этого избежать другим способом.
Лень уже обьяснть. попробуйте хотя бы 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);
}
Не надо разжевывать, хотя бы направление поисков задайте) Спасибо за ответ. Попробую node cluster.
Кластеризация не подходит для решения проблемы. Там так называемые воркеры вызываются случайным образом. А мне нужно, как и автору статьи, чтобы воркер был привязан к домену. Если запрос приходит с домена № 1, то должен запускаться воркер № 1, но никак №2 и прочие… Кластеризация для масштабирования веб-приложения, но никак не для создания виртуального хостинга…
Тоже рассматривал этот вариант. Но когда будет 100 сайтов — в ОЗУ будут 100 копий node.js. Сейчас одно приложение занимает 60-80Мб, это нужно будет 8Гб ОЗУ… У меня нет столько ОЗУ…
1) Для uncaughtException у express.js есть специальный плагин.
2) Forever + Cluster API (Node) + upstart/rc.d/init.d/w.e.
Каким образом, кластеризация может решить проблему с запуском разных воркеров для разных доменов??? Кластеризация ведь нужна для масштабирования, а не для создания виртуальных хостов… Или я чего-то не догоняю?
Sign up to leave a comment.

Articles