Ottimizzare Apache per l'uso con WordPress

5 apr 2011, 03:34:32
Visualizzazioni: 6.19K
Voti: 10

Salve,

Ho un sito WordPress con oltre 150.000 visualizzazioni di pagina al giorno.

È ospitato su un processore Intel Core i5 760 @ 2.80GHz, con CentOS e 4 GB di RAM.

Il problema è che WordPress consuma troppa RAM e dopo un po' il server si sovraccarica e la RAM si esaurisce. Ho provato molte ottimizzazioni per Apache ma nulla sembra funzionare. Dopo aver riavviato Apache il sito funziona senza problemi, ma dopo un'ora o due si sovraccarica di nuovo.

Qualcuno di voi ha qualche consiglio che possa aiutarmi?

PS: Sto usando WP-Super Cache.

AGGIORNAMENTO: Informazioni aggiuntive

Ecco la lista dei miei plugin:

  • Akismet
  • Contact Form 7
  • Domain Mirror
  • Faster Image Insert
  • IntenseDebate
  • Role Manager
  • SexyBookmarks
  • Smart Youtube
  • Star Rating for Reviews
  • Thumbnail For Excerpts
  • WP-Polls
  • WP-SWFObject
  • WP Super Cache

Per quanto riguarda le ottimizzazioni, ho provato alcuni consigli da qui

Le mie impostazioni sono:

<IfModule prefork.c>
  StartServers       8
  MinSpareServers    5
  MaxSpareServers   20
  ServerLimit      256
  MaxClients       200
  MaxRequestsPerChild  1000
</IfModule>

<IfModule worker.c>
  StartServers       2
  MaxClients         150
  MinSpareThreads     25
  MaxSpareThreads    75
  ThreadsPerChild     25
  MaxRequestsPerChild  1000
</IfModule>

Timeout 120
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 2

Ecco anche il mio my.cnf

[mysqld]
set-variable=local-infile=0
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Utilizzare per default il vecchio formato delle password per compatibilità con i client mysql 3.x
# (quelli che usano il pacchetto di compatibilità mysqlclient10)
old_passwords=1

# Si raccomanda di disabilitare i link simbolici per prevenire vari rischi di sicurezza;
# per farlo, rimuovi il commento da questa riga:
# symbolic-links=0

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

AGGIORNAMENTO

Ecco il mio attuale utilizzo della memoria

ps -ylC httpd --sort:rss

S   UID   PID  PPID  C PRI  NI   RSS    SZ WCHAN  TTY          TIME CMD
S   504  8446  8444  0  78   0  7884 59507 554050 ?        00:00:00 httpd
[... codice ridotto per brevità ...]
S   504 22354  8444  0  75   0 62124 93962 -      ?        00:00:00 httpd

Questo cambia ciò che mi consigliereste?

4
Commenti

È sempre utile menzionare quali altri plugin stai utilizzando, come mappe del sito XML, strumenti SEO, scansione malware, post correlati, ecc., poiché possono sovraccaricare il tuo server.

Wyck Wyck
5 apr 2011 03:38:15

+1 a quanto detto da @Wyck. Quasi tutti i problemi di prestazioni e memoria che vedo sono il risultato di qualche plugin che non funziona correttamente.

MikeSchinkel MikeSchinkel
5 apr 2011 03:47:33

Puoi anche elencare le modifiche di Apache che hai provato e il contenuto dei tuoi file my.cnf e httpd.conf? Un problema comune con Apache è impostare il numero massimo di richieste e richieste per child troppo alto, così che non terminano mai e consumano solo RAM.

Chris_O Chris_O
5 apr 2011 03:53:33

Come ha detto @Anu qui sotto, probabilmente hai impostato i client massimi e le richieste massime per figlio troppo alti. Prova a ridurre Max Clients a 125 e MaxRequestPerChild a circa 500. Inoltre, modifica MaxKeepAlive requests a circa 50 e riduci il Timeout a 15 o 20.

Chris_O Chris_O
6 apr 2011 08:29:59
Tutte le risposte alla domanda 4
3

Souljacker,

Per prima cosa darei un'occhiata ai tuoi plugin. Star Ratings for Reviews non viene aggiornato da oltre 3 anni e sembra essere molto pesante sul database. Ho notato alcune query SQL grezze con INNER JOIN che sembrano problematiche.

Sul lato server dovresti implementare una cache degli oggetti. APC è lo standard de facto e ti darà i migliori risultati.

Una volta installato APC, passa a W3 Total Cache oppure APC Object Cache Backend di Mark Jaquith per sfruttarlo al massimo.

Le impostazioni del tuo httpd.conf sembrano a posto. A giudicare dal tuo my.cnf, non stai sfruttando la cache delle query di MySQL, la cache dei thread né controlli alcuna delle dimensioni dei buffer.

Puoi usare uno script di ottimizzazione per aiutarti con la configurazione del my.cnf. Personalmente uso mysqltuner e anche tuning primer è molto buono.

Mysqltuner fornirà suggerimenti e linee guida su cosa modificare in base all'utilizzo del tuo database.

Sul mio server con 12GB di RAM le impostazioni sono queste. (Solo un esempio, non usare queste impostazioni!!!)

key_buffer              = 512M
max_allowed_packet      = 32M
thread_stack            = 1M
thread_cache_size       = 128M

myisam-recover         = BACKUP
max_connections        = 60
table_cache            = 5000
table_definition_cache = 1024
thread_concurrency     = 16

# * Configurazione Cache Query

query_cache_type        = 1
query_cache_limit       = 4M
query_cache_size        = 48M
max_heap_table_size     = 512M
tmp_table_size          = 512M
join_buffer_size        = 3M
sort_buffer_size        = 8M
read_buffer_size        = 8M
read_rnd_buffer_size    = 8M
myisam_sort_buffer_size =16M


log_slow_queries        = /var/log/mysql/mysql-slow.log
long_query_time = 1

Come altri hanno menzionato, usare Nginx ridurrà drasticamente il carico sul tuo server se sei pronto ad affrontare le configurazioni ecc. Ho scritto un tutorial su come installare e configurare Apache con Nginx come reverse proxy

Spero sia utile.

5 apr 2011 12:13:09
Commenti

wp-supercache ora supporta anche l'utilizzo di APC come cache di oggetti - tuttavia per entrambi w3 total cache e wp-supercache ho osservato alcuni comportamenti strani con la cache di oggetti, specialmente nel contesto degli utenti loggati. Non sono sicuro se sia qualcosa relativo al mio sito, ma fate attenzione e testate accuratamente!

anu anu
5 apr 2011 12:15:24

inoltre, sebbene mysqltuner (e anche l'installazione di mtop) siano utili, ho scoperto che il maggior incremento di prestazioni si ottiene attivando il logging delle query lente, e poi utilizzando EXPLAIN per capire perché certe query erano lente.

anu anu
5 apr 2011 12:17:28

Punti molto validi. Mi sono dimenticato di menzionare i log delle query lente. Tuning primer vi dirà di attivarli se non li state utilizzando.

Chris_O Chris_O
5 apr 2011 12:21:03
7

Dai un'occhiata qui: Consigli sulle prestazioni per una vasta base di utenti - è un insieme utile di aspetti da considerare che vanno oltre il solo Apache.

Quando si cerca di ottimizzare le prestazioni, è piuttosto importante esaminare l'intera infrastruttura per identificare eventuali problemi - ad esempio, in uno dei miei siti ho scoperto che un problema che inizialmente sembrava legato ad Apache (Apache che esauriva la memoria sotto carico medio) era in realtà causato da una query SQL lenta, risolta aggiungendo un indice aggiuntivo alla tabella dei commenti.

Inoltre, installa APC o un altro sistema di cache per l'op-code PHP.

[Aggiornamento]

È molto probabile che l'impostazione MaxClients sia troppo alta - se tutti i 200 processi sono attivi e se utilizzano in media circa 20MB ciascuno, i tuoi 4GB saranno esauriti, senza considerare MySQL e tutti gli altri processi. Riduci l'impostazione MaxClients e continua a investigare per individuare il problema reale.

Puoi verificare quanta memoria utilizza ogni processo Apache con questo comando:

ps -ylC httpd --sort:rss

(sostituisci httpd con apache2 se sei su Ubuntu)

5 apr 2011 10:27:34
Commenti

vota per xcache invece di APC, ma rigorosamente versione 1.3.x+

petermolnar petermolnar
5 apr 2011 10:44:40

APC è la scelta migliore. Supera xcache in tutti i miei test e alla fine sarà incluso con PHP.

Chris_O Chris_O
5 apr 2011 11:47:15

esatto, dai benchmark che ho visto, la differenza tra APC e altri acceleratori di op-code è piuttosto minima, quindi la facilità di installazione e il fatto che APC sta per diventare parte della distribuzione PHP (con PHP6) contano di più per me, ma la cosa importante è installarne uno!

anu anu
5 apr 2011 11:57:06

Guardando Plesk vedo SOLO Apache che utilizza troppa memoria. Tutto il resto del sistema utilizza una quantità di memoria piuttosto bassa.

Souljacker Souljacker
5 apr 2011 17:18:10

@souljacker nessuno sta suggerendo che MySQL stesso stia utilizzando troppa memoria (è abbastanza probabile che tu debba effettivamente aumentare la memoria disponibile per esso). Ma, se leggi quello che ho scritto, query SQL lente possono essere una causa di problemi OOM di Apache, poiché i processi Apache si mettono in coda in attesa che MySQL risponda, e così vengono avviati più processi. Questo non significa che sia il tuo problema - dovrai fare alcune indagini per capire dove si trova il problema.

anu anu
5 apr 2011 18:08:08

Ho installato APC. È tutto? Devo solo installare o devo configurare qualcosa? Non sembra sia cambiato nulla

Souljacker Souljacker
5 apr 2011 20:10:37

Puoi accedere a apc_display.php? Hai letto la documentazione di APC? Inoltre, non si tratta solo di installare APC - hai letto la mia risposta e le altre risposte? Probabilmente non riceverai una singola risposta che risolva i tuoi problemi - dovrai investigare a fondo.

anu anu
6 apr 2011 08:04:49
Mostra i restanti 2 commenti
5

Confronta Nginx e Apache e fai una scelta:

Ho appena passato da Apache a Nginx e ci vogliono circa 10 minuti di lavoro:

  1. scarica/installa Nginx (wget / yum install / apt-get / ...)
  2. modifica il file di configurazione di nginx per puntare alla tua directory web (vedi esempi http://kbeezie.com/view/nginx-configuration-examples/ )
  3. avvia nginx

fatto.

Ho anche passato a php-fpm nello stesso momento, circa 20 minuti di lavoro:

  1. scarica php
  2. configura con le librerie necessarie (es. suhosin) (o modifica il codice c con i tuoi messaggi scherzosi) (ricorda di rimuovere le estensioni specifiche per apache e di includere zlib per installare/scompattare i plugin wp da dentro wp)
  3. configura/compila php
  4. modifica il file di configurazione di nginx per includere le chiamate php-fpm
  5. avvia php-fpm e riavvia nginx

fatto

(aggiungi i file di avvio /etc/init.d dove necessario)

Non ho eseguito test di prestazioni personalmente, mi limito a seguire ciecamente il "resto del mondo"

Fuori dall'ambito di questa risposta: Sto anche pianificando di abbandonare MySQL e usare MariaDB (GPL) invece.

5 apr 2011 08:43:03
Commenti

Potresti anche ottenere un Apache leggero semplicemente con una configurazione adeguata. Non fraintendermi, Nginx o qualsiasi altro webserver leggero come lighthttpd sono ottimi. Il mio consiglio è di usare Apache per i contenuti dinamici e Nginx/lighthttpd per i contenuti statici.

Roman Roman
5 apr 2011 10:14:59

il massimo sarebbe se WordPress venisse riscritto in servlet C grin Per dinamico/statico: sono stordito dai 1000 blogpost al giorno sulle differenze e voglio solo mantenere 1 webserver, più semplice.

edelwater edelwater
5 apr 2011 10:25:04

Sono d'accordo con te qui. Mantenere un solo webserver è comunque più semplice che due. Ma invece di buttare via Apache e installare un nuovo webserver solo perché è "più veloce" nella configurazione predefinita, non è proprio la risposta.

Roman Roman
5 apr 2011 10:48:26

@Roman Wünsche forse potresti condividere alcuni suggerimenti su come ottenere una configurazione apache leggera che superi nginx in prestazioni?

anu anu
5 apr 2011 12:10:23

@Roman Wünsche È esattamente quello che sto cercando di fare, ma finora non ha funzionato

Souljacker Souljacker
5 apr 2011 20:03:22
2

Lavorare con le configurazioni prefork e Worker può essere complicato, modificare alcuni valori può sicuramente aiutare a migliorare le prestazioni e ridurre l'uso della RAM, ma ricorda che Apache riserva una parte della RAM, ciò non significa che tu stia esaurendo la memoria. Consulta questo articolo per i migliori consigli di ottimizzazione.

15 gen 2014 13:14:29
Commenti

Le risposte costituite solo da link sono considerate di scarsa qualità. Utilizzale solo per dimostrare che le tue affermazioni sono supportate da qualcun altro. Citale nella tua risposta.

kaiser kaiser
15 gen 2014 14:04:35

Link rotto, puoi aggiornarlo per favore?

JorgeM JorgeM
5 apr 2023 14:18:15