Когда на одном сервере находиться несколько одновременно работающих 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 и интересна его реализация, прошу под кат.
Программа просматривает директории на наличие каталогов, и в каждом найденном подключает файл .index.js, если он есть. Корневой файл .index.js может содержать роутинг путей для сайта, обычно именно с него начинается вся серверная логика. При подключении он должен экспортировать объект app, это незапущенный http-сервер приложения, который потом передается библиотеке connect.vhost. С помощью connect.vhost осуществляется роутинг для доменных имен.
Стандартное шаблонное содержание файла .index.js может быть таким:
Аналогично это будет работать с express или connect:
Если от какого-либо сайта придет не перехваченная ошибка, процесс для всех не завершиться, благодаря универсальной конструкции:
Таким образом, мы имеем возможность запускать набор веб-приложений написанных на node.js. Каждый сайт сам делает себе роутинг путей и максимально независим. К тому же, нет никаких проблем запустить сайт на отдельном хостинге без помощи vhoster, добавив в код .index.js следующие условие:
Прежде чем использовать данную технологию, нужно понимать ее главный недостаток. У всех сайтов будет общая глобальная область и одинаковые права. Если это недопустимо для подключаемых веб-приложений, то их нужно запускать как отдельные новые программы от имени разных пользователей.
Исходный код и небольшой тест программы можно найти на https://github.com/dkiyatkin/node-vhoster. Или ее можно установить с помощью npm:
Любые предложения и пожеланию по коду приветствуются.
Все подключаемые веб-приложения должны быть легко переносимы на отдельный хостинг. Необходима поддержка как отдельных доменных имен, так и поддоменов для определенного доменного имени.
Допустим, есть две директории, в которых находятся веб-приложения:
— /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
Любые предложения и пожеланию по коду приветствуются.