Ottimizzazione di Apache per WordPress

apache-pinguini Dopo aver installato il blog sul web server Apache, ecco come ottimizzare tutta la piattaforma.

Infatti non bisogna concentrarsi unicamente su un componente ma per ottenere alte prestazioni, tutto il sistema deve essere configurato ad hoc.

WordPress è un CMS molto esigente in termini di risorse; ogni versione che viene rilasciata introduce funzioni nuove e interessanti ma aumenta la complessità e la pesantezza del codice.

Sistema operativo

Per migliorare le performance di Debian, è certamente una buona cosa evitare di usare moduli del kernel o deamon che non servono. Scegliendo solo l’ambiente base al momento dell’installazione della distribuzione già molto del lavoro è stato fatto.

Aggiornare frequentemente i programmi del proprio sistema operativo usando i comandi apt-get update e apt-get upgrade.

Il web server Apache

Apache è un web server completo e a volte più pesante ad altri concorrenti. Soluzioni come Lighttpd non sono ancora utilizzabili se si vogliono sfruttare caratteristiche avanzate molto utili come la riscrittura degli URL (mod_rewrite).

Per evitare di consumare risorse di sistema eccessivamente bisogna disabilitare tutti i moduli di Apache che non servono.

Il punto nodale della messa a punto del web server risiede nel file /etc/apache2/apache2.conf

Nel file sono presenti due configurazioni che vengono utilizzate nel caso in cui si usi una versione prefork o worker di Apache. Nella maggior parte delle situazioni è bene usare la versione più sicura prefork che è più tollerante in caso di crash dei moduli.

KeepAlive

MaxKeepAliveRequests

KeepAliveTimeout

MinSpareServers

MaxSpareServers

StartServers

MaxClients

MaxRequestsPerChild

Se la funzione KeepAlive è impostata su On, più richieste vengono soddisfatte usando la medesima connessione TCP; per WordPress l’attivazione di KeepAlive è altamente consigliata perché molti elementi vengono inviati per visualizzare anche solo una pagina del blog.

KeepAliveTimeout consente di stabilire per quanto una connessione può rimanere stabilita. Mettere un valore compreso fra 2 e 5, generalmente non fa aspettare troppo i processi figli per servire nuovi richieste da parte di altri client. Impostando un valore alto può far diminuire la capacità di servire tante connessioni contemporaneamente.

MaxKeepAliveRequests descrive il numero di richieste persistenti autorizzate. Un valore compreso fra 100 e 500, dovrebbe consentire di ottenere buone prestazioni con mezzo migliaio di utenti. Un numero alto può portare ad un eccessivo uso delle risorse. Anche un numero basso deteriora le prestazioni perché una volta superato il limite delle connessioni persistenti, ogni ulteriore richiesta viene soddisfatta creando una nuova connessione TCP.

MaxClients è il numero massimo di processi figli che possono essere creati per servi le richieste, in particolare limita il numero di richieste simultanee che Apache servirà. Ogni ulteriore connessione verrà accodata fino a che un processo figlio non si liberi.

Un numero basso può portare ad aumentare sensibilmente i tempi di risposta del server, problema particolarmente degradante con elevato traffico. Un valore troppo alto conduce ad un aumento di utilizzo delle risorse e probabilmente all’uso della memoria swap che rovina drasticamente le performance del web server.

Il numero di MaxClients va scelto tenendo in considerazione il tipo di contenuto distribuito e l’ammontare di RAM disponibile. Per WordPress che distribuisce generalmente file dinamici, un processo figlio può aver bisogno di 15 megabyte (anche più…), mentre se si devono inviare file statici possono bastare 2 megabyte per child process.

Per calcolarlo, usare questa formula:

MaxClients = 5 * (Megabyte di memoria RAM disponibili per il server) / (dimensione dei figli in base al tipo).

Esempio: con 512 MB e con pagine dinamiche, ottengo 170.

Sono possibili anche valori più alti anche del 30%, ma questo deve essere provato empiricamente (facendo dei tentativi) per trovare il numero ottimale.

MinSpareServers e MaxSpareServers impostano rispettivamente il numero minimo di processi figli in attesa di connessioni e il numero massimo. Se MinSpareServers è troppo basso, ogni volta che si supera il numero di connessioni supera il valore Apache deve creare un nuovo processo per servire la richiesta. L’operazione di fork (o generazione di nuovi processi) è molto onerosa e più portare a dei rallentamenti nel servire i client. Ovviamente un numero elevato di processi in attesa consuma le risorse inutilmente.

Impostare MinSpareServers tra 5 e 8 e MaxSpareServers tra 10 e 20. Maggiore è la RAM e la potenza del processore e più alti possono essere i parametri.

StartServers è relativo al numero di processi figli creati all’avvio del web server che deve essere compreso fra MinSpareServers e MaxSpareServers (estremi inclusi).

In molti casi è meglio scegliere per StartServers lo stesso numero scelto per MinSpareServers.

MaxRequestsPerChild rappresenta il numero di connessioni gestite da un processo prima di essere terminato. Dopo aver servito molte richieste un processo può essere cresciuto di molto e può aver contribuito negativamente creando dei memory leak. Così è possibile finire un processo e avviarne uno nuovo. Naturalmente la creazione di nuovi processi è costosa. Mettendo 0, i processi non vengono mai terminati (altamente sconsigliato).

Un valore compreso fra 1000 e 2000 può andare bene.

Per rendere effettivi i cambiamenti riavviare Apache col comando:

# /etc/init.d/apache2 restart

Prossimamente il tunning di MYSQL, PHP e altro…

Commenti, precisazioni, vostre configurazioni e critiche ben accette.

7 pensieri riguardo “Ottimizzazione di Apache per WordPress

  1. Pingback: Ottimizzazione di Apache per Wordpress | valent
  2. Gianni ha detto:

    Volevo farti una domanda su MinSpareServers e MaxSpareServers.
    Io ho 6gb di ram, secondo te quali sono i giusti valori da impostare?

    Al momento la mia configurazione è questa

    StartServers 100
    MinSpareServers 50
    MaxSpareServers 200
    ServerLimit 2048
    MaxClients 2048
    MaxRequestsPerChild 2000

    StartServers 100
    MinSpareServers 50
    MaxSpareServers 200
    ServerLimit 2048
    MaxClients 2048
    MaxRequestsPerChild 2000

    a bene o devo effettuare delle modifiche?

  3. valent ha detto:

    1) è necessario sapere quale se ci sono altre applicazioni oppure il server è a completa disposizione del database MySQL apache.
    2) se c’è anche un server web, quale tipo di CMS (wordpress, drupal, phpbb…) è installato.
    3) quanti database sono attivi su MYSQL siti sono attivi e a quali linguaggi usano.

    Scusa per le richieste completamente forvianti, ma ero ancora nel mondo dei sogni (riposino pomeridiano).

  4. Gianni ha detto:

    Scusa il ritardo nella risposta.
    Sul server non ci sono altre applicazini oltre a mysql e a chkrootkit.

    Ci sono vari blog wordpress e altri siti creati da me in php.

    Sono attivi circa 30 database ed uso esclusivamente php.

  5. Gianni ha detto:

    Dimenticavo…

    il MaxKeepAliveRequests è impostato su 500

    Va bene anche questo valore?

  6. valent ha detto:

    Sicuramente stai usando un sistema operativo a 64 bit, vero? 🙂
    Il keepAlive e il KeepAliveTimeout come sono?

    (se hai un linux o bsd che dovresti avere dato che usi chkrootkit) Posta l’output di “top” e “free -m”

    Comunque ti avverto che tipicamente è MySQL che è mal impostato e Apache si comporta meglio con cattive configurazioni, quindi dai anche uno sguardo al DB.

  7. Turismo ha detto:

    Complimenti per il blog in generale e soprattutto per questo articolo molto tecnico e allo stesso tempo esaustivo. Essendo un pò datato e sapendo che le cose cambiano molto velocemente cosa ne diresti di dare una spolveratina (sempre se ce ne fosse bisogno)all’articolo?

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *