Назад | Перейти на главную страницу

Насколько дороги переменные nginx?

nginx FAQ Есть ли правильный способ использовать переменные nginx, чтобы сделать разделы конфигурации короче, используя их в качестве макросов для работы частей конфигурации как шаблонов? ) говоря (мой жирный шрифт):

В: Есть ли правильный способ использовать переменные nginx, чтобы сделать разделы конфигурации короче, используя их в качестве макросов, чтобы части конфигурации работали как шаблоны?

О: Переменные не должны использоваться как макросы шаблона. Переменные оцениваются во время выполнения во время обработки каждого запроса, поэтому они довольно дороги по сравнению с простой статической конфигурацией.. Использование переменных для хранения статических строк также является плохой идеей. Вместо этого следует использовать расширение макроса и директивы include для более простой генерации конфигураций, и это можно сделать с помощью внешних инструментов, например sed + make или любой другой распространенный механизм шаблонов.

Например вместо одного сверхдлинного add_header Content-Security-Policy для лучшей читаемости я использую:

set $CSP "default-src 'none'";

set $CSP "${CSP}; connect-src 'self'";

set $CSP "${CSP}; script-src 'self' https://*.domain.org 'unsafe-inline' 'unsafe-eval'";

set $CSP "${CSP}; style-src 'self' https://*.domain.org 'unsafe-inline'";

set $CSP "${CSP}; img-src 'self' data: https://*.domain.org";

set $CSP "${CSP}; font-src 'self' https://*.domain.org";

## CSP closing colon.
set $CSP "${CSP};";

add_header Content-Security-Policy "$CSP";

Насколько правильное использование переменной повлияет на производительность nginx? Проводились ли какие-либо тесты / исследования производительности по этому вопросу?

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

Итак, сначала настройте конфигурацию, в которой желаемый CSP устанавливается за один раз.

Протестируйте конфигурацию, используя, например, Siege: https://github.com/JoeDog/siege

Затем настройте конфигурацию, как в вашем вопросе, и снова запустите тот же тест производительности.

Таким образом, вы можете получить точный ответ для своей установки.

В любом случае я рекомендую вам создать файл конфигурации с помощью системы управления конфигурацией, такой как Ansible, Chef или Puppet. В исходном коде вы можете разделить строки как хотите, но конечный результат будет оптимальным для nginx.

Переменные оцениваются во время выполнения во время обработки каждого запроса.

Представьте себе каждый запрос, который вы должны получить и сохранить переменную из памяти или во время выполнения, сколько времени и памяти вам нужно потратить? Может быть, если у вас есть несколько запросов, это не важно, но если у вас так много запросов, это будет очень важно.

Это похоже на открытую статическую плоскость против динамического файла. Нет ничего быстрее, чем прямой доступ к простому файлу.

В вашем случае вы используете переменную, а затем устанавливаете ее столько раз. Я не могу протестировать сам Nginx из-за отсутствия инфраструктуры, но я хочу поделиться тестом PHP-скрипта этого набора для аналогии с вашим случаем.

Вы хотите установить этот текст:

default-src 'нет'; connect-src 'сам; script-src 'сам' https: //.domain.org 'unsafe-inline' 'unsafe-eval'; style-src 'сам' https: //.domain.org 'небезопасный встроенный'; img-src 'собственные' данные: https: //.domain.org; font-src 'сам' https: //.domain.org;

с PHP вы можете установить его, используя этот код:

$csp = "default-src 'none'; connect-src 'self; script-src 'self' https://*.domain.org 'unsafe-inline' 'unsafe-eval'; style-src 'self' https://*.domain.org 'unsafe-inline'; img-src 'self' data: https://*.domain.org; font-src 'self' https://*.domain.org;";

Но по некоторым причинам вы хотите установить несколько раз, прежде чем устанавливать реальный выход. Итак, код будет таким:

$csp =  "default-src 'none'";
$csp = $csp."; connect-src 'self'";
$csp = $csp."; script-src 'self' https://*.domain.org 'unsafe-inline' 'unsafe-eval'";
$csp = $csp."; style-src 'self' https://*.domain.org 'unsafe-inline'";
$csp = $csp."; img-src 'self' data: https://*.domain.org; font-src 'self' https://*.domain.org";
$csp = $csp.";";

Я запускаю 1-й код, используя цикл 10 миллионов раз, и берет 0.0725793838500982 секунды и второй код принимает 1.049282026290894 секунды. Итак, второй код занимает около В 15 раз медленнее. И он просто показывает эталонное время запроса, а не эталонный тест использования памяти, ЦП, диска или любого другого ресурса. возможно, второй код тоже потребует гораздо больше ресурсов, чем первый.

Как и в PHP, это также произойдет и во время выполнения Nginx. Как сказано в документации Nginx Использование переменных для хранения статических строк дорогое, а также плохая идея.. Если это то же самое, что и аналогия с PHP выше, стоимость В 15 раз медленнее