Recent Changes - Search:

Accueil

OpenSSL

SyncML

Apache Portable Runtime

Libxml2

Net-snmp

CUrl

Boost

Perl

ZLib

Samba

VPN

Serveurs de messagerie

edit

Mod/Apache


Apache est un serveur HTTP extrêmement populaire, en effet, d'après netcraft, ce serveur héberge 50% des sites web mondiaux .
Ce serveur est de part sa conception un serveur de sockets modulable dont, le plus connu est le module HTTP (d'ailleurs lié statiquement à l'exécutable, httpd.exe -t -D DUMP_MODULES).

Pourquoi créer un module ?

Plusieurs raisons : pour le plaisir, le développement est un art complexe et le seul plaisir de le maitriser est nécessaire pour espérer devenir un bon développeur ! mais aussi, parce que développer un mod apache est le meilleur moyen d'obtenir le maximum de performances pour le traitement de requêtes web, j'ai personnellement travaillé pour une administration qui a basé l'ensemble de son SI sur des développements de cette nature, au prix d'un effort certain, le résultat est sans doute un des sites web de l'administration Française qui résiste le mieux à des montés en charge fulgurantes.

J'aborderai ici, le développement de mod apache sous Windows, car Microsoft fournit gratuitement l'environnement de développement le plus aboutit du Marché, Visual Studio 2008 express edition, cette version ne permet pas le développement d'applications avec interface mais là n'étant pas le problème nous pourrons nous en contenter, et aussi parce qu'un développeur sous Unix fera très facilement le portage dans son environnement.

L'architecture d'Apache 2

Apache est un serveur de socket qui charge au démarrage des modules venant étendre des fonctionnalités qui sinon, de base, se limiteraient aux communications réseau SYN->SYN/ACK. Le core_module se charge de recevoir, par l'intermédiaire des sockets, des flux alimentant des buffers, un système d'événement vient ensuite provoquer des traitements consommant les buffers et générant les réponses qui se videront par la suite, elles aussi, dans les sockets et deviendront les réponses aux clients. Voici pour le principe.

Un exemple de module : helloworld

C'est pas original mais c'est formateur.

#include "ap_compat.h"
#include "http_core.h"
#include "http_config.h"
#include "http_protocol.h"
#include "http_log.h"

module AP_MODULE_DECLARE_DATA helloworld_module;

static int helloworld_handler(request_rec *r)
{
        fprintf(stderr,"helloworld-handler");
        if (!r->handler || strcmp(r->handler, "helloworld-handler"))
                return DECLINED;

    r->content_type = "text/html";
    ap_send_http_header(r);
    ap_rputs("<H1>Hello <i>Apache 2.2</i> World!</H1>" ,r);
        ap_log_rerror(APLOG_MARK,  APLOG_NOTICE, 0, r,"[%s@%i] hello world (%s)",__FILE__,__LINE__,r->handler);
        return OK;
}

static void register_hooks(apr_pool_t *p)
{
        ap_hook_handler(helloworld_handler, NULL, NULL, APR_HOOK_MIDDLE);
}

module AP_MODULE_DECLARE_DATA helloworld_module = {
    STANDARD20_MODULE_STUFF,
    NULL,                       /* create per-directory config structure */
    NULL,                       /* merge per-directory config structures */
    NULL,                       /* merge per-directory config structures */
    NULL,                       /* merge per-server config structures */
    NULL,                       /* merge per-server config structures */
    register_hooks              /* register hooks */
};
 

module AP_MODULE_DECLARE_DATA helloworld_module;
cette ligne baptise le module qui restera connu sous ce nom dans le fichier de configuration httpd.conf grâce à la ligne ci-dessous qui signalera au moteur que le binaire mod_helloworld.so contient une structure définissant helloworld_module.
LoadModule helloworld_module modules/mod_helloworld.so

Le module est maintenant interrogé à chaque requête reçue par le serveur Apache. La gestion des événements doit maintenant passer au module une information complémentaire qui permettra de déterminer rapidement pour quelle raison il est invoqué par l'ajout d'un handler levé uniquement lors de l'accès à une page particulière, pour cela l'ajout de ces quelques lignes au fichier httpd.conf suffira:
<Location /welcome>
SetHandler helloworld-handler
</Location>
Ainsi, le module sera comme à chaque fois invoqué à chaque requête sur le site mais n'aura en plus un handler valant helloworld-handler que si le client a demandé la page /welcome. Nous pouvons maintenant tester la raison pour laquelle Apache vient nous importuner ! Le reste correspond à un flux de réponse, une message à insérer dans la log et finalement un message pour dire qu'il y eu un traitement de la requête.
Voici ce qui devrait apparaitre dans le navigateur




Le projet de base est celui d'une DLL, par convenance j'ai changé l'extension de la DLL en SO (shared objet) bien que nous soyons sous Windows. Pour le reste, les chemins d'accès aux différents éléments devra sans doute être adapté aux besoins.

Ci-après, l'archive Visual Studio complète de la solution

un lien intéressant sur le sujet http://modules.apache.org/reference.php

Edit - History - Print - Recent Changes - Search
Page last modified on April 06, 2011, at 10:56 AM