Primer de tot dir-te que el servidor Apache pot funcionar millor en un entorn Linux, degut a que les directives de configuració són majors i permeten acotar més les opcions de rendiment. Si tens la oportunitat de canviar a Linux t'ho recomano, d'altra banda no desesperis, es pot aconseguir una configuració òptima pel servidor web i obtenir un alt rendiment (és clar no com es podria aconseguir amb un Linux ;) ). Tingues en compte que la proposta de configuració que veuràs a continuació no deixa de ser una proposta, és a dir, funciona molt bé en el meu entorn de treball però és possible que hagis d'acabar afinant alguns aspectes per aconseguir un rendiment òptim en el teu.
Banc de proves
És aconsellable que tinguis uns valors de referència quan treballis en tasques d'optimització, per a veure si realment els canvis efectuats tenen un efecte positiu vers al rendiment. Com a banc de proves aconsello utilitzar una aplicació que permeti realitzar una càrrega de peticions considerable al servidor i que retorni uns resultats intel·ligibles, de manera que es puguin comparar amb els resultats de fer la mateixa càrrega de peticions un cop efectuats els canvis que possiblement millorin el rendiment. Ara no entraré en profunditat en descriure com preparar un banc de proves, espero generar una entrada al respecte en breu, però si que t'aconsello un parell d'aplicacions: Curl-Loader i JMeter. La meva preferida, la primera.
Optimització
1. Mòduls innecessaris
Desactiva tots els mòduls que no facis servir, això farà que els processos ocupin menys memòria. Els següents dos mòduls els hauries de tenir desactivats i només activar-los quan necessitis recuperar informació del servidor: mod_info i mod_status. Dins l'arxiu de configuració de l'Apache httpd.conf hi trobaràs la secció Dynamic Shared Object (DSO) Support. Cada mòdul es carrega mitjançant la directiva LoadModule. Per desactivar un mòdul només cal que lo posis els símbol # davant la línia.
2. Cache
Activar algun tipus de cache és imprescindible si es volen aconseguir rendiments òptims. Un sistema col·lapsat pot veure la seva càrrega disminuïda dràsticament activant un proxy-cache, la pròpia cache de l'Apache o un accelerador PHP. Personalment he escollit instal·lar un accelerador PHP, doncs en el meu cas la càrrega de CPU esdevenia al executar-se el procés PHP. De totes les opcions disponibles jo he instal·lat l'eAccelerator i la càrrega ha disminuït notablement.
3. Comprimir contingut retornat
3. Comprimir contingut retornat
Apache té un mòdul que permet comprimir la informació retornada al navegador, sempre i quant aquest ho permeti. Això permet executar la petició més ràpidament, deixar un procés Apache lliure per una altra petició abans de temps i reduir considerablement l'ampli de banda. Per contra, és possible que augmenti la CPU ja que ha de comprimir cada petició i, potser, la RAM. Activant la següent línia a l'arxiu httpd.conf si el navegador li demana a l'Apache el contingut comprimit se li retornarà comprimit:
LoadModule deflate_module modules/mod_deflate.so
A més aquest mòdul s'ha d'activar i ho pots fer mitjançant la següent directiva:
<Directory "...">
# Activa el mòdul
SetOutputFilter DEFLATE
# Indica quin tipus de contingut s'ha de comprimir
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE application/css
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE image/svg+xml
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/atom_xml
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE text/x-javascript
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE application/x-httpd-php
AddOutputFilterByType DEFLATE application/x-httpd-fastphp
AddOutputFilterByType DEFLATE application/x-httpd-eruby
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/htm
# S'evita retornar contingut comprimit com imatges o vídeos
SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip dont-vary
SetEnvIfNoCase Request_URI \.(?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary
SetEnvIfNoCase Request_URI \.pdf$ no-gzip dont-vary
SetEnvIfNoCase Request_URI \.avi$ no-gzip dont-vary
SetEnvIfNoCase Request_URI \.mov$ no-gzip dont-vary
SetEnvIfNoCase Request_URI \.mp3$ no-gzip dont-vary
SetEnvIfNoCase Request_URI \.mp4$ no-gzip dont-vary
SetEnvIfNoCase Request_URI \.rm$ no-gzip dont-vary
SetEnvIfNoCase Request_URI \.flv$ no-gzip dont-vary
</Directory>
5. httpd-mpm.conf: ThreadsPerChild, MaxRequestsPerChild, SendBufferSize
El mòdul MPM (Mòdul de Multi Processament) és el que funciona per defecte en sistemes Windows NT. El funcionament és el següent: s'executa permanentment un procés Apache que controla que s'estigui executant un altre procés Apache el qual crea fils per gestionar les peticions. Així és com funciona l'Apache als Windows NT i pocs valors de configuració hi ha per millorar el rendiment en aquest sistema operatiu (als Linux les directrius de configuració són més extenses i específiques per a millorar el rendiment dels processos Apache i els seus fils). Jo proposo les següents modificacions, que faran que el teu servidor processi més volum de peticions. Has de vigilar que el hardware pugui processar les peticions, jugar amb els valors fins a trobar un rendiment estable:
- ThreadsPerChild: Indica el número de fils que es crearan al iniciar el servidor. Personalment utilitzo un valor de 1900, força alt ja que tenim moltes peticions i el hardware aguanta. Aquest valor també està limitat pel sistema operatiu, depenent del valor que necessitis podria ser que hagis de tocar la configuració del sistema operatiu per a poder indicar un valor realment alt.
- MaxRequestsPerChild: 0. Aquest valor indica cada quantes peticions processades el servidor web s'ha de tancar i tornar a obrir per alliberar recursos. Tinc posat que no acabi mai però en realitat hauria de ser un valor molt aproximat al número de peticions diàries entre el número de processos Apache (1 en el cas de Windows NT), de manera que només es torna a iniciar una sola vegada al dia evitant talls de connexions innecessaris. En el meu cas el servidor Apache no consumeix massa memòria i per això està el valor 0.
- SendBufferSize: Aquest valor augmenta la velocitat de transmissió. Un valor correcte és el suficientment alt com per a que hi càpiga el contingut de resposta d'una pàgina web, així s'evita bloquejar i retornar la informació en diferents vegades. Estranyament per un valor de 1460 a mi em funciona molt bé. Aquest buffer també pot venir limitat pel sistema operatiu.
Espero que aquestes línies t'ajudin a millorar el rendiment del teu entorn de treball web!
Referències
http://httpd.apache.org/docs/2.2/
http://en.wikipedia.org/wiki/List_of_PHP_accelerators
http://sourceforge.net/projects/curl-loader/
http://www.softwareqatest.com/qatweb1.html