Ottimizzare Apache per l'uso con WordPress
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?

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.

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!

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.

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)

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

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!

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

@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.

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

Confronta Nginx e Apache e fai una scelta:
- http://www.webandblog.com/reviews/apache-vs-nginx-testing-performance-under-heavy-load/
- http://www.joeandmotorboat.com/2008/02/28/apache-vs-nginx-web-server-performance-deathmatch/
- http://blog.webfaction.com/a-little-holiday-present
- e milioni di altri post sui blog
Ho appena passato da Apache a Nginx e ci vogliono circa 10 minuti di lavoro:
- scarica/installa Nginx (wget / yum install / apt-get / ...)
- modifica il file di configurazione di nginx per puntare alla tua directory web (vedi esempi http://kbeezie.com/view/nginx-configuration-examples/ )
- avvia nginx
fatto.
Ho anche passato a php-fpm nello stesso momento, circa 20 minuti di lavoro:
- scarica php
- 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)
- configura/compila php
- modifica il file di configurazione di nginx per includere le chiamate php-fpm
- 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.

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.

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.

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 Wünsche forse potresti condividere alcuni suggerimenti su come ottenere una configurazione apache leggera che superi nginx in prestazioni?

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.
