Come ottimizzare Apache sul server Ubuntu 14.04


18

Attualmente sul mio Apache 2 (Apache 2.4.7 per l'esattezza) su Ubuntu 14.04, ho questa impostazione:

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

<IfModule mpm_prefork_module>
StartServers                    20
MinSpareServers                 100
MaxSpareServers                 250
MaxRequestWorkers               150
MaxConnectionsPerChild          0
</IfModule>

Il server è un server Amazon da 8 GB (RAM) che non fa altro che caricare un modulo di iscrizione di tre pagine per alcune campagne pubblicitarie di Google.

Ho trovato uno script chiamato apachetuneit.sh sul web, ma dopo un po 'di tempo Apache ha segnalato questo errore:

[Mar 21 aprile 16: 45: 42.227935 2015] [mpm_prefork: errore] [pid 1134] AH00161: il server ha raggiunto l'impostazione MaxRequestWorkers, considera di aumentare l'impostazione MaxRequestWorkers

Come posso giudicare come impostare queste impostazioni?

Sto chiedendo specificamente solo come ottimizzare Apache 2.4 e nient'altro. Questo è il motivo per cui questa domanda è diversa da questa .



@JennyD Questo articolo è troppo vasto per questa esigenza specifica.
ServerChecker

Il modo in cui giudichi queste impostazioni specifiche è che esegui i test di carico.
Jenny D,

@JennyD È ancora più facile di così. Basta usare lo script ap.sh sotto carico normale più volte al giorno e in media, fare i calcoli per il collegamento cloudinservice di seguito e impostare MaxRequestWorkers su quel valore. Quindi, guarda i registri di Apache per i problemi con MaxRequestWorkers e aumenta, aggiungi più RAM, aggiungi CloudFlare o aggiungi un altro nodo web. Non è necessario eseguire test di carico estremamente intensi.
ServerChecker

Potresti scrivere una risposta contenente informazioni su quello script e materiale pertinente dai link che hai incluso nella tua risposta, alla domanda che ho indicato come possibile duplicato.
Jenny D,

Risposte:


45
  1. Riconosci che Ubuntu 14.04 utilizza Apache 2 con PHP in esecuzione attraverso un modulo mpm_prefork , di cui un file modificabile è in /etc/apache2/mods-enabled/mpm_prefork.conf. Inoltre, riconosci che a partire da Apache 2.4, MaxClients è ora rinominato come MaxRequestWorkers e quindi tutta la documentazione relativa a MaxClients deve essere passata a MaxRequestWorkers.

  2. Arrestare temporaneamente il servizio Web Apache con il seguente comando:

    sudo service apache2 stop
  1. Attendi 5 secondi, quindi esegui il comando seguente per scoprire quanta memoria virtuale hai sul server che è libera:
    sudo free -ht

Leggi la riga Mem: e guarda la colonna libera. Considera questa come la quantità di RAM che puoi dedicare ad Apache, anche se di solito mi piace dedurre 2 GB su un server più robusto (come in> 4 GB) o 1 GB su un server più leggero. Quindi, se la colonna gratuita dicesse che avevo 13 GB gratuiti, consiglierei di dare Apache 11 GB. Questa è una base. Se si verificano occasionalmente problemi di database nei registri (come in circa 3 volte nei registri per un periodo di 3 giorni) che necessita di più memoria, potremmo considerare che avevamo solo 10 GB con cui giocare invece di 11 GB (in questo caso ). Se riscontriamo nei registri di Apache che il server ha bisogno di più MaxRequestWorkers, allora questo è un problema separato che affronterò di seguito.

  1. Avviare il server Web Apache.
    sudo service apache2 start
  1. Apri come 10 schede del browser, connettiti ad alcune delle tue pagine più lunghe o a caricamento lento dal tuo sito Web e aggiorna come 3-4 volte su ciascuna scheda.

  2. Dopo averlo fatto, ora esegui rapidamente il seguente comando:

    sudo ps -ylC apache2 | awk '{x + = $ 8; y + = 1} END {print "Utilizzo memoria Apache (MB):" x / 1024; stampa "Dimensione media del processo (MB):" x / ((y-1) * 1024)} '

Eseguilo come 5 volte rapidamente.

Osserva il valore della Dimensione media del processo e calcola la media di quel valore tra le 5 volte che l'hai eseguita.

Ora fai i seguenti calcoli matematici e assicurati di convertire GB in MB, se necessario, in modo che tutti i numeri siano in MB. Quindi, moltiplica per 1024 volte o dividi per 1024, a seconda del modo in cui devi procedere.

MaxRequestWorkers = Baseline Free (con spazio buffer) / Dimensione media del processo

Ad esempio, avevo un server da 14 GB, ma quando Apache è stato arrestato il server ha mostrato che utilizzava 1 GB di RAM in idle. Fornisco quindi altri 1 GB di spazio aggiuntivo nel buffer per il sistema operativo nel caso in cui ne abbia bisogno. Ciò significa che avrei un baseline gratuito di 12 GB. Ora devo convertirlo da GB a MB, quindi moltiplico 12 x 1024 e ottengo 12288. Il 12288 MB è il mio valore di base gratuito. Nel mio caso ho visto che la dimensione media del processo era di 21 MB. Quindi, prendo 12288/21 e ottengo circa 585. Ora, è comune che i sysops arrotondino per difetto questo valore, e quindi ho ottenuto 580.

  1. Modifica il file /etc/apache2/mods-enabled/mpm_prefork.conf e considera di impostarlo sui seguenti valori predefiniti, sostituendo XXX con il tuo calcolo MaxRequestWorkers:


`<IfModule mpm_prefork_module>`
  StartServers                    2
  MinSpareServers                 2
  MaxSpareServers                 5
  MaxRequestWorkers               XXX
  ServerLimit                     XXX
  MaxConnectionsPerChild          0
</IfModule>

Si noti che non è possibile visualizzare il parametro ServerLimit lì. Aggiungilo Per impostazione predefinita, questo parametro è 256 se non presente, ma deve avere lo stesso valore di MaxRequestWorkers o verrà visualizzato un errore.

  1. Un altro fattore critico nella configurazione di Apache è il file /etc/apache2/apache2.conf con la variabile Timeout e viene misurato in secondi. Questo è quanto tempo è possibile inviare o ricevere dal server prima che scada. Devi anche tenere presente un caricamento di file o un download di file, ad esempio se hai un sito Web in cui le persone possono caricare o scaricare CSV o altri file di grandi dimensioni, ad esempio. E devi tenere a mente un server di database occupato e dove potresti dover fornire un po 'di tempo prima del timeout delle pagine. Più piccola è la variabile Timeout, più il web server è disponibile a ricevere nuove connessioni. Si noti, tuttavia, che l'impostazione di questo valore su un valore troppo basso può causare danni con le variabili della sessione PHP, sebbene non con i cookie basati sulla sessione del browser. Quindi, per esempio, un valore di 300 (5 minuti) potrebbe essere buono per un server Web che si basa su variabili di sessione PHP per il flusso di lavoro delle app Web anziché sui cookie di sessione del browser. Un valore di 45 potrebbe essere buono per un server web che non serve altro che pagine di destinazione pubblicitarie statiche, ma sarebbe terribile per un server che deve usare molto le variabili di sessione PHP. Quindi, modifica il parametro Timeout in questo file per l'importo necessario. Questo potrebbe richiedere alcuni test con tutte le tue pagine web per vedere se il valore è troppo basso. È probabilmente una buona idea, tuttavia, non impostarlo su un valore superiore a 300, a meno che non si riscontrino problemi nei caricamenti di file di grandi dimensioni o nei download di file di grandi dimensioni. ma sarebbe terribile per un server che deve usare molto le variabili di sessione PHP. Quindi, modifica il parametro Timeout in questo file per l'importo necessario. Questo potrebbe richiedere alcuni test con tutte le tue pagine web per vedere se il valore è troppo basso. È probabilmente una buona idea, tuttavia, non impostarlo su un valore superiore a 300, a meno che non si riscontrino problemi nei caricamenti di file di grandi dimensioni o nei download di file di grandi dimensioni. ma sarebbe terribile per un server che deve usare molto le variabili di sessione PHP. Quindi, modifica il parametro Timeout in questo file per l'importo necessario. Questo potrebbe richiedere alcuni test con tutte le tue pagine web per vedere se il valore è troppo basso. È probabilmente una buona idea, tuttavia, non impostarlo su un valore superiore a 300, a meno che non si riscontrino problemi nei caricamenti di file di grandi dimensioni o nei download di file di grandi dimensioni.

  2. Ora riavvia il tuo servizio web Apache. Se hai fatto qualcosa di sbagliato, Apache probabilmente te lo dirà nel momento in cui lo avvii di nuovo, e puoi correggerlo.

    sudo service apache2 restart
  1. Ora ripeti il ​​trucco del browser con 10 schede che hai fatto in precedenza e vedi se riscontri errori di configurazione di Apache nel registro degli errori del web server Apache:
    sudo tail -f /var/log/apache2/error.log

... premi CTRL + C per uscirne, se lo desideri.

Cerca un reclamo sulla necessità di MaxRequestWorkers (e recentemente da quando hai riavviato il web server). Se lo vedi anche con un'impostazione ottimale di MaxRequestWorkers, probabilmente avrai bisogno di più potenza di fuoco per i tuoi siti Web o applicazioni web. Considera queste opzioni:

  • Utilizzo di un CDN per download di file di grandi dimensioni, immagini e script.
  • Utilizzando un servizio di memorizzazione nella cache come CloudFlare o altri.
  • Ripetere la strategia del tuo sito Web o dell'applicazione Web per utilizzare più server Web che fungono da "app Web" dietro un bilanciamento del carico.
  • Aggiungendo più RAM al server e ripetendo così questo calcolo.

  1. Ora che il server Apache è ottimizzato, è una sorta di linea di base ottimizzata. Dovrai verificarlo nel corso di 2-3 settimane e cercare i problemi di MaxRequestWorker nei log degli errori di Apache. Da ciò, puoi prendere una decisione sull'ottimizzazione (vedi passaggio 10). Puoi anche installare Munin con apt su Ubuntu e guardare le prestazioni di Apache nel tempo e tracciare un'idea di crescita prima di decidere che devi fare qualcosa sulla quantità di traffico che il web server sta gestendo.

"Sebbene questi collegamenti possano rispondere alla domanda, è meglio includere qui le parti essenziali della risposta e fornire il collegamento come riferimento. Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia. ”
Jenny D

@JennyD Ottimo punto! Lo farò.
ServerChecker

@Moderator Ho bisogno di aiuto per la formattazione di questa risposta. Il passaggio 7 doveva essere un file conf con rientri. Il passaggio 11 non doveva essere rientrato. I comandi di codice che iniziano con sudodevono essere visualizzati come codice, non come testo normale. Ho seguito la documentazione sulla formattazione, ma ancora faccio fatica qui.
ServerChecker

1
Ho fatto quello che potevo - markdown in realtà non fa elenchi e codici misti molto bene, ma penso di essere riuscito comunque a migliorarlo un po '.
Jenny D,

per i principianti di centos come me: ps -lyU apache invece di ps -ylC apache2
user1928596

3

Ciò su cui puoi aumentare MaxRequestWorkers dipende dalla quantità di RAM occupata da ciascuno dei tuoi processi httpd / apache. Se ognuno occupa 50 MB (solo selezionando un numero casuale), ogni 20 richieste di lavoro che hai in uso contemporaneamente (cioè connessioni simultanee) occuperanno 1 GB. Quindi, in questo esempio, potresti avere al massimo 8 GB * 20 = 160 MaxRequestWorkers. Tuttavia, non è possibile utilizzare tutta la RAM per Apache, è necessario riservarne alcune per altre cose in esecuzione lì. Anche lasciare un po 'di RAM di riserva può essere utile per le prestazioni in quanto il sistema operativo lo utilizzerà per memorizzare nella cache le cose e accelerare le prestazioni (anche se potrebbe essere preferibile non rimanere senza connessioni rispetto al server che è molto più veloce in quanto il sito apparirà lento mentre i browser degli utenti attendono la disponibilità di una connessione se si esauriscono tutti).


Qual è un buon modo per profilare questo? Quali comandi posso digitare per vedere quanta RAM utilizza ogni processo apache sotto carico? Abbiamo anche bisogno di spazio RAM per MySQL (un sito WordPress) e anche per i normali processi di sistema.
ServerChecker

Scopri quanti processi sono in esecuzione ed esegui il freecomando per ottenere una memoria di base. Quindi aumentare il numero di processi in esecuzione aumentando MinSpareServers, riavviando apache, eseguendo di freenuovo e facendo i calcoli. Dai un'occhiata a moreofless.co.uk/apache-memory-usage per maggiori dettagli e spiegazioni.
g491,

Ora ho imparato che esiste un modo super veloce per farlo. È delineato nel link cloudinservice.com nella mia risposta di seguito. Il comando è ap.sh che qualcuno ha capito. Inoltre, ho appreso che MaxClients è stato ora rinominato come MaxRequestWorkers in Apache 2.4+.
ServerChecker
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.