Как стать автором
Обновить

Запуск нескольких node.js сайтов на одном сервере

Время на прочтение2 мин
Количество просмотров15K
Когда на одном сервере находиться несколько одновременно работающих node.js сайтов, для них необходим общий механизм запуска. Наиболее простой вариант, а также наиболее производительный, это запуск одного приложения, которое подключает все нужные сайты. Механизм подключения должен быть без ограничений для создаваемых сайтов, и максимально простым. Он должен быть стабилен, при критической ошибке на одном из сайтов, другие все равно должны продолжать свою работу.
Все подключаемые веб-приложения должны быть легко переносимы на отдельный хостинг. Необходима поддержка как отдельных доменных имен, так и поддоменов для определенного доменного имени.

Допустим, есть две директории, в которых находятся веб-приложения:

/var/www/domains/, с каталогами site.ru, othersite2.ru и тд.
/var/www/subdomains/, с каталогами site3, othersite4 и тд.

Чтобы сайты были доступны по соответсвующим адресам (site.ru, othersite2.ru, site3.example.com, othersite4.example.com), потребуется запустить данную команду:

$ vhoster -n example.com -s /var/www/subdomains/ -d /var/www/domains/ --port 80 --host 0.0.0.0
vhost: site.ru
vhost: othersite2.ru
vhost: site3.example.com
vhost: othersite4.example.com

Для тех, кому нужен vhoster и интересна его реализация, прошу под кат.

Программа просматривает директории на наличие каталогов, и в каждом найденном подключает файл .index.js, если он есть. Корневой файл .index.js может содержать роутинг путей для сайта, обычно именно с него начинается вся серверная логика. При подключении он должен экспортировать объект app, это незапущенный http-сервер приложения, который потом передается библиотеке connect.vhost. С помощью connect.vhost осуществляется роутинг для доменных имен.

Стандартное шаблонное содержание файла .index.js может быть таким:

var http = require('http');
exports.app = http.createServer(function (req, res) {
	res.writeHead(200, {'Content-Type': 'text/plain'});
	res.end('Hello World\n');
});

Аналогично это будет работать с express или connect:

var connect = require('connect');
exports.app = connect().use(function(req, res) {
	res.end('hello world\n');
});

Если от какого-либо сайта придет не перехваченная ошибка, процесс для всех не завершиться, благодаря универсальной конструкции:

process.on('uncaughtException', function (err) {
	console.log('Caught exception: ' + err);
});

Таким образом, мы имеем возможность запускать набор веб-приложений написанных на node.js. Каждый сайт сам делает себе роутинг путей и максимально независим. К тому же, нет никаких проблем запустить сайт на отдельном хостинге без помощи vhoster, добавив в код .index.js следующие условие:

if (require.main === module) { // если веб-приложение запускается как отдельная программа
	exports.app.listen(80); // запустить сервер
}

Прежде чем использовать данную технологию, нужно понимать ее главный недостаток. У всех сайтов будет общая глобальная область и одинаковые права. Если это недопустимо для подключаемых веб-приложений, то их нужно запускать как отдельные новые программы от имени разных пользователей.

Исходный код и небольшой тест программы можно найти на https://github.com/dkiyatkin/node-vhoster. Или ее можно установить с помощью npm:

$ npm install vhoster
$ vhoster --help

Любые предложения и пожеланию по коду приветствуются.
Теги:
Хабы:
+6
Комментарии19

Публикации

Изменить настройки темы

Истории

Работа

Ближайшие события