Ci sono un certo numero di moduli MPM (moduli multi-processing), ma di gran lunga il più diffuso (almeno nelle piattaforme * nix) sono i tre principali: prefork
, worker
e event
. In sostanza, rappresentano l'evoluzione del server Web Apache e i diversi modi in cui il server è stato creato per gestire le richieste HTTP entro i vincoli di elaborazione del tempo nel corso della sua lunga storia (in termini di software).
mpm_prefork
è .. beh .. è compatibile con tutto. Esegue una serie di processi figlio per soddisfare le richieste e i processi figlio servono solo una richiesta alla volta. Poiché ha il processo del server seduto lì, pronto per l'azione e non ha bisogno di gestire il marshalling dei thread, in realtà è più veloce dei più moderni MPM threaded quando hai a che fare con una singola richiesta alla volta - ma le richieste simultanee ne risentono, poiché vengono fatti attendere in linea fino a quando un processo del server è gratuito. Inoltre, tentando di aumentare il numero di processi figlio di prefork, risuccherai facilmente un po 'di RAM.
Probabilmente non è consigliabile usare prefork a meno che non sia necessario un modulo che non sia thread-safe.
Usa se: hai bisogno di moduli che si rompono quando vengono usati i thread, come mod_php
. Anche allora, considera l'utilizzo di FastCGI e php-fpm
.
Non usare se: i tuoi moduli non si romperanno nel threading.
mpm_worker
usa il threading, che è di grande aiuto per la concorrenza. Il lavoratore si allontana da alcuni processi figlio, che a loro volta si allontanano da fili figlio; simile a prefork, alcuni thread di riserva sono tenuti pronti, se possibile, per servire le connessioni in entrata. Questo approccio è molto più gentile sulla RAM, poiché il conteggio dei thread non ha un impatto diretto sull'uso della memoria come il conteggio dei server in prefork. Gestisce anche la concorrenza molto più facilmente, poiché le connessioni devono solo attendere un thread gratuito (che di solito è disponibile) invece di un server di riserva in prefork.
Utilizzare se: si utilizza Apache 2.2 o 2.4 e si esegue principalmente SSL.
Non usare se: non puoi davvero sbagliare, a meno che tu non abbia bisogno di prefork per la compatibilità.
Tuttavia, tieni presente che i gradini sono collegati alle connessioni e non alle richieste , il che significa che una connessione keep-alive mantiene sempre in attesa un thread fino a quando non viene chiuso (il che può richiedere molto tempo, a seconda della configurazione). Ecco perché abbiamo ..
mpm_event
è molto simile al lavoratore, strutturalmente; è stato appena spostato dallo stato "sperimentale" a "stabile" in Apache 2.4. La grande differenza è che utilizza un thread dedicato per gestire le connessioni mantenute attive e passa le richieste ai thread figlio solo quando è stata effettivamente effettuata una richiesta (consentendo a tali thread di eseguire il backup immediatamente dopo il completamento della richiesta). Questo è ottimo per la concorrenza di client che non sono necessariamente tutti attivi contemporaneamente, ma fanno richieste occasionali e quando i client possono avere un timeout di lunga durata.
L'eccezione qui è con le connessioni SSL; in tal caso, si comporta in modo identico al lavoratore (incollando una determinata connessione a un determinato thread fino alla chiusura della connessione).
Usa if: sei su Apache 2.4 e ti piacciono i thread, ma non ti piace avere thread in attesa di connessioni inattive. A tutti piacciono le discussioni!
Non usare se: Non sei su Apache 2.4 o hai bisogno di prefork per la compatibilità.
Nel mondo odierno di slowloris , AJAX e browser a cui piace multiplexare 6 connessioni TCP (con keep-alive, ovviamente) al tuo server, la concorrenza è un fattore importante nel rendere scalabili e scalabili i tuoi server. La storia di Apache lo ha legato a questo proposito, e mentre in realtà non è ancora all'altezza di nginx o lighttpd in termini di utilizzo o scala delle risorse, è chiaro che il team di sviluppo sta lavorando per costruire un web server che sia ancora rilevante nel mondo di oggi ad alta richiesta di concorrenza.