Є цілий ряд модулів MPM (Мульти-Модулі обробки), але на сьогоднішній день найбільш широко використовується (принаймні , на * NIX платформах) є трьома основними з них: prefork
, worker
, і event
. По суті, вони представляють еволюцію веб-сервера Apache і різні способи створення сервера для обробки запитів HTTP у межах обчислювальних обмежень за довгу (в програмному відношенні) історію.
mpm_prefork
є .. ну .. це сумісно з усім. Він відкручує ряд дочірніх процесів для обслуговування запитів, і дочірні процеси обслуговують лише один запит за один раз. Оскільки серверний процес сидить там, готовий до дії, і не потрібно мати справу з розбиттям потоків, це насправді швидше, ніж більш сучасні потокові MPM, коли ви одночасно займаєтесь лише одним запитом - але паралельні запити страждають, оскільки вони змушені чекати в черзі, поки серверний процес не буде вільним. Крім того, намагаючись збільшити кількість процесів дочірньої підготовки, ви легко відсмоктуєте серйозну оперативну пам'ять.
Можливо, не рекомендується використовувати префорк, якщо вам не потрібен модуль, який не є безпечним для потоків.
Використовуйте, якщо: Вам потрібні модулі, які ламаються, коли використовуються нитки, наприклад mod_php
. Вже тоді подумайте про використання FastCGI і php-fpm
.
Не використовуйте, якщо: Ваші модулі не розбиваються на різьблення.
mpm_worker
використовує нитку - це велика допомога для одночасності. Працівник відкручує деякі дочірні процеси, які в свою чергу відкручують дочірні нитки; подібно до префорка, деякі запасні нитки готуються, якщо можливо, для обслуговування вхідних з'єднань. Цей підхід значно приємніший для оперативної пам'яті, оскільки кількість потоків не має прямого відношення до використання пам'яті, як це робить кількість серверів у префорках. Він також обробляє паралельність набагато простіше, оскільки для з'єднання просто потрібно дочекатися вільної нитки (яка зазвичай доступна) замість запасного сервера в префорку.
Використовуйте, якщо: Ви перебуваєте на Apache 2.2 або 2.4 та працюєте в основному з SSL.
Не використовуйте, якщо: Ви дійсно не можете помилитися, якщо вам не потрібен префорк для сумісності.
Однак зауважте, що протектори прикріплені до з'єднань, а не до запитів - це означає, що з'єднання в режимі "живого" завжди тримає потік, доки воно не закриється (що може тривати довгий час, залежно від конфігурації). Тому ми маємо ..
mpm_event
дуже схожий на працівника, структурно; він просто перейшов з "експериментального" в "стабільний" статус в Apache 2.4. Велика різниця полягає в тому, що він використовує виділений потік для обробки збережених живих з'єднань і передає руки до дочірніх потоків лише тоді, коли запит був фактично зроблений (дозволяючи цим потокам звільнити резервну копію відразу після завершення запиту). Це відмінно підходить для одночасності клієнтів, які необов’язково є активними одночасно, але часто запитують, і коли клієнти можуть мати тривалий час очікування.
Виняток тут - із з'єднаннями SSL; у такому випадку він поводиться однаково з робочим (склеюючи задане з'єднання даною ниткою, поки з'єднання не закриється).
Використовуйте, якщо: Ви перебуваєте на Apache 2.4 і вам подобаються потоки, але вам не подобається, щоб потоки очікували на простої з'єднання. Всім подобаються нитки!
Не використовуйте, якщо: Ви не на Apache 2.4, або вам потрібен префорк для сумісності.
У сучасному світі slowloris , AJAX та веб-переглядачів, які люблять мультиплексувати 6 TCP-з'єднань (звичайно, із збереженням живих) до вашого сервера, одночасність є важливим фактором для того, щоб ваш сервер добре масштабував і масштабував. Історія Apache зв'язала це з цього приводу, і хоча це дійсно досі не врівень з подібними nginx або lighttpd за рівнем використання ресурсів або масштабів, зрозуміло, що команда розробників працює над створенням веб-сервера, який все ще актуальний в сучасному світі з високим рівнем запиту та одночасності.