Aller au contenu

array-var: Variables de type tableau pour NGINX

Installation

Vous pouvez installer ce module dans n'importe quelle distribution basée sur RHEL, y compris, mais sans s'y limiter :

  • RedHat Enterprise Linux 7, 8, 9 et 10
  • CentOS 7, 8, 9
  • AlmaLinux 8, 9
  • Rocky Linux 8, 9
  • Amazon Linux 2 et Amazon Linux 2023
dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install nginx-module-array-var
yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install nginx-module-array-var

Activez le module en ajoutant ce qui suit en haut de /etc/nginx/nginx.conf :

load_module modules/ngx_http_array_var_module.so;

Ce document décrit nginx-module-array-var v0.6 publié le 23 mai 2022.


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

    # utilisez la directive set_quote_sql_str dans le module ngx_set_misc
    # pour mapper à chaque élément du tableau $array :
    array_map_op set_quote_sql_str $array;

    array_map "name = $array_it" $array;

    array_join ' or ' $array to=$sql_condition;

    # eh bien, nous pourrions le transmettre à ngx_drizzle pour parler à MySQL, par exemple ;)
    echo "select * from files where $sql_condition";
}

Description

Ce module fournit des variables nginx de type tableau à nginx.conf.

Sous le capot, ce module "abuse" simplement des valeurs de chaîne nginx pour contenir des pointeurs binaires vers des structures de données C (la structure ngx_array_t du cœur de NGINX).

Le type tableau donne à nginx.conf de merveilleuses capacités de gestion des listes de valeurs. De nos jours, cependant, il est fortement recommandé d'utiliser le module ngx_lua afin de bénéficier de toute la puissance de script fournie par le langage Lua dans nginx.

Directives

array_split

syntaxe : array_split <séparateur> <sujet> to=$target_variable

par défaut : non

contexte : http, serveur, serveur si, emplacement, emplacement si

Divise la valeur de chaîne dans l'argument sujet avec la chaîne séparatrice spécifiée par l'argument séparateur. Le résultat est une valeur de type tableau enregistrée dans la variable nginx spécifiée par l'option to=VAR.

Par exemple,

array_split "," $arg_names to=$names;

divisera les valeurs de chaîne dans l'argument de requête URI names en une valeur de type tableau enregistrée dans la variable nginx personnalisée $names.

Cette directive crée une variable de type tableau. Les variables de type tableau ne peuvent pas être utilisées en dehors des directives offertes par ce module. Si vous souhaitez utiliser les valeurs d'une variable de type tableau dans d'autres contextes, vous devez utiliser la directive array_join pour produire une valeur de chaîne normale.

array_join

syntaxe : array_split <séparateur> $array_var

par défaut : non

contexte : http, serveur, serveur si, emplacement, emplacement si

Joint les éléments de la variable nginx de type tableau ($array_var) en une seule valeur de chaîne avec le séparateur spécifié par le premier argument.

Par exemple,

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

Ensuite, la requête GET /foo?names=Bob,Marry,John produira le corps de la réponse

Bob+Marry+John

Dans l'exemple ci-dessus, nous utilisons la directive echo du module ngx_echo pour afficher le résultat final.

array_map

syntaxe : array_map <template> $array_var

syntaxe : array_map <template> $array_var to=$new_array_var

par défaut : non

contexte : http, serveur, serveur si, emplacement, emplacement si

Mappe le modèle de chaîne à chaque élément de la variable nginx de type tableau spécifiée. Dans le modèle de chaîne, vous pouvez utiliser la variable d'itérateur spéciale $array_it pour référencer l'élément actuel du tableau en cours de mappage.

Par exemple,

array_map "[$array_it]" $names;

changera chaque élément de la variable de tableau $names en mettant des crochets autour de la valeur de chaîne de chaque élément. La modification est en place dans ce cas.

Si vous ne souhaitez pas de modifications en place, vous pouvez utiliser l'option to=$var pour spécifier une nouvelle variable nginx pour contenir les résultats. Par exemple,

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

où les résultats sont enregistrés dans une autre variable nginx (de type tableau) nommée $new_names tandis que la variable $names reste intacte.

Voici un exemple complet pour cela :

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

Ensuite, la requête GET /foo?names=bob,marry,nomas produira le corps de la réponse

[bob]+[marry]+[nomas]

array_map_op

syntaxe : array_map_op <directive> $array_var

syntaxe : array_map_op <directive> $array_var to=$new_array_var

par défaut : non

contexte : http, serveur, serveur si, emplacement, emplacement si

Semblable à la directive array_map mais mappe la directive de configuration nginx spécifiée au lieu d'un modèle de chaîne à chaque élément de la variable nginx de type tableau spécifiée. Le résultat de l'application de la directive de configuration spécifiée devient le résultat du mappage.

La directive de configuration nginx utilisée comme itérateur doit être mise en œuvre par le sous-module set_var du Nginx Devel Kit (NDK) ndk_set_var_value. Par exemple, les directives suivantes du set-misc-nginx-module peuvent être invoquées de cette manière :

C'est une opération d'ordre supérieur où d'autres directives de configuration nginx peuvent être utilisées comme arguments pour cette directive map_array_op.

Considérez l'exemple suivant,

array_map_op set_quote_sql_str $names;

Cette ligne change chaque élément de la variable nginx de type tableau $names en appliquant la directive set_quote_sql_str fournie par le module ngx_set_misc un par un. Le résultat est que chaque élément du tableau $names a été échappé en tant que valeurs littérales de chaîne SQL.

Vous pouvez également spécifier l'option to=$var si vous ne souhaitez pas de modifications en place des tableaux d'entrée. Par exemple,

array_map_op set_quote_sql_str $names to=$quoted_names;

enregistrera les éléments échappés dans une nouvelle variable nginx (de type tableau) nommée $quoted_names avec $names intact.

Voici un exemple relativement complet :

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

Ensuite, la requête GET /foo?names=bob,marry,nomas produira le corps de la réponse

'bob'+'marry'+'nomas'

Assez cool, non ?

Ici, nous supposons que vous installeriez votre nginx sous /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 ```

Téléchargez la dernière version de l'archive tar de ce module depuis array-var-nginx-module file list, et la dernière archive tar pour ngx_devel_kit depuis sa file list.

De plus, ce module est inclus et activé par défaut dans le bundle OpenResty.

Voir aussi

GitHub

Vous pouvez trouver des conseils de configuration supplémentaires et de la documentation pour ce module dans le dépôt GitHub pour nginx-module-array-var.