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 вверху и; внизу, чтобы быть действительной директивой.


Остерегайтесь задержек / задержек поиска / использования ОЗУ, если вы делаете это. Я провел некоторое тестирование с большими списками (около 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


Спасибо, но я не могу объявить свой список пользовательских доменов в одном регулярном выражении. имя_сервера [zeus.domain.com | poseidon.domain.com | etc ...]; Это было бы слишком долго.
Фред

1
@fred Можете ли вы привести пример набора данных? если ни один из доменов не будет похож на другой, я буду совершенно уверен, что шаблон Regex решит вашу проблему.
Онейрой

@Oneiroi: пример использования = пользовательские субдомены. Представьте себе продукт «программное обеспечение как услуга», в котором каждый пользователь получает свой собственный поддомен, и вы хотите использовать Nginx для маршрутизации их на разные серверы. В этом случае ни один домен не похож на другой.
м.стента

@ m.stenta ах, справедливо. Если в поддоменах нет общего, то да, регулярное выражение не сработает. Или вам нужно будет связать создание регулярного выражения, полученного из самого домена, который imho побеждает цель.
Онейрой
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.