Apache Prefork / Worker MPM - PullRequest
       4

Apache Prefork / Worker MPM

0 голосов
/ 02 декабря 2011

Я только начинаю понимать, как работает сервер Apache, и на днях я столкнулся с проблемой при программировании очень простой веб-страницы с отображением количества обращений к странице:

/* 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
};

Что в основномслучалось, когда я обновлял страницу, счетчик посещений увеличивался, но иногда он случайно падал в количествеКто-то сказал мне, что это из-за того, как работает Apache Prefork MPM.Прочитав это:

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

Я понимаю проблему больше, но я все еще не уверен на 100%, что происходит.Таким образом, prefork MPM создает несколько дочерних процессов, некоторые из которых бездействуют, и ожидает подключения клиентов, поэтому, когда я обновляю страницу, я на самом деле подключаюсь к группе различных дочерних процессов, запущенных сервером.Однако этот модуль имеет ограниченное количество дочерних процессов, которые он может поддерживать одновременно, поэтому иногда, когда он убивает процесс, мой счетчик отключается.Я не совсем уверен, правильно ли это объяснение или почему именно счетчик сбрасывается.

Весь совет приветствуется.

Ответы [ 2 ]

0 голосов
/ 18 июня 2014

Вы сохраняете количество обращений в переменной noOfViews, что означает, что в памяти отдельного процесса.

Независимо от того, работает ли он в MPM для рабочей среды или с предварительной обработкой, httpd обычно порождает несколько дочерних процессов.У каждого будет свое собственное хранилище для noOfViews, так что вы подсчитываете только количество совпадений для этого процесса.Когда ваш запрос случайным образом передается другому процессу, он имеет другой счетчик.

Вы заметите это больше для prefork, чем для worker, потому что каждый процесс prefork обрабатывает только один запрос за раз, в то время как worker является многопоточным и можетобрабатывать несколько;таким образом, процессы prefork намного больше, чем рабочие.Но то же самое происходит и в MPM, когда ваши запросы направлены к разным процессам.

Также обратите внимание, что перезапуск httpd или просто уничтожение отдельных процессов приведет к потере счетчика.Новые процессы начнутся с нуля. Итак, это не очень хороший подход, если ваша цель состоит в том, чтобы считать хиты глобально.

0 голосов
/ 02 декабря 2011

Да, либо вы получили один из других процессов Apache, чтобы обработать запрос, когда счетчик отключился.

Вы можете попробовать настроить Apache таким образом, чтобы он порождал ровно 1 дочернего элемента.процесс, который живет вечно, но тем самым вы ограничиваете возможности Apache.

Я рекомендую вам попытаться сохранить ваш модуль полностью без сохранения состояния.Если вы хотите этот счетчик посещений, сохраните состояние в файле или базе данных и извлекайте его оттуда, когда вам это нужно.Вы могли бы даже поговорить с другим процессом, у которого счетчик посещений находится просто в статической переменной, такой как ваш модуль на данный момент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...