OpenSSL VPN Serveurs de messagerie |
Mod/Apache
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. 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 */ };
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:
|