2,088 14/12/2025 07/04/2026 12 min

MaxRequestWorkers è uno dei parametri più critici per configurare correttamente Apache e ottimizzare le prestazioni del server web. Questa direttiva controlla il numero massimo di richieste simultanee che Apache può gestire, rappresentando un equilibrio cruciale tra la capacità di servire i visitatori e la stabilità del sistema. Una configurazione inadeguata può portare a crash del server durante i picchi di traffico o, al contrario, a un sottoutilizzo delle risorse disponibili. Questo articolo fornisce una guida completa su come comprendere, calcolare e configurare correttamente MaxRequestWorkers in base alle specifiche del tuo server e alle tue esigenze di traffico.

Comprendere MaxRequestWorkers e l'evoluzione della direttiva

MaxRequestWorkers è una direttiva fondamentale di Apache che definisce il limite massimo di connessioni simultanee che il server può servire contemporaneamente. Prima di Apache versione 2.3.13, questa direttiva era chiamata MaxClients, ma il nome è stato cambiato per riflettere meglio il comportamento nei moduli MPM moderni (Multi-Processing Modules), in particolare nei moduli Worker ed Event che utilizzano thread anziché soli processi.

Il significato di MaxRequestWorkers varia leggermente a seconda del modulo MPM utilizzato. Nel modulo Prefork, ognuno dei processi figlio gestisce una singola connessione HTTP alla volta, quindi MaxRequestWorkers rappresenta il numero massimo di processi che verranno lanciati. Nei moduli Worker ed Event, invece, MaxRequestWorkers rappresenta il numero totale di thread che saranno disponibili per servire i client, distribuiti tra diversi processi figlio.

Comprendere questa distinzione è essenziale perché influisce direttamente su come dovrai calcolare il valore appropriato per il tuo server. Se imposti MaxRequestWorkers troppo basso, il tuo server rifiuterà le connessioni legittime durante i periodi di carico elevato. Se lo imposti troppo alto, consumerai memoria eccessiva e il sistema potrebbe crashare.

I tre moduli MPM di Apache e quando usarli

Apache offre tre moduli MPM principali, ognuno con caratteristiche e configurazioni diverse. Scegliere il modulo corretto è il primo passo per configurare correttamente MaxRequestWorkers.

MPM Prefork: il modello legacy ma compatibile

Prefork è il modulo più vecchio di Apache e non utilizza thread. Invece, crea un processo figlio separato per gestire ogni connessione HTTP. Questa architettura significa che ogni richiesta consuma la memoria di un intero processo, rendendo Prefork particolarmente inefficiente dal punto di vista della memoria, soprattutto durante periodi di carico elevato.

Prefork rimane il modulo predefinito in molte distribuzioni Linux più vecchie e continua ad essere utilizzato quando la compatibilità con applicazioni legacy è fondamentale. Nel modello Prefork, MaxRequestWorkers corrisponde direttamente al numero massimo di processi figlio che il server può lanciare. Il valore predefinito è 256.

MPM Worker: il modello ibrido effciente

Worker rappresenta un significativo miglioramento rispetto a Prefork. Utilizza un modello ibrido multi-processo multi-thread, dove ciascun processo figlio crea un numero fisso di thread. Questo significa che potrai servire molte più connessioni simultanee utilizzando meno memoria rispetto a Prefork.

Nel modulo Worker, i parametri ServerLimit (numero di processi figlio), ThreadsPerChild (numero di thread per processo), e MaxRequestWorkers sono intrinsecamente collegati mediante la formula: ServerLimit × ThreadsPerChild = MaxRequestWorkers. Se il valore di MaxRequestWorkers che desideri richiede più di 16 processi (il valore predefinito di ServerLimit), devi anche aumentare ServerLimit.​​

MPM Event: il modello moderno e ottimizzato

Event è il modulo più nuovo, introdotto come stabile in Apache 2.4. È simile a Worker, ma con una differenza cruciale: Event dedica un thread solo alla richiesta effettiva, non all'intera connessione HTTP. Quando una richiesta è completata, il thread viene immediatamente liberato, anche se la connessione KeepAlive rimane aperta.

Questo design consente a Event di gestire molte più connessioni simultanee con meno thread, rendendolo ideale per server moderni con alto traffico. Event è ora il modulo MPM predefinito in Apache 2.4+ ed è largamente consigliato per qualsiasi nuova configurazione.

Determinare il valore corretto di MaxRequestWorkers

Calcolare il valore appropriato di MaxRequestWorkers è essenziale per ottenere prestazioni ottimali. Non c'è una soluzione universale; la configurazione dipende da diversi fattori specifici del tuo server e della tua applicazione.

Analizzare il consumo di memoria di Apache

Il primo passo è capire quanta memoria consuma mediamente un processo Apache sul tuo server. Puoi farlo eseguendo il seguente comando nella riga di comando:

ps -ylC httpd --sort:rss | awk 'NR!=1 {print $8 / 1024}'

Questo comando mostra il consumo di memoria di ogni processo Apache in megabyte. Registra il valore medio; supponiamo ad esempio che sia circa 20-30 MB per processo.

Calcolare la memoria disponibile

Successivamente, determina quanta memoria totale è disponibile per Apache. Puoi controllare la memoria disponibile del sistema eseguendo:

free -m | awk 'NR==2 {print $7}'

Idealmente, dovresti riservare il 25% della memoria totale per il sistema operativo e altri servizi (database, cache, ecc.). Per un server dedicato esclusivamente ad Apache, puoi utilizzare una percentuale maggiore della memoria disponibile.

Applicare la formula del calcolo

Dopo aver ottenuto questi dati, puoi calcolare MaxRequestWorkers utilizzando la formula:​MaxRequestWorkers=Consumo medio per processo(Memoria totale - Memoria riservata)

Ad esempio, se il tuo server ha 16 GB di RAM, riservi 4 GB per il sistema e altri servizi, e ogni processo Apache consuma mediamente 30 MB, il calcolo sarebbe:​MaxRequestWorkers=30 MB16384 MB−4096 MB=30 MB12288 MB≈409

In questo caso, potresti impostare MaxRequestWorkers a circa 400 per mantenere un margine di sicurezza. Questo approccio pragmatico evita il consumo eccessivo di memoria mentre consente al server di servire efficacemente il traffico atteso.

Configurazione dei parametri correlati

MaxRequestWorkers non opera in isolamento. Diversi altri parametri devono essere configurati in armonia per ottenere risultati ottimali.

La relazione tra ServerLimit, ThreadsPerChild e MaxRequestWorkers

Nei moduli Worker ed Event, la relazione fondamentale è ServerLimit × ThreadsPerChild = MaxRequestWorkers. Se desideri raggiungere 1.000 worker simultanei con ThreadsPerChild impostato a 25 (il valore predefinito), avrai bisogno di un ServerLimit di almeno 40.​​

ThreadsPerChild specifica il numero di thread creati da ciascun processo figlio all'avvio del server. Il valore predefinito è 25. Aumentare ThreadsPerChild significa meno processi figlio necessari, ma più thread per processo, il che può portare a problemi durante il riciclaggio dei processi (graceful restart).​​

ServerLimit è il limite massimo di processi figlio che Apache può lanciare. È un valore fisso che può essere modificato solo attraverso un riavvio completo del server, non un reload. Impostare ServerLimit troppo alto alloca inutilmente memoria condivisa, mentre impostarlo troppo basso limita il potenziale di scalabilità.

MinSpareThreads e MaxSpareThreads

MinSpareThreads definisce il numero minimo di thread idle che il server mantiene sempre disponibili per gestire nuove richieste rapidamente. Il valore predefinito è 75. Se il numero di thread idle scende al di sotto di questo valore, Apache crea automaticamente nuovi processi figlio per mantenere questo numero minimo.

MaxSpareThreads specifica il numero massimo di thread idle che il server manterrà. Il valore predefinito è 250. Se il numero di thread idle supera questo valore, Apache termina i processi figlio in eccesso per risparmiare memoria.

Una pratica comune è impostare MinSpareThreads e MaxSpareThreads in modo proporzionale. Ad esempio, se MaxRequestWorkers è 400 e ThreadsPerChild è 25, potresti impostare MinSpareThreads a 75 (pari a StartServers × ThreadsPerChild) e MaxSpareThreads a 250.​

MaxConnectionsPerChild

MaxConnectionsPerChild specifica il numero massimo di connessioni che un singolo processo figlio gestirà prima di essere riciclato (terminato e sostituito con un nuovo processo). Impostare questo valore su 10.000 o simile previene perdite di memoria accidentali nei moduli Apache che potrebbero avere piccoli leak.

Impostare MaxConnectionsPerChild a 0 (zero) consente ai processi di rimanere attivi indefinitamente, il che è generalmente accettabile su server ben mantenuti ma può portare a problemi su server con applicazioni problematiche.

Dove e come modificare la configurazione

La configurazione di MaxRequestWorkers si trova in un file di configurazione Apache specifico per il modulo MPM utilizzato. La posizione esatta varia in base al sistema operativo e alla distribuzione.

Posizioni comuni dei file di configurazione

Su sistemi RHEL/CentOS, il file si trova generalmente in:

/etc/httpd/conf.modules.d/00-mpm.conf

oppure

/etc/httpd/conf.modules.d/01-cgi.conf

Su sistemi Debian/Ubuntu, il file di configurazione si trova in:

/etc/apache2/mods-enabled/mpm_event.conf
/etc/apache2/mods-enabled/mpm_worker.conf
/etc/apache2/mods-enabled/mpm_prefork.conf

Esempio di configurazione per MPM Event

Un esempio di configurazione ottimale per MPM Event su un server con moderato traffico potrebbe essere:

<IfModule mpm_event_module>
ServerLimit 16
StartServers 3
MinSpareThreads 75
MaxSpareThreads 250
ThreadLimit 64
ThreadsPerChild 25
MaxRequestWorkers 400
MaxConnectionsPerChild 10000
</IfModule>

Esempio di configurazione per MPM Worker

Per MPM Worker, una configurazione simile ma leggermente diversa potrebbe essere:

<IfModule mpm_worker_module>
ServerLimit 23
StartServers 16
MinSpareThreads 200
MaxSpareThreads 400
ThreadsPerChild 25
MaxRequestWorkers 400
MaxConnectionsPerChild 10000
</IfModule>

Esempio di configurazione per MPM Prefork

Per MPM Prefork (se ancora necessario per compatibilità), la configurazione è più semplice poiché non utilizza thread:

<IfModule mpm_prefork_module>
ServerLimit 250
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxRequestWorkers 250
MaxConnectionsPerChild 10000
</IfModule>

Verificare e applicare le modifiche

Dopo aver modificato il file di configurazione, è cruciale verificare la sintassi prima di riavviare Apache per evitare errori di avvio.

Verificare la sintassi della configurazione

Esegui il seguente comando per verificare che la configurazione sia corretta:

sudo apachectl configtest
# oppure
sudo apache2ctl configtest

Se il comando risponde con "Syntax OK", sei pronto a procedere. Se c'è un errore, correggi il file di configurazione e ripeti il test.

Riavviare Apache

Dopo aver verificato la sintassi, riavvia Apache per applicare le modifiche:

RHEL/CentOS:
sudo systemctl restart httpd

Debian/Ubuntu:
sudo systemctl restart apache2

Nota che quando modifichi ServerLimit o ThreadLimit, è necessario un riavvio completo di Apache, non un semplice reload, poiché questi parametri vengono letti solo all'avvio.

Monitorare e diagnosticare problemi di MaxRequestWorkers

Una volta configurato MaxRequestWorkers, è essenziale monitorare il tuo server per assicurarti che il valore sia appropriato. Apache fornisce strumenti per farlo.

Abilitare mod_status

Il modulo mod_status di Apache fornisce una pagina web con statistiche in tempo reale sullo stato del server, incluso il numero di worker attivi e idle.

Per abilitare mod_status, modifica il file di configurazione Apache (generalmente /etc/apache2/apache2.conf o /etc/httpd/conf/httpd.conf) e aggiungi:

<Location /server-status>
SetHandler server-status
Require local
# Per accesso remoto, sostituisci "Require local" con:
# Require ip YOUR_IP_ADDRESS
</Location>

Quindi accedi al tuo server da un browser all'URL: http://tuoserver.it/server-status

Interpretare i messaggi di errore

Se vedi nei log di Apache l'errore:

AH00484: server reached MaxRequestWorkers setting, consider raising the MaxRequestWorkers setting

Questo significa che il server ha raggiunto il numero massimo di worker e non poteva servire ulteriori connessioni. Questo è un chiaro indicatore che devi aumentare MaxRequestWorkers (se la memoria lo consente) o ottimizzare le tue applicazioni.

Se vedi:

AH03490: scoreboard is full, not at MaxRequestWorkers. Increase ServerLimit.

Questo significa che hai raggiunto il limite massimo di processi (ServerLimit), ma non hai raggiunto MaxRequestWorkers. Devi aumentare ServerLimit per consentire più processi figlio.

Monitorare l'utilizzo di memoria e CPU

Usa comandi come htop o top per monitorare costantemente l'utilizzo di memoria e CPU durante periodi di carico elevato:

watch -n 1 "echo -n 'Processi Apache: '; pgrep -c httpd"

Se noti che il server si avvicina al limite di memoria disponibile anche prima di raggiungere MaxRequestWorkers, devi ridurre questo valore. Al contrario, se durante i picchi di traffico vedi l'errore AH00484 prima di aver utilizzato gran parte della memoria, è sicuro aumentare MaxRequestWorkers.

Best practice e raccomandazioni di tuning

Configurare correttamente MaxRequestWorkers richiede una combinazione di calcoli matematici e monitoraggio pragmatico. Ecco alcune best practice consolidate dalla comunità Apache:

1. Inizia conservativo: Inizia con un valore di MaxRequestWorkers relativamente basso (50-150 per server piccoli, 250-500 per server medi) e aumenta gradualmente mentre monitori le prestazioni. Non tentare di configurare tutto perfettamente al primo colpo.

2. Usa MPM Event per nuove configurazioni: Se non hai vincoli di compatibilità rigorosi, utilizza sempre MPM Event nei nuovi server. È il modulo più moderno, efficiente e ben mantenuto di Apache 2.4+.

3. Mantieni il rapporto ServerLimit × ThreadsPerChild: Ricorda sempre che in Worker ed Event, MaxRequestWorkers deve essere uguale a ServerLimit × ThreadsPerChild. Se il tuo calcolo richiede MaxRequestWorkers = 1.000 e ThreadsPerChild = 25, allora ServerLimit deve essere 40.​​

4. Riduci i moduli non necessari: Ogni modulo aggiuntivo caricato da Apache consuma memoria. Disabilita i moduli che non stai utilizzando per ridurre l'impronta di memoria di ogni processo.

5. Usa KeepAliveTimeout basso: Se utilizzi MPM Event (che è consigliato), imposta KeepAliveTimeout su un valore basso come 1-2 secondi. Questo consente ai thread di essere rilasciati rapidamente dopo che una richiesta è completata.

6. Monitora continuamente: Non configurare MaxRequestWorkers una volta e dimenticarsi. Il traffico varia nel tempo, le applicazioni cambiano, i server si aggiornano. Monitora le prestazioni mensilmente e fai aggiustamenti secondo necessità.

7. Considera la scalabilità: Su server ad altissimo traffico, considera di utilizzare un setup di load balancing con più istanze di Apache piuttosto che tentare di massimizzare MaxRequestWorkers su un singolo server. Questo aumenta la resilienza e consente una manutenzione più semplice.

Configurare correttamente MaxRequestWorkers su Apache è un compito critico che richiede una combinazione di calcolo, comprensione dell'architettura di Apache, e monitoraggio pratico. Non esiste un valore magico che funziona per tutti i server; il valore appropriato dipende dalla memoria disponibile, dall'utilizzo di risorse delle tue applicazioni, e dal traffico atteso.

Il processo di base è: (1) comprendere quale modulo MPM stai utilizzando; (2) calcolare il consumo medio di memoria per processo; (3) determinare la memoria disponibile per Apache; (4) applicare la formula per calcolare un valore iniziale appropriato; (5) configurare i parametri correlati come ServerLimit e ThreadsPerChild in armonia; (6) monitorare il server per verificare che il valore sia appropriato.

Iniziando con un approccio conservatore, aumentando gradualmente, e monitorando continuamente, potrai trovare la configurazione di MaxRequestWorkers che offre il migliore equilibrio tra prestazioni, scalabilità e stabilità per il tuo server Apache. Ricorda che Apache 2.4 con MPM Event è la scelta consigliata per praticamente qualsiasi configurazione moderna, poiché offre le migliori prestazioni e il miglior utilizzo di memoria rispetto ai moduli precedenti.