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

Могут ли несколько операторов nginx находиться в одной строке файла конфигурации?

Эта проблема

Я создаю образ докера, который динамически создает конфигурацию nginx на основе переменных среды. Я хотел бы минимизировать количество требуемых переменных среды.

У меня есть файл шаблона конфигурации, который выглядит примерно так:

server {
...
  $ALLOW_DENY
...
}

И я бы хотел настроить шаблон вот так

export ALLOW_DENY="allow 11.11.11.11; deny all;"
envsubst '\$ALLOW_DENY' < sites-available/site.template > sites-available/my-site

Моя проблема в том, что я не хочу создавать несколько переменных среды для каждого оператора allow или deny (для некоторых конфигураций этого файла может потребоваться ничего, а для других - 5 или 6), но я не могу найти способ сделать envsubst принимать символы новой строки, и я не уверен, разрешено ли несколько команд nginx в одной строке.

Для справки я собираюсь загрузить все свои переменные среды, используя aws ssm и я не думаю, что он принимает такие многострочные переменные среды:

export $ALLOW_DENY="  allow 11.11.11.11;
  deny all;"

tl; dr

Это действительно так?

server {
...
  allow 11.11.11.11; deny all;
...
}

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

Файлы конфигурации nginx - это не что иное, как директивы, разделенные точкой с запятой, в блоках, разделенных фигурными скобками - разрывы строк не имеют значения, кроме того, что они анализируются аналогично пробелам и табуляциям:

Простая директива состоит из имени и параметров, разделенных пробелами, и заканчивается точкой с запятой (;). Блочная директива имеет ту же структуру, что и простая директива, но вместо точки с запятой она заканчивается набором дополнительных инструкций, заключенных в фигурные скобки ({и}).

Единственная причина, по которой вы не хотите размещать слишком много настроек в одной строке, - это удобочитаемость, а комментарии возможны только на строчной основе:

Оставшаяся часть строки после знака # считается комментарием.

Руководство для начинающих по Nginx