Ricerca nel sito web

5 suggerimenti per migliorare le prestazioni del tuo server Web Apache


Secondo un recente rapporto di Netcraft (una nota società Internet che fornisce, tra gli altri servizi, statistiche sull'utilizzo dei browser web), Apache continua ad essere il server web più utilizzato tra i siti e i computer connessi a Internet.

Inoltre, Apache continua a registrare la crescita maggiore tra i principali server web, seguito da Nginx e IIS. Pertanto, se sei un amministratore di sistema incaricato di gestire le installazioni di Apache, devi sapere come assicurarti che il tuo server web funzioni al meglio delle sue capacità in base alle tue esigenze (o a quelle del tuo cliente).

In questo articolo discuteremo alcuni suggerimenti che ti aiuteranno a garantire che Apache funzioni senza intoppi e sia in grado di gestire il numero di richieste che ti aspetti dai client remoti.

Tuttavia, tieni presente che Apache non è stato progettato con l'obiettivo di stabilire record di benchmark, ma, nonostante ciò, è comunque in grado di fornire prestazioni elevate in quasi tutti i casi di utilizzo a cui puoi pensare.

CONSIGLIO N.1: mantieni sempre Apache aggiornato alla versione più recente

Inutile dire che avere installata l'ultima versione di Apache è probabilmente una delle prime cose da considerare. Al 19 novembre 2015, l'ultima versione di Apache disponibile nei repository CentOS 7 è 2.4.6, mentre in Debian è 2.4.10.

Tuttavia, potrebbe esserci un recente miglioramento o una correzione di bug che è stata aggiunta a una versione stabile appena rilasciata, che viene quindi resa disponibile per il download e l'installazione dal sorgente. Qui vengono fornite anche le istruzioni per la compilazione e l'installazione: ricorda solo che se scegli questo metodo di aggiornamento, potresti voler eseguire il backup dei file di configurazione/siti/host virtuali attuali come precauzione.

In ogni caso, puoi verificare la versione attualmente installata come segue:

httpd -v               [On RedHat/CentOS based systems]
apache2 –v             [On Debian/Ubuntu based systems] 

Come regola generale, attenersi al metodo di aggiornamento fornito dal gestore pacchetti della distribuzione prescelta (yum update httpd o aptitude safe-upgrade apache2, per CentOS o Debian, rispettivamente) a meno che non ci sia altro modo. È possibile leggere le ultime note sulla versione nella sezione Documentazione Apache nel sito Web del progetto Apache HTTP Server.

SUGGERIMENTO n.2: Se stai utilizzando un kernel precedente alla 2.4, considera l'aggiornamento adesso

Perché? Le versioni del kernel 2.4 e successive hanno la chiamata di sistema del kernel sendfile abilitata per impostazione predefinita. Ciò, a sua volta, facilita i trasferimenti di file di rete ad alte prestazioni (che sono desiderati nel contesto delle comunicazioni web server-client) e consente ad Apache di fornire contenuto statico più velocemente e con un minore utilizzo della CPU eseguendo operazioni di lettura e invio simultanee.

Puoi visualizzare il kernel attualmente installato con:

uname -r

e confrontarlo con l'ultimo kernel stabile in www.kernel.org (4.3 al momento della stesura di questo articolo).

Sebbene sia un processo non destinato ai principianti, l'aggiornamento del kernel è un esercizio interessante per conoscere meglio gli interni di Linux.

CONSIGLIO N.3: Scegli il modulo multi-elaborazione (MPM) più adatto al tuo caso

In pratica, gli MPM estendono la funzionalità modulare di Apache consentendo di decidere come configurare il server web per collegarsi alle porte di rete sulla macchina, accettare richieste dai client e utilizzare processi figli (e thread, in alternativa) per gestire tali richieste.

A partire dalla versione 2.4, Apache offre tre diversi MPM tra cui scegliere, a seconda delle proprie esigenze:

  1. L'MPM prefork utilizza più processi secondari senza threading. Ogni processo gestisce una connessione alla volta senza creare thread separati per ciascuno. Senza entrare troppo nei dettagli, possiamo dire che vorrai utilizzare questo MPM solo durante il debug di un'applicazione che utilizza, o se la tua applicazione deve gestire, moduli non thread-safe come mod_php.
  2. L'MPM worker utilizza diversi thread per processi secondari, dove ogni thread gestisce una connessione alla volta. Questa è una buona scelta per i server ad alto traffico poiché consente di gestire più connessioni simultanee con meno RAM rispetto al caso precedente.
  3. Infine, l'event MPM è l'MPM predefinito nella maggior parte delle installazioni di Apache per le versioni 2.4 e successive. È simile al MPM lavoratore in quanto crea anche più thread per processo figlio ma con un vantaggio: provoca connessioni KeepAlive o idle (mentre rimangono in quello stato) essere gestito da un singolo thread, liberando così memoria che può essere allocata ad altri thread. Questo MPM non è adatto per l'uso con moduli non thread-safe come mod_php, per i quali deve essere invece utilizzato un sostituto come PHP-FPM.

Per verificare l'MPM utilizzato dalla tua installazione Apache, puoi fare:

httpd -V

L'immagine seguente mostra che questo particolare server web utilizza MPM prefork.

Per cambiarlo, dovrai modificare:

/etc/httpd/conf.modules.d/00-mpm.conf          [On RedHat/CentOS based systems]
/etc/apache2/mods-available/<mpm>.load   [On Debian/Ubuntu based systems]

Dove può essere mpm_event, mpm_worker o mpm_prefork.

e decommentare la riga che carica il modulo desiderato in questo modo:

LoadModule mpm_event_module modules/mod_mpm_event.so

Nota: per far funzionare l'evento MPM in Debian, potrebbe essere necessario installare il pacchetto libapache2-mod-fastcgi dal pacchetto non libero repository.

Inoltre, per CentOS avrai bisogno di php-fpm (insieme a fcgi e mod_fcgid) mentre in Debian si chiama php5-fpm< (insieme ad apache2-mpm-event).

Ultimo ma non meno importante, riavvia il server web e il servizio php-fpm (o php5-fpm) appena installato:

Su RedHat/CentOS

systemctl restart httpd php-fpm && systemctl enable httpd php-fpm

Su Debian/Ubuntu

systemctl restart apache2 php5-fpm && systemctl enable apache2 php5-fpm

Sebbene sia possibile impostare Apache per utilizzare un MPM specifico, tale configurazione può essere sovrascritta in base all'host virtuale nello stesso modo indicato in precedenza.

Basta inserire i tag corrispondenti nel file di configurazione per ciascun host virtuale e sei pronto per partire, ma assicurati di utilizzare uno e un solo MPM per vhost.

Infine, tieni presente che, indipendentemente dalla distribuzione scelta, php-fpm si basa sull'implementazione di FastCGI, motivo per cui in precedenza ho consigliato l'installazione di pacchetti aggiuntivi.

Per maggiori dettagli ed esempi su php-fpm e su come può, insieme all'evento MPM, aumentare le prestazioni di Apache, fare riferimento alla documentazione ufficiale.

Questo è ciò che vedo dopo aver modificato l'MPM predefinito da prefork a event nella stessa casella mostrata nell'immagine precedente:

In CentOS 7, dovrai assicurarti che i servizi http e https siano abilitati attraverso il firewall e che le interfacce di rete ) vengono aggiunti correttamente alla zona predefinita.

Per esempio:

firewall-cmd --zone=internal --add-interface=tun6to4 
firewall-cmd --zone=internal --add-interface=tun6to4 --permanent 
firewall-cmd --set-default-zone=internal 
firewall-cmd --add-service=http 
firewall-cmd --add-service=https 
firewall-cmd --add-service=http --permanent 
firewall-cmd --add-service=https --permanent 
firewall-cmd --reload

Il motivo per cui ne parlo è perché di recente ho riscontrato un problema in cui le impostazioni di configurazione predefinite del firewall in un VPS cloud impedivano a php-fpm e Apache di elaborare file php.

Come test di base (sono sicuro che potresti pensare a test più complicati o stressanti), creerò un file php che verifica l'esistenza di un altro file chiamato test.php nella stessa directory di due CentOS 7 server con le stesse caratteristiche hardware e carico ma con MPM diversi. Uno di loro utilizzerà event e l'altro utilizzerà prefork:

Questo è il codice php che ho salvato in un file chiamato checkiffileexists.php:

<?php
$filename = 'test.php';

if (file_exists($filename)) {
    echo "The file $filename exists";
} else {
    echo "The file $filename does not exist";
}
?>

Quindi eseguiremo lo strumento Apache benchmark (ab) con 200 richieste simultanee fino al completamento di 2000 richieste:

ab -k -c 100 -n 2000 localhost/checkiffileexists.php

Eseguiamo il test e confrontiamo i risultati. Presta attenzione alle statistiche sulle prestazioni:

Come puoi vedere, le prestazioni del server con evento sono molto superiori alla sua controparte prefork in ogni aspetto di questo test.

SUGGERIMENTO n. 4: allocare saggiamente la RAM per Apache

Forse l'elemento hardware più critico da prendere in considerazione è la quantità di RAM allocata per ciascun processo Apache. Anche se non puoi controllarlo direttamente, puoi limitare il numero di processi secondari tramite la direttiva MaxRequestWorkers (precedentemente nota come MaxClients in Apache 2.2), che porrà limiti all'utilizzo della RAM da parte di Apache. Anche in questo caso, è possibile impostare questo valore in base all'host o all'host virtuale.

Per fare ciò, dovresti prendere nota della quantità media di RAM utilizzata da Apache, quindi moltiplicarla per il numero di MaxRequestWorkers, e cioè la quantità di memoria che verrà allocata per i processi Apache. Una cosa che non vorresti mai che il tuo server web facesse è iniziare a utilizzare lo scambio, poiché ciò ridurrà significativamente le sue prestazioni. Pertanto, dovresti sempre mantenere l'utilizzo della RAM da parte di Apache entro i limiti che puoi permetterti e non fare mai affidamento sullo scambio per questo.

Ad esempio, il blocco seguente limiterà il numero di client simultanei a 30. Se più client raggiungono l'host, potrebbero riscontrare un ritardo o un errore momentaneo che può essere facilmente risolto aggiornando il browser. Sebbene ciò possa essere considerato indesiderabile, è più salutare per il server e, a lungo termine, migliore anche per il tuo sito.

Puoi inserire questo blocco all'interno di /etc/httpd/conf/httpd.conf o /etc/apache2/apache2.conf, a seconda che tu stia utilizzando CentOS o Debian.

Tieni presente che lo stesso principio si applica a tutti gli MPM: sto utilizzando event qui per continuare con il concetto delineato nel suggerimento precedente:

<IfModule mpm_event_module>
    StartServers 3
    MinSpareThreads          25
    MaxSpareThreads          75
    ThreadLimit                      64
    ThreadsPerChild          25
    MaxRequestWorkers    30
    MaxConnectionsPerChild    1000
</IfModule>

In ogni caso, si consiglia vivamente di fare riferimento alla documentazione di Apache 2.4 per vedere quali direttive sono consentite per l'MPM scelto.

CONSIGLIO N.5: Conosci le tue applicazioni

Come regola generale, non dovresti caricare moduli Apache che non siano strettamente necessari per il funzionamento della tua applicazione. Ciò richiederà almeno una conoscenza generale delle applicazioni in esecuzione sul tuo server, specialmente se sei un amministratore di sistema e c'è un altro team responsabile dello sviluppo.

Puoi elencare i moduli attualmente caricati con:

httpd -M          [On RedHat/CentOS based systems]
apache2ctl -M     [On Debian/Ubuntu based systems]

Per scaricare/disabilitare i moduli in CentOS, dovrai commentare la riga che inizia con LoadModule (nel file di configurazione principale o in uno ausiliario all'interno di /etc/httpd/conf.modules.d.

D'altra parte, Debian fornisce uno strumento chiamato a2dismod per disabilitare i moduli e viene utilizzato come segue:

a2dismod module_name

Per riattivarlo:

a2enmod module_name

In entrambi i casi, ricordati di riavviare Apache affinché le modifiche abbiano effetto.

Riassunto

In questo articolo abbiamo esaminato 5 suggerimenti che ti aiuteranno a ottimizzare il server web Apache e ad aumentarne le prestazioni. Inoltre, dovresti ricordare che l'ottimizzazione e le prestazioni senza sicurezza sono inutili, quindi potresti fare riferimento anche all'articolo mod_pagespeed per migliorare le prestazioni del server web e ai suggerimenti per il rafforzamento di Apache in linux-console.net.

Poiché non possiamo coprire adeguatamente tutti gli aspetti di questo argomento in questo articolo, forse ti verranno in mente altre idee che vorresti condividere con il resto della comunità. Se è così, non esitate a farcelo sapere utilizzando il modulo di commento qui sotto.