Nginx: тысячи имя_сервера

12

Как я могу настроить ограничение Nginx тысячами различных server_name без создания тысяч внешних конфигурационных файлов или записи очень длинной строки server_name?

Действительно, я хотел бы, чтобы Nginx был обратным прокси-сервером только для server1.com, server2.com и т. Д.

Лучшим решением для меня было бы иметь один внешний файл конфигурации, содержащий мои ограниченные имена серверов: server1.com, server2.com и т. Д.

Является ли это возможным ?


Хорошо, спасибо за ваши ответы, работает без рег. выражения. Просто большой список server_name, как объяснил kolbijack. Спасибо.

Фред
источник
Вы должны принять ответ Колбиджак, если это тот, который помог.
Онейрой

Ответы:

19

Вы можете поместить директиву server_name в файл самостоятельно, а затем просто включить ее из своего блока сервера:

# example.com.conf
server {
  include /path/to/server_names;
  ...
}

# /path/to/server_names
server_name
  example.com
  domain.com
  foo.com
;

Файл server_names просто нуждается в server_name вверху и; внизу, чтобы быть действительной директивой.

kolbyjack
источник
Остерегайтесь задержек / задержек поиска / использования ОЗУ, если вы делаете это. Я провел некоторое тестирование с большими списками (около 5000 ServerAliasдиректив и до 16 миллионов Deny fromдиректив) в Apache. 5000 доменов дают измеримую, но небольшую задержку. Увеличивая число, я обнаружил, что задержка начала становиться заметной в пределах 50 000. В Apache (и, вероятно, также в nginx) список хранится в ОЗУ, что означало, что с самым большим набором, который я пробовал, я мог запустить только один дочерний процесс в моей доступной ОЗУ.
Ладададада
1
@Ladadadada LOL. Я только что проверил. Nginx использует 30 МБ ОЗУ для 100 000 доменов в server_nameдирективе и отвечаетRequest rate: 36900.6 req/s (0.0 ms/req)
VBart
1
60 Мб за 1 000 000 иRequest rate: 34716.8 req/s (0.0 ms/req)
VBart
Это значительно лучше, чем Apache, по крайней мере, с prefork MPM. Удобно знать.
Ладададада
7

server_nameОбъявление в вашем server {}блоке может быть регулярным выражением, это должно позволить вам соответствовать SERVER_NAME сек в пределах заданного шаблона.

Более подробную информацию об этом можно увидеть здесь: http://nginx.org/en/docs/http/server_names.html#regex_names

Oneiroi
источник
Спасибо, но я не могу объявить свой список пользовательских доменов в одном регулярном выражении. имя_сервера [zeus.domain.com | poseidon.domain.com | etc ...]; Это было бы слишком долго.
Фред
1
@fred Можете ли вы привести пример набора данных? если ни один из доменов не будет похож на другой, я буду совершенно уверен, что шаблон Regex решит вашу проблему.
Онейрой
@Oneiroi: пример использования = пользовательские субдомены. Представьте себе продукт «программное обеспечение как услуга», в котором каждый пользователь получает свой собственный поддомен, и вы хотите использовать Nginx для маршрутизации их на разные серверы. В этом случае ни один домен не похож на другой.
м.стента
@ m.stenta ах, справедливо. Если в поддоменах нет общего, то да, регулярное выражение не сработает. Или вам нужно будет связать создание регулярного выражения, полученного из самого домена, который imho побеждает цель.
Онейрой