У меня есть «архивный» сервер для старых сайтов, которые больше не используются, но я хочу, чтобы они были в сети как часть моего резюме / портфолио.
Для них требуются разные версии и настройки apache и php, поэтому я запускаю несколько apache на разных портах за обратным прокси-сервером nginx.
Однако не так часто эти сайты посещают. Между посещениями может пройти несколько дней или даже недель, поэтому я думаю, что постоянная работа всех этих экземпляров apache - это большая трата памяти и процессора.
Я бы хотел заставить nginx запускать соответствующий сервер apache по запросу. Может быть, примерно так:
Я хочу, чтобы демон apache был загружен с PHP в качестве модуля. Я хочу, чтобы при просмотре сайтов посетитель работал быстро и хорошо, однако пара секунд загрузки при первом запросе не проблема. Некоторые сайты очень интенсивно используют AJAX, поэтому загрузка apache для каждого запроса невозможна.
Я не нахожу очевидного способа сделать это. Есть ли у кого-нибудь идеи или опыт по подобной установке? Существуют ли другие программы обратного прокси (кроме nginx), которые могли бы это сделать?
(Конечно, мне также понадобится способ выключить apache при бездействии, но это довольно просто с заданием cron, просто проверяющим, произошло ли что-то в apache access.log.)
Кстати .. На сервере работает Debian Lenny.
Изменить / мое решение:
Я решил эту проблему, написав скрипт с https://github.com/nodejitsu/node-http-proxy для node.js.
// I'm using http-proxy to make the proxying:
var server = httpProxy.createServer(function (req, res, proxy) {
var domain = getDomain(req);
proxy.proxyRequest(req, res, {
host: '127.0.0.1',
port: configuration[domain].port
});
}).listen(80);
// And a error handler, which will start apache on deman:
server.proxy.on('proxyError', function(err, req, res) {
if (err.errno == 'ECONNREFUSED') {
// Start apache using exec()
}
});
Альтернативный подход может заключаться в запуске apache с помощью вызова сценария, определенного в inetd.conf.
Этот подход подробно описан в статье. Запуск Lighttpd по запросу, который, хотя и ориентирован на Lighttpd, может быть применен к вашей версии apache.
В статье выше содержится скрипт для запуска веб-сервера Lighttpd по ссылке на данный порт, где, вероятно, нужно заменить lighttpd на apachectl. В нем также подробно описаны некоторые идеи о том, как его можно также автоматически выключить, чтобы он не работал вечно.
Если этот подход применим к вашему случаю, вы можете подумать о добавлении вашей строки конфигурации inetd.conf и скриптов в свой пост для будущих читателей.
Вы можете запустить apache через inetd (или xinetd). См. Директиву ServerType в документации по конфигурации apache.
При запуске службы TCP через inetd вы запускаете процесс для каждого запроса. Итак, когда нет запросов, нет процессов apache. inetd может прослушивать все соответствующие порты.