Optimize Apache pentru utilizarea cu WordPress
Salutări,
Am un site WordPress cu peste 150.000 de vizualizări pe zi.
Rulează pe un procesor Intel Core i5 760 @ 2.80GHz, cu CentOS și 4 GB de RAM.
Problema este că WordPress consumă prea multă memorie RAM și după un timp serverul se supraîncarcă și memoria se epuizează. Am încercat multe ajustări în Apache dar nimic nu pare să funcționeze. După ce repornesc Apache, site-ul rulează fără probleme, dar după una sau două ore se supraîncarcă din nou.
Aveți vreo sugestie care m-ar putea ajuta?
Apropo, folosesc WP-Super Cache.
ACTUALIZARE: Informații suplimentare
Iată lista mea de plugin-uri:
- 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
În ceea ce privește ajustările, am încercat câteva sfaturi de aici
Setările mele sunt:
<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
De asemenea, iată fișierul meu my.cnf
[mysqld]
set-variable=local-infile=0
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Implicit se folosește formatul vechi de parolă pentru compatibilitate cu clienții mysql 3.x
# (cei care folosesc pachetul de compatibilitate mysqlclient10).
old_passwords=1
# Dezactivarea link-urilor simbolice este recomandată pentru a preveni diverse riscuri de securitate;
# pentru a face acest lucru, decomentați această linie:
# symbolic-links=0
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
ACTUALIZARE
Iată utilizarea curentă a memoriei:
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
[... cod continuă ...]
S 504 22354 8444 0 75 0 62124 93962 - ? 00:00:00 httpd
Aceasta schimbă ceea ce mi-ați recomanda?

Souljacker,
Aș începe prin a analiza pluginurile tale. Star Ratings for Reviews nu a fost actualizat de peste 3 ani și pare să fie foarte solicitant pentru baza de date. Am observat câteva interogări SQL brute cu INNER JOINS care par problematice.
Pe partea de server, ar trebui să implementezi caching la nivel de obiecte. APC este standardul de facto și va oferi cele mai bune rezultate.
Odată ce ai instalat APC, treci la W3 Total Cache sau Mark Jaquith's APC Object Cache Backend pentru a profita la maxim de el.
Setările tale din httpd.conf par în regulă. Însă, din câte se vede în my.cnf, nu exploatezi caching-ul pentru interogări MySQL, caching-ul pentru fire de execuție sau controlul dimensiunilor bufferelor.
Poți folosi un script de optimizare pentru a te ajuta cu configurația my.cnf. Eu prefer să folosesc mysqltuner, iar tuning primer este de asemenea foarte bun.
Mysqltuner va oferi sugestii și câteva indicații despre ce să ajustezi în funcție de utilizarea bazei tale de date.
Pe serverul meu cu 12G RAM, setările arată astfel. (Doar un exemplu, nu folosi aceste setări!!!)
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
# * Configurare Cache pentru Interogări
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
După cum au menționat și alții, rularea Nginx va reduce drastic încărcarea serverului tău, dacă ești dispus să te ocupi de configurații etc. Am scris un tutorial despre cum să instalezi și să configurezi Apache cu Nginx ca reverse proxy.
Sper că acest lucru te ajută.

wp-supercache suportă acum și utilizarea APC ca cache de obiecte - totuși, atât pentru w3 total cache cât și pentru wp-supercache am observat un comportament ciudat în ceea ce privește caching-ul de obiecte, mai ales în contextul utilizatorilor autentificați. Nu sunt sigur dacă este ceva specific site-ului meu, dar fiți atenți la acest aspect și testați în detaliu!

de asemenea, deși mysqltuner (și instalarea mtop) sunt utile, cea mai mare îmbunătățire a performanței am obținut-o prin activarea logării interogărilor lente și apoi folosind EXPLAIN pentru a înțelege de ce anumite interogări erau lente.

Aruncă o privire aici: Sfaturi de performanță pentru o bază mare de utilizatori - este un set util de lucruri de analizat care merg dincolo de doar Apache.
Când încerci să optimizezi performanța, este destul de important să analizezi întreaga infrastructură pentru a vedea unde ai probleme - de exemplu, pentru unul dintre site-urile mele am urmărit în cele din urmă o problemă care inițial părea a fi una legată de Apache (Apache rămânea fără memorie sub o sarcină medie) până când am descoperit un query SQL lent care a fost rezolvat prin adăugarea unui index suplimentar la tabela de comentarii.
De asemenea, instalează APC sau alt cache de op-code pentru PHP.
[Actualizare]
Este foarte probabil ca setarea ta MaxClients să fie prea mare - dacă toate cele 200 de procese sunt active și dacă ele utilizează în medie aproximativ 20MB per proces, asta înseamnă cei 4GB epuizați, fără a lua în calcul MySQL și toate celelalte procese. Reduce setarea MaxClients și continuă să investighezi unde este problema ta reală.
Poți verifica câtă memorie utilizează fiecare proces Apache cu această comandă:
ps -ylC httpd --sort:rss
(înlocuiește httpd cu apache2 dacă folosești Ubuntu)

APC este cea mai bună alegere. Întrece xcache în toate testele mele și, în plus, va fi inclus în PHP.

da, din benchmark-urile pe care le-am văzut, diferența dintre APC și alți acceleratori de op-code este destul de mică, așa că ușurința de instalare și faptul că APC este pe cale să devină parte din distribuția PHP (cu PHP6) contează mai mult pentru mine, dar lucrul important este să instalați unul dintre ele!

Privind în Plesk, văd DOAR Apache care folosește excesiv memoria. Restul sistemului utilizează memorie destul de redusă.

@souljacker nimeni nu sugerează că MySQL în sine folosește prea multă memorie (este foarte probabil că va trebui chiar să crești memoria disponibilă pentru acesta). Dar, dacă ai citit ce am scris, interogările SQL lente pot fi o cauză a problemelor OOM ale Apache, deoarece procesele Apache se adună în așteptare pentru răspunsul MySQL, astfel încât sunt lansate mai multe procese. Asta nu înseamnă că aceasta este problema ta - va trebui să faci o investigație pentru a afla unde este problema.

Am instalat APC. Asta e tot? Doar instalez sau trebuie să configurez ceva? Nimic nu pare să se fi schimbat

Comparați Nginx și Apache și faceți o alegere:
- 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
- și mii de alte postări pe bloguri
Tocmai am trecut de la Apache la Nginx și a durat aproximativ 10 minute:
- descărcați/instalați Nginx (wget / yum install / apt-get / ...)
- modificați fișierul de configurare al nginx pentru a indica către directorul web (vezi exemple http://kbeezie.com/view/nginx-configuration-examples/ )
- porniți nginx
gata.
Am trecut și la php-fpm în același timp, lucru care a durat aproximativ 20 de minute:
- descărcați php
- configurați cu librăriile necesare (de ex. suhosin) (sau modificați codul c cu propriile mesaje personalizate) (nu uitați să eliminați extensiile specifice Apache și să includeți zlib pentru instalarea/despachetarea plugin-urilor wp din interiorul wp)
- configurați/compilați php
- modificați fișierul de configurare nginx pentru a include apelurile php-fpm
- porniți php-fpm și reporniți nginx
gata
(adăugând fișierele de pornire /etc/init.d unde este necesar)
Nu am efectuat teste de performanță personal, doar am urmat orbește "restul lumii"
În afara domeniului acestui răspuns: De asemenea, plănuiesc să renunț la MySQL și să folosesc MariaDB (GPL) în loc.

Ai putea obține un Apache ușor doar prin configurarea corespunzătoare. Nu mă înțelege greșit, Nginx sau orice alt server web ușor ca lighthttpd sunt grozavi. Sfatul meu este să folosești Apache pentru conținut dinamic și Nginx/lighthttpd pentru conținut static.

cel mai bine ar fi dacă WordPress ar fi rescris în servlete C 😊 În privința conținutului dinamic/static: sunt uluit de cele 1000 de postări de blog pe zi despre diferențe și vreau doar să mențin un singur server web, mai ușor.

Sunt de acord cu tine aici. Menținerea unui singur server web este încă mai ușoară decât a două. Dar în loc să arunci Apache și să instalezi un nou server web doar pentru că este "mai rapid" în configurația implicită, nu este chiar soluția.

@Roman Wünsche poate ai putea să împărtășești câteva sfaturi despre cum să obții o configurație ușoară pentru Apache care să depășească performanța nginx?

Lucrul cu configurațiile prefork și Worker poate fi complicat, modificarea unor valori poate contribui cu siguranță la creșterea performanței și reducerea utilizării RAM, de asemenea, rețineți că Apache rezervă o anumită cantitate de memorie RAM, ceea ce nu înseamnă că memoria RAM este pe terminate. Consultați acest articol pentru cele mai bune sfaturi de optimizare.

Răspunsurile care conțin doar link-uri sunt considerate de calitate scăzută. Te rugăm să le folosești doar pentru a demonstra că afirmațiile tale sunt susținute de altcineva. Include-le în răspunsul tău.
