2011-12-02 2 views
0

Je commence juste à comprendre comment fonctionne un serveur apache etles autre jour, je suis tombé sur un problème lors de la programmation d'une page Web très simple, tout en affichant un nombre de succès pour la page:Apache Prefork/MPM Worker

/* The simplest HelloWorld module */ 
#include <httpd.h> 
#include <http_protocol.h> 
#include <http_config.h> 

static int noOfViews = 0; 

static int helloworld_handler(request_rec *r) 
{ 

    if (!r->handler || strcmp(r->handler, "helloworld")) { 
     return DECLINED; 
    } 

    if (r->method_number != M_GET) { 
     return HTTP_METHOD_NOT_ALLOWED; 
    } 
    noOfViews++; 

    ap_set_content_type(r, "text/html;charset=ascii"); 
    ap_rputs("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\">\n", 
      r); 
    ap_rputs("<html><head><title>Apache HelloWorld " 
      "Module</title></head>", r); 
    ap_rputs("<body><h1>Hello World!</h1>", r); 
    ap_rputs("<p>This is the Apache HelloWorld module!</p>", r); 
    ap_rprintf(r, "<p>Views: %d</p>", noOfViews); 
    ap_rputs("</body></html>", r); 
    return OK; 
} 

static void helloworld_hooks(apr_pool_t *pool) 
{ 
    ap_hook_handler(helloworld_handler, NULL, NULL, APR_HOOK_MIDDLE); 
} 

module AP_MODULE_DECLARE_DATA helloworld_module = { 
    STANDARD20_MODULE_STUFF, 
    NULL, 
    NULL, 
    NULL, 
    NULL, 
    NULL, 
      helloworld_hooks 
}; 

Ce qui s'est passé en fait c'est quand je rafraîchirais la page, le compteur d'accès augmenterait, mais parfois il tomberait aléatoirement en nombre. Quelqu'un m'a dit que c'était à cause de la façon dont fonctionnait le MPM Apache Prefork. Après avoir lu ceci:

http://httpd.apache.org/docs/2.0/mod/prefork.html

Je comprends le problème plus, mais je ne suis toujours pas sûr à 100% ce qui se passe. Ainsi, le MPM prefork crée un tas de processus enfants, dont certains sont inactifs, et attend que les clients se connectent. Ainsi, lorsque j'actualise la page, je me connecte à un ensemble de processus enfants différents que le serveur exécute. Cependant, ce module a un nombre limité de processus fils qu'il peut maintenir en même temps, donc parfois quand il tue un processus, mon compteur tombe en panne. Je ne suis pas entièrement sûr si cette explication est correcte ou pourquoi exactement le compteur tombe.

Tous les conseils sont appréciés.

Répondre

0

Oui, soit cela soit vous avez un des autres processus Apache pour vous servir lorsque le compteur est tombé.

Vous pouvez essayer de configurer Apache de manière à ce qu'il ne génère qu'un seul processus fils qui existe pour toujours, mais en limitant les capacités d'Apaches.

Je vous recommande de garder votre module complètement apatride. Si vous voulez ce compteur, sauvegardez l'état dans un fichier ou une base de données et récupérez-le à partir de là quand vous en avez besoin. Vous pouvez même parler à un autre processus qui a le compteur d'accès juste dans une variable statique comme votre module pour le moment.

0

Vous stockez votre nombre de hits dans la variable noOfViews, ce qui signifie dans la mémoire d'un seul processus.

Que ce soit sous MPM worker ou prefork, httpd engendre généralement plusieurs processus enfants. Chacun aura son propre stockage de mémoire pour noOfViews, de sorte que vous ne comptez que le nombre de hits pour ce processus. Lorsque votre requête est attribuée au hasard à un processus différent, elle a un compteur différent.

Vous remarquerez cela plus pour prefork que worker parce que chaque processus prefork ne gère qu'une requête à la fois, alors que worker est threadé et peut gérer plusieurs; Il y a donc beaucoup plus de processus sous prefork que de travailleurs. Mais la même chose se produira sous MPM lorsque vos demandes sont dirigées vers différents processus.

Notez également que le redémarrage de httpd ou la suppression de processus individuels entraîne la perte du compteur. Les nouveaux processus vont commencer à un compte de 0. Donc, ce n'est pas une bonne approche si votre objectif est de compter les hits globalement.