Использование nginx как сервера-сборщика Основная секция
Тезисы
На многих современных сайтах, особенно борющихся за высокое звание портала, страница состоит из блоков взятых из разных частей проекта, с разных хостов, с других проектов, а так же различающихся временем жизни, способом кеширования и стратегией обновления. Яркий пример - mail.ru. В этих условиях обычный способ "страница целиком создаётся одним скриптом" работает плохо и требует множества подпорок.
Естественным решением видится создание сервера, умеющего собирать страницу из "кусочков", поступающих из разных источников. Как назвать подобный сервер не совсем понятно, видимо ближе всего aplication server или integration server, мне нравится название "сервер-сборщик".
К сожалению, open sourse реализаций мне неизвестно. Из пропиетарных в эту концепцию укладываются яндексовский XScript и мейлрушный BarterTown.
XScript нам недоступен (и не надо), в BarterTown на мой взгляд неудобно задаются источники. Стали искать альтернативу.
Первая стадия: nginx с модулем ngx_http_ssi_module
У модуля ngx_http_ssi_module есть возможность делать include с удалённого хоста. Отсутствие в nginx кеширования обошли использованием кешируещего прокси между фронтендом и бекендом, невозможность в ssi разобрать параметры запроса и куки - запросом к бекенду с возращением им ssi-ных команд.
Получился простой, лёгкий, бесплатный и open source сервер-сборщик. Работает замечательно, но есть серьёзное ограничение: ssi поддерживает только строковые переменные и не поддерживает циклов.
Вторая стадия: nginx с самописным модулем.
Написали модуль понимающий HTML::Template-подобный язык шаблонов и поддерживающий получение по HTTP сложно структурированных данных (в формате JSON). Теперь тривиально скажем получить с бекенда массив хешей статей и в цикле вывести их. Как бонус - шаблоны на бекенде становятся не нужны. Модуль пока в экспериментальной стадии, в будущем планируется добавить кеширование (как шаблонов, так и полученных данных) и поддержку других форматов (XML, CSV).