From d5eff3fdce8b180d03c52545fcdffb702ef66c64 Mon Sep 17 00:00:00 2001 From: Lucien Gentis Date: Sat, 22 Jun 2013 16:47:04 +0000 Subject: [PATCH] Updates. git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.4.x@1495754 13f79535-47bb-0310-9956-ffa450edef68 --- docs/manual/mod/mod_lua.xml.fr | 863 ++++++++++++++++++++++--- docs/manual/programs/apxs.xml.fr | 7 +- docs/manual/programs/rotatelogs.xml.fr | 7 +- 3 files changed, 799 insertions(+), 78 deletions(-) diff --git a/docs/manual/mod/mod_lua.xml.fr b/docs/manual/mod/mod_lua.xml.fr index 019d9afb4a..cc01673fd4 100644 --- a/docs/manual/mod/mod_lua.xml.fr +++ b/docs/manual/mod/mod_lua.xml.fr @@ -1,7 +1,7 @@ - + @@ -52,6 +52,15 @@ ce qu'il passe au stade stable, et ce même entre deux versions stables 2.4.x. N'oublez pas de consulter le fichier CHANGES avant toute mise à jour. +Avertissement +

Ce module possède une grande capacité d'action sur le fonctrionnement +de httpd, ce qui lui confère une grande puissance, mais peut aussi +induire un risque de sécurité. Il est déconseillé d'utiliser ce module +sur un serveur partagé avec des utilisateurs auxquels vous ne pouvez pas +accorder une confiance absolue, car il peut permettre de modifier le +fonctionnement interne de httpd.

+
+
Configuration de base @@ -76,11 +85,10 @@ Ceci aura pour effet de faire traiter les requêtes pour les fichiers dont l'extension est .lua par mod_lua en invoquant cette fonction de gestion de fichier.

-
Ecrire des gestionnaires @@ -96,7 +104,7 @@ le style de CGI. Une fonction de gestionnaire se présente comme suit :

-example.lua +example.lua
-- exemple de gestionnaire require "string" @@ -108,20 +116,28 @@ require "string" --]] function handle(r) r.content_type = "text/plain" - r:puts("Hello Lua World!\n") if r.method == 'GET' then + r:puts("Hello Lua World!\n") for k, v in pairs( r:parseargs() ) do r:puts( string.format("%s: %s\n", k, v) ) - end + end elseif r.method == 'POST' then + r:puts("Hello Lua World!\n") for k, v in pairs( r:parsebody() ) do r:puts( string.format("%s: %s\n", k, v) ) end - else + elseif r.method == 'PUT' then +-- message d'erreur personnalisé r:puts("Unsupported HTTP method " .. r.method) + r.status = 405 + return apache2.ok + else +-- message d'erreur ErrorDocument + return 501 end + return apache2.OK end @@ -198,19 +214,100 @@ LuaAuthzProvider foo authz_provider.lua authz_check_foo les scripts Lua) participent au traitement des requêtes. Chaque type d'accroche proposé par le serveur a un rôle spécifique, comme l'association de requêtes au système de fichiers, le contrôle d'accès, -ou la définition de types MIME. Il existe aussi des accroches à usage -général qui s'exécutent simplement à des moments opportuns du cycle -de vie de la requête.

- -

Les fonctions d'accroche acceptent l'objet de la requête comme seul -et unique argument. Elles peuvent renvoyer une valeur, selon la -fonction, mais il s'agit en général d'un +ou la définition de types MIME :

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Phase d'accrocheDirective mod_luaDescription
Gestionnaire rapideLuaQuickHandlerIl s'agit de la première accroche appelée lorsqu'une requête + a été associée à un serveur ou un serveur virtuel.
Phase de traductionLuaHookTranslateNameCette phase traduit l'URI de la requête en nom de fichier + sur le système. Ce sont des modules comme + mod_alias et mod_rewrite qui + interviennent au cours de cette phase.
Choix du lieu de stockage de la ressourceLuaHookMapToStorageCette phase définit le lieu de stockage de la ressource : + physique, en cache ou externe/mandaté. Elle est assurée par les + modules de mandat ou de mise en cache.
Autorisation d'accèsLuaHookAccessCheckerCette phase vérifie si un client a l'autorisation d'accès à + la ressource. Elle s'exécute avant l'authentification de + l'utisateur ; il faut donc être prudent. +
Vérification de l'identifiant utilisateurLuaHookCheckUserIDCette phase vérifie l'identifiant de l'utilisateur ayant + fait l'objet d'une négociation.
Vérification de l'autorisation d'accèsLuaHookAuthChecker + ou + LuaAuthzProviderCette phase vérifie l'autorisation d'accès d'un utilisateur + en fonction des ses paramètres de connexion, comme + l'identifiant, le certificat, etc... +
Vérification du type de la ressourceLuaHookTypeCheckerCette phase assigne un type de contenu et un gestionnaire à + la ressource.
Derniers réglagesLuaHookFixupsC'est la dernière phase avant l'activation des gestionnaires + de contenu. Toute modification de dernière minute à la requête + doit être effectuée ici.
Gestionnaire de contenufichiers fx. .lua ou directive LuaMapHandlerC'est durant cette phase que le contenu est traité. Les + fichiers sont lus, interprétés, certains sont exécutés, et le + résultat obtenu est envoyé au client.
JournalisationaucuneLorsqu'une requête a été traitée, plusieurs phases de + journalisation interviennent, et enregistrent leurs résultats + dans les fichiers d'erreur ou d'accès.
+ +

Les fonctions d'accroche reçoivent l'objet de la requête comme seul +argument (sauf LuaAuthzProvider qui reçoit aussi des arguments en +provenance de la directive Require). Elles peuvent renvoyer une valeur, +selon la fonction, mais il s'agit en général d'un code d'état HTTP ou des valeurs OK, DONE, ou DECLINED, -que vous pouvez écrire dans lua sous la forme apache2.OK, +que vous pouvez écrire dans Lua sous la forme apache2.OK, apache2.DONE, ou apache2.DECLINED.

+ -translate_name.lua +translate_name.lua
-- exemple d'accroche qui réécrit un URI en chemin du système de fichiers. @@ -226,15 +323,16 @@ function translate_name(r) end
+ -translate_name2.lua +translate_name2.lua
--[[ exemple d'accroche qui réécrit un URI vers un autre URI. Il renvoie un apache2.DECLINED pour permettre à un autre interpréteur d'URL de travailler sur la substitution, y compris l'accroche translate_name de base dont les tables de correspondances se basent sur DocumentRoot. - Note: actuellement, il est impossible de prévoir si cette action - s'exécute avant ou après mod_alias. + Note: utilisez le drapeau early/late de la directive pour + l'exécuter avant ou après mod_alias. --]] require 'apache2' @@ -257,212 +355,708 @@ end

request_rec est considérée en tant que donnée utilisateur. Elle possède une métatable qui vous permet d'accomplir des choses intéressantes. Pour la plus grande partie, elle possède - les mêmes champs que la structure request_rec (voir httpd.h en - attendant que cette documentation soit plus complète), la + les mêmes champs que la structure request_rec, la plupart d'entre eux étant accessibles en lecture et écriture (le contenu des champs de la table peut être modifié, mais les champs eux-mêmes ne peuvent pas être établis en tant que tables distinctes).

- +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Nom Type Lua ModifiableDescription
allowoverridesstringnonL'option AllowOverride s'applique à la requête courante.
ap_auth_type string nonCe champ contient le type d'authentification effectuée + (par exemple basic)
args string ouiLa chaîne de paramètres de la requête (par exemple + foo=bar&name=johnsmith)
assbackwards boolean noncontient true s'il s'agit d'une requête de style HTTP/0.9 + (par exemple GET /foo (sans champs d'en-tête) )
auth_namestringnonLa chaîne d'identification utilisée pour la vérification + de l'autorisation d'accès (si elle est disponible).
bannerstringnonLa bannière du serveur, par exemple Apache HTTP + Server/2.4.3 openssl/0.9.8c
basic_auth_pwstringnonLe mot de passe pour l'authentification de base envoyé + avec la requête, s'il existe
canonical_filename string nonLe nom de fichier canonique de la requête
content_encoding string nonLe type de codage du contenu de la requête courante
content_type string ouiLe type de contenu de la requête courante, tel qu'il a été + déterminé au cours de la phase type_check (par exemple + image/gif ou text/html)
context_prefix string non
context_document_root string non
document_root string nonLa racine des documents du serveur
err_headers_out table nonL'en-tête MIME de l'environnement pour la réponse, écrit + même en cas d'erreur et conservé pendant les redirections + internes
filename string ouiLe nom de fichier correspondant à la requête, par exemple + /www/example.com/foo.txt. Il peut être modifié au cours des + phases translate-name ou map-to-storage du traitement de la + requête pour permettre au gestionnaire par défaut (ou aux + gestionnaires de script) de servir une version du fichier + autre que celle demandée.
handler string ouiLe nom du gestionnaire qui + doit traiter la requête, par exemple lua-script + si elle doit être traitée par mod_lua. Cette valeur est en + général définie via les directives AddHandler ou SetHandler, mais peut aussi l'être + via mod_lua pour permettre à un autre gestionnaire de traiter + une requête spécifique qui ne serait pas traitée par défaut + par ce dernier. +
headers_in table ouiLes en-têtes MIME de l'environnement de la requête. Il + s'agit des en-têtes comme Host, User-Agent, + Referer, etc...
headers_out table ouiLes en-têtes MIME de l'environnement de la réponse.
hostname string nonLe nom d'hôte, tel que défini par l'en-tête + Host: ou par un URI complet.
is_httpsbooleannonIndique si la requête à été faite via HTTPS
is_initial_reqbooleannonIndique si la requête courante est la requête initiale ou + une sous-requête.
limit_req_bodynumbernonLa taille maximale du corps de la requête, ou 0 si aucune + limite.
log_idlog_id string nonL'identifiant de la requête dans les journaux d'accès ou + d'erreur.
method string nonLa méthode de la requête, par exemple GET ou + POST.
notes table ouiUne liste de notes qui peuvent être transmises d'un module + à l'autre.
optionsstringnonLa valeur de la directive Options pour la requête + courante.
path_info string nonLa valeur de PATH_INFO extraite de la requête.
portnumbernonLe port du serveur utilisé par la requête.
protocol string nonLe protocole utilisé, par exemple HTTP/1.1
proxyreq string ouiIndique s'il s'agit d'une requête mandatée ou non. Cette + valeur est en général définie au cours de la phase + post_read_request/translate_name du traitement de la requête.
range string nonLe contenu de l'en-tête Range:.
remainingnumbernonLe nombre d'octets du corps de la requête restant à lire.
server_builtstringnonLa date de compilation du serveur.
server_namestringnonLe nom du serveur pour cette requête.
some_auth_requiredbooleannonIndique si une autorisation est/était requise pour cette + requête.
subprocess_env table ouiLe jeu de variables d'environnement pour cette requête.
startednumbernonLe moment où le serveur a été (re)démarré, en secondes + depuis epoch (1er janvier 1970)
status number ouiLe code de retour (courant) pour cette requête, par + exemple 200 ou 404.
the_request string nonLa chaîne de la requête telle qu'elle a été envoyée par le + client, par exemple GET /foo/bar HTTP/1.1.
unparsed_uri string nonLa partie URI non interprétée de la requête
uri string ouiL'URI après interprétation par httpd
user string ouiSi une authentification a été effectuée, nom de + l'utilisateur authentifié.
useragent_ip string nonL'adresse IP de l'agent qui a envoyé la requête
+ + +
+
Méthodes de l'objet request_rec -

La structure request_rec possède (au minimum) les méthodes - suivantes :

+

L'objet request_rec possède (au minimum) les méthodes suivantes :

- - r:addoutputfilter(name|function) -- ajoute un filtre en sortie - + +r:flush() -- vide le tampon de sortie + -- Renvoie true si le vidage a été effectué avec succès, + false dans le cas contraire. + +while nous_avons_des_données_à_envoyer do + r:puts("Bla bla bla\n") -- envoi des données à envoyer vers le tampon + r:flush() -- vidage du tampon (envoi au client) + r:sleep(0.5) -- mise en attente et bouclage +end + - - r:parseargs() -- renvoie deux tables : une table standard de couples - clé/valeur pour les données GET simples, et une autre pour les données - multivaluées (par exemple foo=1&foo=2&foo=3) : + +r:addoutputfilter(name|function) -- ajoute un filtre en sortie - local GET, GETMULTI = r:parseargs() - r:puts("Votre nom est : " .. GET['name'] or "Unknown") - +r:addoutputfilter("fooFilter") -- insère le filtre fooFilter dans le flux de sortie + - - r:parsebody([sizeLimit]) -- interprète le corps de la requête - en tant que POST et renvoie deux tables lua, comme r:parseargs(). Un nombre optionnel - peut être fourni pour spécifier le nombre maximal d'octets à - interpréter. La valeur par défaut est 8192 : + +r:sendfile(filename) -- envoie un fichier entier au client en +utilisant sendfile s'il est supporté par la plateforme : + +if use_sendfile_thing then + r:sendfile("/var/www/large_file.img") +end + + + +r:parseargs() -- renvoie deux tables : une table standard de couples +clé/valeur pour les données GET simples, et une autre pour les données +multivaluées (par exemple foo=1&foo=2&foo=3) : + +local GET, GETMULTI = r:parseargs() +r:puts("Votre nom est : " .. GET['name'] or "Unknown") + - local POST, POSTMULTI = r:parsebody(1024*1024) - r:puts("Votre nom est : " .. POST['name'] or "Unknown") - - - r:puts("bonjour", " le monde", "!") -- affichage dans le corps de la réponse - + +r:parsebody()([sizeLimit]) -- interprète le corps de la requête +en tant que POST et renvoie deux tables lua, comme r:parseargs(). Un nombre optionnel +peut être fourni pour spécifier le nombre maximal d'octets à +interpréter. La valeur par défaut est 8192. + +local POST, POSTMULTI = r:parsebody(1024*1024) +r:puts("Votre nom est : " .. POST['name'] or "Unknown") + + + + +r:puts("bonjour", " le monde", "!") -- affichage dans le corps de la réponse + + + +r:write("une simple chaîne") -- affichage dans le +corps de la réponse + + + +r:escape_html("<html>test</html>") -- Echappe le +code HTML et renvoie le résultat + + + +r:base64_encode(string) -- Encode une chaîne à l'aide du +standard de codage Base64. + +local encoded = r:base64_encode("This is a test") -- returns VGhpcyBpcyBhIHRlc3Q= + + + +r:base64_decode(string) -- Décode une chaîne codée en Base64. + +local decoded = r:base64_decode("VGhpcyBpcyBhIHRlc3Q=") -- returns 'This is a test' + + + +r:md5(string) -- Calcule et renvoie le condensé MD5 d'une chaîne +en mode binaire (binary safe). + +local hash = r:md5("This is a test") -- returns ce114e4501d2f4e2dcea3e17b546f339 + + + +r:sha1(string) -- Calcule et renvoie le condensé SHA1 d'une chaîne +en mode binaire (binary safe). + +local hash = r:sha1("This is a test") -- returns a54d88e06612d820bc3be72877c74f257b561b19 + - - r:write("une simple chaîne") -- affichage dans le - corps de la réponse - + +r:escape(string) -- Echappe une chaîne de type URL. + +local url = "http://foo.bar/1 2 3 & 4 + 5" +local escaped = r:escape(url) -- renvoie 'http%3a%2f%2ffoo.bar%2f1+2+3+%26+4+%2b+5' + + + +r:unescape(string) -- Déséchappe une chaîne de type URL. + +local url = "http%3a%2f%2ffoo.bar%2f1+2+3+%26+4+%2b+5" +local unescaped = r:unescape(url) -- renvoie 'http://foo.bar/1 2 3 & 4 + 5' + + + +r:construct_url(string) -- Construit une URL à partir d'un URI + +local url = r:construct_url(r.uri) + + + +r:mpm_query(number) -- Interroge le serveur à propos de son +module MPM via la requête ap_mpm_query. + +local mpm = r.mpm_query(14) +if mpm == 1 then + r:puts("Ce serveur utilise le MPM Event") +end + + + +r:expr(string) -- Evalue une chaîne de type expr. + +if r:expr("%{HTTP_HOST} =~ /^www/") then + r:puts("Ce nom d'hôte commence par www") +end + + + +r:scoreboard_process(a) -- Interroge le serveur à propos du +processus à la position a. + +local process = r:scoreboard_process(1) +r:puts("Le serveur 1 a comme PID " .. process.pid) + + + +r:scoreboard_worker(a, b) -- Interroge le serveur à propos du +thread b, dans le processus a. + +local thread = r:scoreboard_worker(1, 1) +r:puts("L'ID du thread 1 du serveur 1 est " .. thread.tid .. " et son +état est " .. thread.status) + + + +r:clock() -- Renvoie l'heure courante avec une précision d'une +microseconde. + + + +r:requestbody(filename) -- Lit et renvoie le corps d'une requête. Si +'filename' est spécifié, le corps de requête n'est pas renvoyé, mais +sauvegardé dans le fichier correspondant. + +local input = r:requestbody() +r:puts("Vous m'avez envoyé le corps de requête suivant :\n") +r:puts(input) + - - r:dbacquire(dbType[, dbParams]) -- Acquiert une connexion à une + +r:add_input_filter(filter_name) -- Ajoute le filtre en entrée +'filter_name'. + + + +r:module_info(module_name) -- Interroge le serveur à propos d'un +module. + +local mod = r.module_info("mod_lua.c") +if mod then + for k, v in pairs(mod.commands) do + r:puts( ("%s: %s\n"):format(k,v)) -- affiche toutes les directives implémentées par ce module + end +end + + + +r:loaded_modules() -- Renvoie une liste des modules chargés par +httpd. + +for k, module in pairs(r:loaded_modules()) do + r:puts("J'ai chargé le module " .. module .. "\n") +end + + + +r:runtime_dir_relative(filename) -- Génère le nom d'un fichier run-time +(par exemple la mémoire partagée "file") relativement au répertoire de +run-time. + + + +r:server_info() -- Renvoie une table contenant des informations +à propos du serveur, comme le nom de l'exécutable httpd, le +module mpm utilisé, etc... + + + +r:set_document_root(file_path) -- Définit la racine des +documents pour la requête à file_path. + + + +r:add_version_component(component_string) -- Ajoute un élément à +la bannière du serveur. + + + +r:set_context_info(prefix, docroot) -- Définit le préfixe et la +racine des documents du contexte pour une requête. + + + +r:os_escape_path(file_path) -- Convertit un chemin du système de +fichiers en URL indépendamment du système d'exploitation. + + + +r:escape_logitem(string) -- Echappe une chaîne pour +journalisation. + + + +r.strcmp_match(string, pattern) -- Vérifie si 'string' correspond à +'pattern' via la fonction strcmp_match (GLOBs). Par exemple, est-ce que +'www.example.com' correspond à '*.example.com' ? + +local match = r.strcmp_match("foobar.com", "foo*.com") +if match then + r:puts("foobar.com matches foo*.com") +end + + + +r:set_keepalive() -- Définit l'état de persistance d'une +requête. Renvoie true dans la mesure du possible, false dans le +cas contraire. + + + +r:make_etag() -- Génère et renvoie le etag pour la requête +courante. + + + +r:send_interim_response(clear) -- Renvoie une réponse d'intérim (1xx) au +client. Si 'clear' est vrai, les en-têtes disponibles seront envoyés et +effacés. + + + +r:custom_response(status_code, string) -- Génère et définit une réponse +personnalisée pour un code d'état particulier. Le fonctionnement est +très proche de celui de la directive ErrorDocument. + +r:custom_response(404, "Baleted!") + + + +r.exists_config_define(string) -- Vérifie si une définition de +configuration existe. + +if r.exists_config_define("FOO") then + r:puts("httpd a probablement été lancé avec l'option -DFOO, ou FOO a + été défini dans la configuration") +end + + + +r:state_query(string) -- Interroge le serveur à propos de son +état. + + + +r:stat(filename [,wanted]) -- Exécute stat() sur un fichier, et renvoie +une table contenant des informations à propos de ce fichier. + +local info = r:stat("/var/www/foo.txt") +if info then + r:puts("Ce fichier existe et a été modifié pour la dernière fois à : " .. info.modified) +end + + + +r:regex(string, pattern [,flags]) -- Exécute une recherche à base +d'expression rationnelle sur une chaîne, et renvoie les +éventuelles correspondances trouvées. + +local matches = r:regex("foo bar baz", [[foo (\w+) (\S*)]]) +if matches then + r:puts("L'expression rationnelle correspond et le dernier mot + capturé ($2) est : " .. matches[2]) +end + +-- Exemple avec insensibilité à la casse : +local matches = r:regex("FOO bar BAz", [[(foo) bar]], 1) + +-- les drapeaux peuvent être une combibaison bit à bit de : +-- 0x01: insensibilité à la casse +-- 0x02: recherche multiligne + + + +r:sleep(secondes) -- Interrompt l'exécution du script pendant le nombre de secondes spécifié. + -- La valeur peut être spécifiée sous la forme d'un nombre décimal comme 1.25 pour plus de précision. + + + +r:dbacquire(dbType[, dbParams]) -- Acquiert une connexion à une base de données et renvoie une classe database. Voir 'Connectivité aux bases de données' pour plus de détails. - - - + + + +r:ivm_set("key", value) -- Défini une variable Inter-VM avec une valeur spécifique. + -- Ces valeurs sont conservées même si la VM est + -- arrêtée ou non utilisée, et ne doivent donc être + -- utilisées que si MaxConnectionsPerChild > 0. + -- Les valeurs peuvent être de type number, string + -- ou boolean et sont stockées séparément pour + -- chaque processus (elles ne seront donc pas d'une + -- grande utilité si l'on utilise le mpm prefork). + +r:ivm_get("key") -- Lit le contenu d'une variable définie via ivm_set. Renvoie + -- le contenu de la variable si elle existe, ou nil + -- dans le cas contraire. + +-- Voici un exemple de lecture/écriture qui sauvegarde une variable +-- globale en dehors de la VM : +function handle(r) + -- La première VM qui effectue l'appel suivant n'obtiendra aucune + -- valeur, et devra la créer + local foo = r:ivm_get("cached_data") + if not foo then + foo = do_some_calcs() -- simulation de valeurs de retour + r:ivm_set("cached_data", foo) -- définition globale de la variable + end + r:puts("La donnée en cache est : ", foo) +end + + +r:htpassword(string [,algorithm [,cost]]) -- Génère un hash de mot de passe à partir d'une chaîne. + -- algorithm: 0 = APMD5 (défaut), 1 = SHA, 2 = BCRYPT, 3 = CRYPT. + -- cost: ne s'utilise qu'avec l'algorythme BCRYPT (défaut = 5). + + + +r:mkdir(dir [,mode]) -- Crée un répertoire et définit son mode via le paramètre optionnel mode. + + + +r:rmdir(dir) -- Supprime un répertoire. + + + +r:get_direntries(dir) -- Renvoie une table contenant toutes les entrées de répertoires. + +-- Renvoie un chemin sous forme éclatée en chemin, fichier, extension +function split_path(path) + return path:match("(.-)([^\\/]-%.?([^%.\\/]*))$") +end + +function handle(r) + local cwd, _, _ = split_path(r.filename) + for _, f in ipairs(r:get_direntries(cwd)) do + local info = r:stat(cwd .. f) + if info then + local mtime = os.date(fmt, info.mtime / 1000000) + local ftype = (info.filetype == 2) and "[dir] " or "[file]" + r:puts( ("%s %s %10i %s\n"):format(ftype, mtime, info.size, f) ) + end + end +end + + + +r.date_parse_rfc(string) -- Interprète une chaîne date/heure et renvoie l'équivalent en secondes depuis epoche. +
@@ -502,10 +1096,59 @@ contenu suivant :

Code d'état HTTP
apache2.PROXYREQ_NONE, apache2.PROXYREQ_PROXY, apache2.PROXYREQ_REVERSE, apache2.PROXYREQ_RESPONSE
Constantes internes utilisées par mod_proxy
+
apache2.AUTHZ_DENIED, apache2.AUTHZ_GRANTED, apache2.AUTHZ_NEUTRAL, apache2.AUTHZ_GENERAL_ERROR, apache2.AUTHZ_DENIED_NO_USER
+
constantes internes utilisées par mod_authz_core
+

Les autres codes d'état HTTP ne sont pas encore implémentés.

+ +
+ Modification de contenu avec les filtres lua +

+ Les fonctions de filtrage implémentées via les directives LuaInputFilter ou LuaOutputFilter sont conçues comme des + fonctions de 3ème phase non blocantes utilisant des sous-routines + pour suspendre et reprendre l'exécution d'une fonction lorsque des + paquets de données sont envoyés à la chaîne de filtrage. La + structure de base d'une telle fonction est : +

+ +function filter(r) + -- Nous indiquons tout d'abord que nous sommes prêts à recevoir des + -- blocs de données. + -- Avant ceci, nous pouvons définir notre environnement, tester + -- certaines conditions, et, si nous le jugeons nécessaire, refuser le + -- filtrage d'une requête : + if something_bad then + return -- Le filtrage est sauté + end + -- Sans se préoccuper des données que nous devons éventuellement ajouter, un arrêt est réalisé ici. + -- Noter que les filtres de sortie sont les seuls capables d'ajouter des éléments au début des données. + -- Les filtres en entrée peuvent ajouter des éléments à la fin des données au stade final. + + coroutine.yield([optional header to be prepended to the content]) + + -- Après cet arrêt, nous allons recevoir d'autres blocs de données, un par un ; + -- nous pouvons les traiter comme il nous plaît et procéder à la réponse. + -- Ces blocs sont conservés dans la variable globale 'bucket', nous réalisons donc + -- une boucle pour vérifier que 'bucket' n'est pas vide : + while bucket ~= nil do + local output = mangle(bucket) -- Do some stuff to the content + coroutine.yield(output) -- Return our new content to the filter chain + end + + -- Une fois les blocs de données épuisés, 'bucket' est positionné à une valeur vide ('nil'), + -- ce qui va nous faire sortir de cette boucle et nous amener à l'étape suivante. + -- On peut ajouter ce qu'on veut à la fin des données à cette étape, qui constitue le dernier + -- arrêt. Les filtres d'entrée comme de sortie peuvent servir à ajouter des éléments à la fin + -- des données à cette étape. + coroutine.yield([optional footer to be appended to the content]) +end + +
Connectivité aux bases de données

Mod_lua implémente une fonctionnalité basique de connexion aux @@ -516,7 +1159,7 @@ commandes auprès des moteurs de base de données les plus courants

L'exemple suivant montre comment se connecter à une base de données et extraire des informations d'une table :

-function handler(r) +function handle(r) -- connexion à la base de données local database, err = r:dbacquire("mysql", "server=localhost,user=root,dbname=mydb") if not err then @@ -564,7 +1207,7 @@ local result, errmsg = database:select(r, "SELECT * FROM `people` WHERE 1") -- Création et exécution d'une requête préparée : local statement, errmsg = database:prepare(r, "DELETE FROM `tbl` WHERE `age` > %u") if not errmsg then - local result, errmsg = statement:query(20) -- exécute la requête pour age > 20 + local result, errmsg = statement:query(20) -- exécute la requête pour age > 20 end -- Extrait une requête préparée depuis une directive DBDPrepareSQL : @@ -709,8 +1352,7 @@ relatifs dans les directives de mod_lua LuaScope Une valeur parmi once, request, conn, thread -- la valeur par défaut est once -LuaScope once|request|conn|thread -- la valeur par défaur est -once +LuaScope once|request|conn|thread|server [min] [max] LuaScope once server configvirtual host directory.htaccess @@ -730,23 +1372,36 @@ once aussi dans la portée de la requête.
conn:
idem request, mais attaché à connection_rec
+
thread:
Utilise l'interpréteur pendant toute la durée de vie du thread qui traite la requête (disponible seulement avec les MPMs threadés).
- + ceci, les états lua du serveur sont stockés dans une liste de ressources + apr. Les arguments min et max permettent + de spécifier les nombres minimaux et maximaux d'états lua à stocker + dans la liste. +

En général, les portées thread et server + sont 2 à 3 fois plus rapides que les autres, car elles n'ont pas besoin + de régénérer de nouveaux états Lua à chaque requête (comme c'est le + cas avec le MPM event, où même les connexions persistantes utilisent un + nouveau thread pour chaque requête). Si vous pensez que vos scripts + n'auront pas de problème s'il réutilisent un état, alors les portées + thread ou server doivent être utilisées car + elles présenteront de meilleures performances. Alors que la portée + thread fournira les réponses les plus rapides, la portée + server utilisera moins de mémoire car les états sont + rassemblés dans des jeux, permettant par exemple à 1000 threads de + partager 100 états Lua, ne nécessitant ainsi que 10% de la mémoire + requise par la portée thread. +

- LuaPackagePath @@ -822,13 +1476,13 @@ LuaPackagePath /scripts/lib/?/init.lua - LuaHookTranslateName @@ -942,7 +1595,48 @@ traitement de la requête directory.htaccess
All -

...

+ +

Identique à la directive + LuaHookTranslateName, mais s'exécute à la + phase map-to-storage du traitement de la requête. Les modules comme + mod_cache agissent pendant cette phase, ce qui permet de présenter + un exemple intéressant de ce que l'on peut faire ici :

+ + LuaHookMapToStorage /path/to/lua/script.lua check_cache + + +require"apache2" +cached_files = {} + +function read_file(filename) + local input = io.open(filename, "r") + if input then + local data = input:read("*a") + cached_files[filename] = data + file = cached_files[filename] + input:close() + end + return cached_files[filename] +end + +function check_cache(r) + if r.filename:match("%.png$") then -- Only match PNG files + local file = cached_files[r.filename] -- Check cache entries + if not file then + file = read_file(r.filename) -- Read file into cache + end + if file then -- If file exists, write it out + r.status = 200 + r:write(file) + r:info(("Sent %s to client from cache"):format(r.filename)) + return apache2.DONE -- skip default handler for PNG files + end + end + return apache2.DECLINED -- If we had nothing to do, let others serve this. +end + + +
@@ -1095,9 +1789,20 @@ parentes sont fusionnées dans les enfants traitement de la requête LuaQuickHandler /path/to/script.lua hook_function_name server configvirtual host +directory.htaccess All -

...

+ +

Cette phase s'exécute juste après l'attribution de la requête à + un serveur virtuel, et permet d'effectuer certains traitements avant + le déroulement des autres phases, ou de servir une requête sans + avoir à la traduire, l'associer à un espace de stockage, etc... + Comme cette phase s'exécute avant toute autre, les directives telles + que Location ou + Directory ne + sont pas encore prises en compte, car Les URI n'ont pas encore été + entièrement interprétés. +

Contexte

Cette directive ne peut être utilisée ni à l'intérieur d'une section Directory ou Require :

- LuaRoot /usr/local/apache2/lua LuaAuthzProvider foo authz.lua authz_check_foo <Location /> - Require foo bar + Require foo johndoe </Location> - + +require "apache2" +function authz_check_foo(r, who) + if r.user ~= who then return apache2.AUTHZ_DENIED + return apache2.AUTHZ_GRANTED +end +
+ diff --git a/docs/manual/programs/apxs.xml.fr b/docs/manual/programs/apxs.xml.fr index 0580598d94..a950bd5177 100644 --- a/docs/manual/programs/apxs.xml.fr +++ b/docs/manual/programs/apxs.xml.fr @@ -1,7 +1,7 @@ - + @@ -237,6 +237,11 @@ tant qu'options supplémentaires à la commande libtool --mode=link. Vous pouvez l'utiliser pour ajouter des options locales spécifiques à l'éditeur de liens. + +
-p
+
Avec cette option, apxs effectue l'édition de liens avec les + bibliothèques apr/apr-util. Elle permet de compiler les programmes + helper qui utilisent les bibliothèques apr/apr-util.
diff --git a/docs/manual/programs/rotatelogs.xml.fr b/docs/manual/programs/rotatelogs.xml.fr index c9f9e871aa..a55902b337 100644 --- a/docs/manual/programs/rotatelogs.xml.fr +++ b/docs/manual/programs/rotatelogs.xml.fr @@ -1,7 +1,7 @@ - + @@ -45,6 +45,7 @@ [ -v ] [ -e ] [ -c ] + [ -n nombre-de-fichiers ] fichier-journal heure-de-rotation|taille-fichier(B|K|M|G) [ décalage ]

@@ -108,6 +109,10 @@ opérations d'ouverture et de fermeture de fichiers.
Envoie les messages de journalisation vers stdout. Ceci s'avère utile lorsque les journaux doivent être traités par un autre programme.
+
-n nombre-de-fichiers
+
Utilise une liste circulaire de fichiers sans repères de temps. Avec +-n 3, la série de fichiers conservés sera "logfile", "logfile.1", "logfile.2".
+
fichier-journal

Le chemin et le nom de base du fichier journal. Si fichier-journal contient des caractères '%', il est considéré -- 2.40.0