Aller au contenu

eval: Évaluer la réponse memcached ou proxy dans une variable

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-eval
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-eval

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

load_module modules/ngx_http_eval_module.so;

Ce document décrit nginx-module-eval v2016.6.10 publié le 10 février 2016.


# un exemple pour travailler avec les modules ngx_drizzle + ngx_rds_json
# modules, mais vous devez mettre ngx_rds_json *après*
# ngx_eval lors de la configuration de nginx, par exemple :
#     ./configure --add-module=/path/to/nginx-eval-module \
#           --add-module=/path/to/rds-json-nginx-module \
#           --add-module=/path/to/drizzle-nginx-module
location = /mysql {
    eval_subrequest_in_memory off;
    eval_override_content_type text/plain;
    eval_buffer_size 4k; # par défaut 4k, tronqué si débordé
    eval $res {
        drizzle_query "select * from cats";
        drizzle_pass my_mysql_backend;
        rds_json on;
    }
    # maintenant $res contient le jeu de résultats au format JSON
    if ($res ~ '"Tom"') {
        echo "Le chat Tom a été trouvé !";
        break;
    }
    echo "Le chat Tom est manquant !";
}

# un exemple pour travailler avec le module ngx_postgres
location = /login {
   eval_subrequest_in_memory off;
   eval_override_content_type text/plain;
   eval_buffer_size 1k;
   eval $uid {
       postgres_query "select id
           from users
           where name=$arg_name and pass=$arg_pass";
       postgres_pass pg_backend;
       postgres_output value 0 0;
   }
   if ($uid !~ '^\d+$') {
       rewrite ^ /relogin redirect; break;
   }
   # vos paramètres de gestionnaire de contenu...
}

Description

Ce fork de ngx_eval peut fonctionner avec n'importe quel gestionnaire de contenu et même avec des filtres activés tant que vous mettez ngx_eval avant vos modules de filtre lors de la configuration de nginx, par exemple

./configure --prefix=/opt/nginx \
        --add-module=/path/to/this/nginx-eval-module \
        --add-module=/path/to/your/filter/module \
        --add-module=/path/to/your/other/filters

de sorte que le filtre de ngx_eval fonctionne après vos modules de filtre.

À partir de NGINX 1.9.11, vous pouvez également compiler ce module en tant que module dynamique, en utilisant l'option --add-dynamic-module=PATH au lieu de --add-module=PATH sur la ligne de commande ./configure ci-dessus. Et ensuite, vous pouvez charger explicitement le module dans votre nginx.conf via la directive load_module, par exemple,

load_module /path/to/modules/ngx_http_eval_module.so;

Utiliser Lua à la place

De nos jours, cependant, nous préférons ngx_lua pour effectuer les tâches initialement réalisées par ngx_eval en raison de diverses limitations inhérentes à ngx_eval.

Voici un petit exemple utilisant ngx_lua :

location = /filter-spam {
    internal;
    proxy_pass http://blah.blah/checker;
}

location / {
    rewrite_by_lua '
        local res = ngx.location.capture("/filter-spam")
        if res.status ~= ngx.HTTP_OK or res.body == nil then
            return
        end
        if string.match(res.body, "SPAM") then
            return ngx.redirect("/terms-of-use")
        end
    ';

    fastcgi_pass ...;
}

ceci est à peu près équivalent à

location / {
    eval $res {
        proxy_pass http://blah.blah/checker;
    }
    if ($res ~ 'SPAM') {
        rewrite ^ /terms-of-use redirect;
        break;
    }

    fastcgi_pass ...;
}

Bien que l'exemple Lua soit un peu plus long, il est beaucoup plus flexible et stable.

Limitations

  • Les contenus des sous-requêtes émises depuis le bloc eval (comme celles déclenchées par echo_subrequest) ne seront pas capturés correctement.

Compatibilité Nginx

Les versions suivantes de Nginx devraient fonctionner avec ce module :

  • 1.9.x (dernier test : 1.9.7)
  • 1.8.x
  • 1.7.x (dernier test : 1.7.7)
  • 1.5.x (dernier test : 1.5.12)
  • 1.4.x (dernier test : 1.4.4)
  • 1.3.x (dernier test : 1.3.11)
  • 1.2.x (dernier test : 1.2.9)
  • 1.1.x (dernier test : 1.1.5)
  • 1.0.x (dernier test : 1.0.15)
  • 0.9.x (dernier test : 0.9.4)
  • 0.8.0 ~ 0.8.41, 0.8.54+ (0.8.42 ~ 0.8.53 nécessite un patch, voir ci-dessous) (dernier test : 0.8.54)
  • 0.7.x >= 0.7.21 (dernier test : 0.7.68)

Notez que nginx 0.8.42 ~ 0.8.53 ne fonctionnera pas en raison d'une fameuse régression apparue depuis 0.8.42.

Documentation originale de ngx_eval

La documentation pour ce module peut être trouvée aux URLs suivantes :

Ce travail est commandé par gadu-gadu.pl

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-eval.