Какой вариант конфигурации для nginx логичнее и предпочтительнее?
Всем привет.
Как раньше говорили, "странного хочется".
Для домашних нужд сделал конфигурацию, когда на мой ip смотрят несколько доменов. Причем домашние каталоги для этих доменов я могу переназначать динамически (настройки в базе). То есть, в какой-то момент у всех доменов один домашний каталог, потом я прописываю одному домену другой каталог. Потом еще одному прописываю свой каталог. Потом добавляю новый домен с еще одним домашним каталогом. Встал вопрос, как разруливать роутинг, так как использовать бакенд для роутинга я не хочу. Слишком просто )))
Пока у меня есть 2 решения, оба уже написаны и протестированы.
1. Через map файл для nginx. То есть, при любом чихе в сторону настроек доменов, (добавление нового, изменение рабочего каталога и так далее) для nginx генерится новый map файл с соответствием host - root_dir и новый файл со списком хостов, которые обрабатывать этим конфигом. Также создается семафор, на который реагирует ежеминутный скрипт в кроне, который перезагружает nginx.
2. Через lua скрипт в конфиге nginx, который лезет в редис, если там нет записи для домена, то лезет в postgres, берет оттуда соответствующую запись, складывает ее в редис с таймаутом, скажем, 5 минут и прописывает верный root для nginx
Работает и так и так, но я задумался, а какое из этих больше имеет право на жизнь? Что если доменов будет несколько тысяч? Несколько десятков тысяч? Несколько сотен тысяч? )))) Такого, конечно, не будет, но я хочу понять слабые стороны каждого решения (а может быть есть еще одно решение, которое и является оптимальным?)
В первом варианте я вижу проблему в слишком большом мап файле. Как быстро nginx будет обрабатывать мак файл размеров в пару мегабайт? В во втором варианте - постоянные запросы к базе. Можно, конечно, кешировать записи не по отдельному домену, а по всем, тогда мы сократим кол-во запросов к postgres, но "напряжем" redis :)
Можно поподробнее?
Возможно я не до конца описал. Может быть 5 доменов и у них 5 разных домашних каталогов. А в один прекрасный момент я меняю настройку в базе и уже становится всего 3 домашних каталога (несколько доменов используют один и тот же)
Boris Korobkov: а зачем инклюдить рут, если его можно прописать прямо в конфиге? Все равно же имеем, 1 домен - 1 конфиг. Да, решение в лоб, это в моем стиле, не подумать о таком )))
Но тогда мы будем плодить на 99.99 (иногда на 100%) одинаковые файлы. Неоптимально, как-то. И, опять же, где почитать про то, колько файлов nginx может нормально "скушать"?
а зачем инклюдить рут, если его можно прописать прямо в конфиге?
Тот скрипт, который генерирует root, знает только root. И не должен ничего знать про остальные настройки домена, которые админ может вручную прописать в основном конфиге домена.
И, опять же, где почитать про то, колько файлов nginx может нормально "скушать"?
Выяснить опытным путем. Мне кажется, что это будет порядка сотен тысяч файлов. Вряд ли ваш сервер выдержит столько доменов.