Nginx: тисяча імен сервера


12

як я можу налаштувати Nginx, обмежившись тисячами різних імен сервера, не створюючи тисячі зовнішніх файлів конфігурації або записавши дуже довгий рядок імені сервера?

Дійсно, я хотів би, щоб Nginx був реверсивним проксі-сервером лише для server1.com, server2.com тощо.

Найкращим рішенням для мене було б мати єдиний зовнішній файл конфігурації, що містить мої імена з обмеженими серверами: server1.com, server2.com тощо.

Це можливо ?


Добре, дякую за відповіді, працює без рег. вирази. Просто великий список імен сервера, як пояснив kolbijack. Дякую.


Ви повинні прийняти відповідь, коли він допоміг.
Онейрой

Відповіді:


19

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

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

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

Файл_імена_сервера просто потребує імені_сервера вгорі і; внизу, щоб бути чинною директивою.


Остерігайтеся затримок / затримок пошуку / використання оперативної пам’яті, якщо ви це зробите. Я провів тестування з великими списками (близько 5000 ServerAliasдиректив і до 16 мільйонів Deny fromдиректив) в Apache. 5000 доменів призводить до вимірної, але невеликої затримки. Збільшуючи кількість, я виявив, що затримка стала помітною приблизно в 50000. Що стосується Apache (і, мабуть, також з nginx), список ведеться в оперативній пам'яті, що означало, що з найбільшим набором, який я намагався, я міг запустити лише один дочірній процес в межах своєї доступної оперативної пам'яті.
Ladadadada

1
@Ladadadada LOL Я щойно перевірив. Nginx використовує 30 Мб оперативної пам’яті для 100 000 доменів в server_nameдирективі і відповідаєRequest rate: 36900.6 req/s (0.0 ms/req)
VBart

1
60Mb за 1 000 000 іRequest rate: 34716.8 req/s (0.0 ms/req)
VBart

Це значно краще, ніж Apache впорався, принаймні, з префорком MPM. Корисно знати.
Ladadadada

7

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

Більше інформації про це можна переглянути тут: http://nginx.org/en/docs/http/server_names.html#regex_names


Дякую, але я не можу оголосити список власних доменів одним регулярним виразом. ім’я сервера [zeus.domain.com | poseidon.domain.com | тощо ...]; Це було б занадто довго.
Фред

1
@fred Чи можете ви навести приклад набору даних? якщо жоден домен взагалі не схожий на інший, я був би досить впевнений, що схема Regex вирішить вашу проблему.
Онейрой

@Oneiroi: приклад використання case = створені користувачем субдомени. Уявіть собі продукт програмного забезпечення як сервіс, де кожен користувач отримує свій піддомен, і ви хочете використовувати Nginx для їх маршрутування до різних серверів. У такому випадку жоден домен взагалі не такий, як інший.
m.stenta

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