Перейти к содержанию

array-var: Переменные типа массив для NGINX

Установка на Debian/Ubuntu

Эти документы относятся к APT пакету nginx-module-array-var, предоставленному репозиторием GetPageSpeed Extras.

  1. Настройте APT репозиторий, как описано в настройке APT репозитория.
  2. Установите модуль:
sudo apt-get update
sudo apt-get install nginx-module-array-var

Warning

Этот модуль еще не опубликован как nginx-module-array-var в APT репозиториях. Следите за обновлениями или напишите на support@getpagespeed.com, чтобы запросить его.


array-var-nginx-module - Добавляет поддержку переменных типа массив в конфигурационные файлы nginx

инструкции по установке.

Статус

Этот модуль готов к продуктивному использованию.

Аннотация

location /foo {
    array_split ',' $arg_files to=$array;

    # используйте директиву set_quote_sql_str в ngx_set_misc
    # модуле, чтобы применить ее к каждому элементу массива $array:
    array_map_op set_quote_sql_str $array;

    array_map "name = $array_it" $array;

    array_join ' or ' $array to=$sql_condition;

    # мы могли бы передать это в ngx_drizzle для общения с MySQL, например ;)
    echo "select * from files where $sql_condition";
}

Описание

Этот модуль предоставляет переменные nginx типа массив для nginx.conf.

Внутри этот модуль просто "злоупотребляет" строковыми значениями nginx, чтобы хранить бинарные указатели на структуры данных C (структура ngx_array_t из ядра NGINX).

Тип массива дает nginx.conf удивительные возможности обработки списков значений. В настоящее время, однако, настоятельно рекомендуется использовать модуль ngx_lua, чтобы получить полную мощь сценариев, предоставляемую языком Lua в nginx.

Директивы

array_split

синтаксис: array_split <разделитель> <предмет> to=$target_variable

по умолчанию: нет

контекст: http, server, server if, location, location if

Разделяет строковое значение в аргументе subject с заданной строкой-разделителем, указанной в аргументе separator. Результат сохраняется в переменной nginx указанной в опции to=VAR.

Например,

array_split "," $arg_names to=$names;

разделит строковые значения в аргументе URI names на массив и сохранит его в пользовательской переменной nginx $names.

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

array_join

синтаксис: array_join <разделитель> $array_var

по умолчанию: нет

контекст: http, server, server if, location, location if

Объединяет элементы в переменной nginx типа массив ($array_var) в одну строковое значение с разделителем, указанным первым аргументом.

Например,

location /foo {
    array_split ',' $arg_names to=$names;
    array_join '+' $names;
    echo $names;
}

Затем запрос GET /foo?names=Bob,Marry,John вернет тело ответа

Bob+Marry+John

В приведенном выше примере мы используем директиву echo модуля ngx_echo для вывода конечного результата.

array_map

синтаксис: array_map <шаблон> $array_var

синтаксис: array_map <шаблон> $array_var to=$new_array_var

по умолчанию: нет

контекст: http, server, server if, location, location if

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

Например,

array_map "[$array_it]" $names;

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

Если вы не хотите изменений на месте, вы можете использовать опцию to=$var, чтобы указать новую переменную nginx для хранения результатов. Например,

array_map "[$array_it]" $names to=$new_names;

где результаты сохраняются в другой (типа массив) переменной nginx, названной $new_names, в то время как переменная $names остается нетронутой.

Ниже приведен полный пример для этого:

location /foo {
    array_split ',' $arg_names to=$names;
    array_map '[$array_it]' $names;
    array_join '+' $names;
    echo "$names";
}

Затем запрос GET /foo?names=bob,marry,nomas вернет тело ответа

[bob]+[marry]+[nomas]

array_map_op

синтаксис: array_map_op <директива> $array_var

синтаксис: array_map_op <директива> $array_var to=$new_array_var

по умолчанию: нет

контекст: http, server, server if, location, location if

Похожие на директиву array_map, но применяет указанную директиву конфигурации nginx вместо строкового шаблона к каждому элементу в указанной переменной типа массив nginx. Результатом применения указанной директивы конфигурации становится результат преобразования.

Директива конфигурации nginx, используемая в качестве итератора, должна быть реализована в подмодуле set_var Nginx Devel Kit (NDK) с помощью ndk_set_var_value. Например, следующие директивы set-misc-nginx-module могут быть вызваны таким образом:

Это операция высшего порядка, где другие директивы конфигурации nginx могут использоваться в качестве аргументов для этой директивы map_array_op.

Рассмотрим следующий пример,

array_map_op set_quote_sql_str $names;

Эта строка изменяет каждый элемент в переменной типа массив nginx $names, применяя директиву set_quote_sql_str, предоставляемую модулем ngx_set_misc по одному. Результат состоит в том, что каждый элемент массива $names был экранирован как строковые литералы SQL.

Вы также можете указать опцию to=$var, если вы не хотите изменений на месте входных массивов. Например,

array_map_op set_quote_sql_str $names to=$quoted_names;

успешно сохранит экранированные элементы в новой (типа массив) переменной nginx, названной $quoted_names, при этом переменная $names останется нетронутой.

Следующий пример достаточно полный:

location /foo {
    array_split ',' $arg_names to=$names;
    array_map_op set_quote_sql_str $names;
    array_join '+' $names to=$res;
    echo $res;
}

Затем запрос GET /foo?names=bob,marry,nomas вернет тело ответа

'bob'+'marry'+'nomas'

Круто, да?

Здесь мы предполагаем, что вы установите nginx в /opt/nginx/.

./configure --prefix=/opt/nginx \ --add-module=/path/to/ngx_devel_kit \ --add-module=/path/to/array-var-nginx-module

make -j2 make install ```

Скачайте последнюю версию релиза архива этого модуля из списка файлов array-var-nginx-module и последний архив для ngx_devel_kit из его списка файлов.

Также этот модуль включен и включен по умолчанию в пакет OpenResty.

Смотрите также