APACHE HTTP SERVER: GUIA COMPLETA
Document tècnic per a CFGS ASIR/DAW
Índex de Continguts
- Història i Orígens d'Apache
- Arquitectura i Models de Processament
- Sistema Modular d'Apache
- Configuració i Estructura de Fitxers
- Virtual Hosts i Hosting Múltiple
- Mòduls Essencials i la Seva Funcionalitat
- Seguretat en Apache
- Optimització i Rendiment
- Casos Pràctics
- Referències
1. Història i Orígens d'Apache
1.1 Els Inicis: NCSA HTTPd i la Necessitat de Canvi
La història d'Apache HTTP Server comença al febrer de 1995, però les seves arrels es remunten a un projecte anterior: el servidor web NCSA HTTPd[^1]. Aquest servidor havia estat desenvolupat per Rob McCool al National Center for Supercomputing Applications (NCSA) de la Universitat d'Illinois, i a principis de 1995 era el servidor web més popular d'Internet[^2].
No obstant això, quan McCool va deixar el NCSA, el desenvolupament d'NCSA HTTPd es va estancar. El servidor tenia errors coneguts, limitacions funcionals i mancava de manteniment actiu. En aquell moment primerenc de la World Wide Web, molts administradors de sistemes havien creat els seus propis pedaços (patches) per corregir bugs i afegir funcionalitats que necessitaven[^3]. Aquests pedaços circulaven de forma desorganitzada entre webmasters, creant una situació caòtica on cada servidor web podia ser una versió lleugerament diferent del programari base.
1.2 El Naixement del Grup Apache (Febrer 1995)
El febrer de 1995, vuit desenvolupadors que havien estat contribuint amb pedaços al codi d'NCSA HTTPd van decidir coordinar els seus esforços. Aquest grup original, conegut com "The Apache Group", estava format per Brian Behlendorf, Roy Fielding (que més tard seria l'arquitecte de REST i editor de les especificacions HTTP/1.1), Rob Hartill, David Robinson, Cliff Skolnick, Randy Terbush, Robert S. Thau i Andrew Wilson[^4].
La seva motivació era clara: necessitaven un servidor web robust, fiable i amb manteniment actiu que pogués créixer amb les necessitats de la web emergent. En lloc de continuar amb parches dispersos, van començar a col·laborar sistemàticament mitjançant llistes de correu electrònic, compartint codi i coordinant desenvolupament[^5].
L'abril de 1995, el grup va publicar la primera versió pública d'Apache 0.6.2, basada en NCSA HTTPd 1.3 però incorporant tots els pedaços coneguts i nombroses millores[^6]. Aquest llançament inicial ja mostrava la filosofia que definiria Apache: software col·laboratiu, de codi obert, desenvolupat per una comunitat d'usuaris i desenvolupadors que treballaven junts per crear la millor solució possible.
1.3 L'Origen del Nom "Apache"
L'origen del nom "Apache" és un dels aspectes més debatuts i llegendaris de la història del projecte. Hi ha dues versions principals de la història, i ambdues tenen elements de veritat[^7].
La versió del joc de paraules: La documentació oficial del projecte de 1995 indicava que "Apache és un nom simpàtic que va quallar" i que "també fa un joc de paraules simpàtic amb 'a patchy web server' - un servidor fet d'una sèrie de pedaços"[^8]. Aquesta explicació fa referència al fet que el servidor es va construir aplicant molts pedaços (patches) al codi base d'NCSA HTTPd.
La versió del reconeixement cultural: No obstant això, en una entrevista del 2000, Brian Behlendorf, co-fundador del projecte i qui va proposar el nom, va explicar una motivació diferent i més profunda. Behlendorf va relatar que el nom va sorgir del seu respecte per les nacions ameríndies col·lectivament referides com Apache, "ben conegudes per les seves habilitats superiors en estratègia de guerra i la seva resistència inesgotable"[^9]. En el context de mitjans dels noranta, semblava que Internet lliure i obert - basat en l'intercanvi lliure de codi obert - estava a punt de ser conquerit pel programari propietari de Microsoft. Behlendorf va veure el seu esforç com una mena de resistència, similar a la del cap Gerónimo i els darrers pobles Apache lliures[^10].
Segons la Apache Software Foundation, el nom es va triar "per respecte a les diverses nacions ameríndies col·lectivament referides com Apache"[^11]. Behlendorf va admetre posteriorment que quan algú li va comentar el joc de paraules amb "patchy", ell va respondre "Oh, d'acord" - el joc de paraules no havia estat la intenció original, però va esdevenir una part de la llegenda del projecte[^12].
El 2023, l'organització sense ànim de lucre Natives in Tech va acusar la Apache Software Foundation d'apropiació cultural i va instar-los a canviar el nom de la fundació[^13]. Aquest debat continua obert dins de la comunitat.
1.4 Creixement Explosiu i Dominància del Mercat (1995-2005)
L'èxit d'Apache va ser fulgurant. El desembre de 1995, només vuit mesos després del llançament inicial, Apache ja tenia el 8.5% de quota de mercat dels servidors web. L'abril de 1996 - només un any després del seu llançament - Apache es va convertir en el servidor web més utilitzat del món, superant NCSA HTTPd[^14]. Aquest èxit es va deure a diversos factors clau:
1. Codi Obert i Gratuït: A diferència dels servidors comercials de l'època, Apache era completament gratuït i el seu codi font estava disponible per a qualsevol que volgués examinar-lo, modificar-lo o aprendre d'ell[^15].
2. Estabilitat i Robustesa: El model de desenvolupament col·laboratiu significava que els bugs es detectaven i corregien ràpidament. La revisió per parells (peer review) del codi resultava en un producte molt més estable que moltes alternatives comercials[^16].
3. Arquitectura Modular: Des de les primeres versions, Apache va adoptar una arquitectura modular que permetia als administradors personalitzar el servidor per a les seves necessitats específiques sense haver de recompilar tot el programari[^17].
4. Multiplataforma: Tot i que inicialment es va desenvolupar per a Unix, Apache es va fer ràpidament disponible per a múltiples plataformes, incloent Linux, BSD, Solaris, i posteriorment Windows[^18].
5. Compliment d'Estàndards: Apache va ser un dels primers servidors a implementar completament les especificacions HTTP/1.1, i els desenvolupadors d'Apache van participar activament en la definició d'aquests estàndards[^19].
6. Comunitat Activa: La comunitat al voltant d'Apache no només desenvolupava el codi, sinó que també proporcionava documentació extensiva, suport en fòrums i llistes de correu, i contribuïa amb mòduls addicionals[^20].
El creixement va ser impressionant: el 1997, Apache ja servia més del 50% dels llocs web del món. El 2005, Apache va assolir el seu punt àlgid amb aproximadament el 70% de quota de mercat global[^21]. El 2009, Apache es va convertir en el primer servidor web que allotjava més de 100 milions de llocs web simultàniament[^22].
1.5 Formació de la Apache Software Foundation (1999)
A mesura que el projecte Apache creixia, es va fer evident que necessitava una estructura organitzativa més formal. El març de 1999, els membres del Grup Apache van fundar l'Apache Software Foundation (ASF), incorporant-la com a organització sense ànim de lucre 501(c)(3) als Estats Units[^23].
La primera reunió oficial de l'Apache Software Foundation es va celebrar el 13 d'abril de 1999. Els membres fundadors van ser els vuit membres originals del Grup Apache més altres contribuïdors destacats que s'havien unit al projecte[^24]:
- Brian Behlendorf (cofundador, va proposar el nom "Apache")
- Roy T. Fielding (arquitecte principal, editor d'HTTP/1.1 RFC)
- Ken Coar
- Mark Cox
- Lars Eilebrecht
- Ralf S. Engelschall
- Dean Gaudet
- Ben Hyde
- Jim Jagielski
- Alexei Kosut
- Martin Kraemer
- Ben Laurie
- Doug MacEachern
- Aram Mirzadeh
- Sameer Parekh
- Cliff Skolnick
- Marc Slemko
- William (Bill) Stoddard
- Paul Sutton
- Randy Terbush
- Dirk-Willem van Gulik
La creació de l'ASF va assegurar que el projecte Apache HTTP Server i tots els projectes subsegüents continuarien existint més enllà de la participació de voluntaris individuals[^25]. L'ASF va adoptar un model de governança conegut com "The Apache Way" (La Manera Apache), basat en:
Meritocracia: Les decisions es prenen en funció de les contribucions i l'expertesa demostrada, no de l'afiliació corporativa o el títol acadèmic[^26].
Consens comunitari: Les decisions importants requereixen discussió i consens dins de la comunitat[^27].
Transparència: Totes les discussions de desenvolupament es fan públicament en llistes de correu[^28].
Independència de proveïdors: El projecte no està controlat per cap empresa individual, encara que moltes empreses contribueixen[^29].
Aquest model ha estat tan exitós que s'ha convertit en un estàndard àmpliament emulat per altres fundacions de codi obert[^30].
1.6 Evolució Tècnica: De 1.x a 2.x (2002)
Apache 1.x va dominar el panorama dels servidors web durant la dècada dels noranta i principis dels 2000. No obstant això, a mesura que els llocs web es feien més complexos i els requisits de rendiment augmentaven, es va fer evident que eren necessaris canvis arquitectònics profunds.
El 2002, després de diversos anys de desenvolupament, es va llançar Apache 2.0[^31]. Aquesta va ser una reescriptura important que va introduir canvis fonamentals:
1. API Multithread-Safe: La nova API estava dissenyada per suportar múltiples fils d'execució, cosa essencial per a millor rendiment en sistemes moderns[^32].
2. Nous Multi-Processing Modules (MPMs): Apache 2.0 va introduir el concepte de MPMs, permetent als administradors triar com el servidor gestionava la concurrència de connexions. Els MPMs originals eren: - prefork: Model tradicional de processos múltiples (compatible amb mòduls no thread-safe com mod_php) - worker: Model híbrid multi-procés/multi-thread - perchild: Gestió avançada de processos fill (experimental)[^33]
3. Suport IPv6: Apache 2.0 va ser un dels primers servidors web majors a suportar completament el protocol IPv6[^34].
4. Millor Suport per a Plataformes No-Unix: Les versions 2.x van millorar significativament el suport per a Windows i altres plataformes[^35].
5. Filtres: Es va introduir un sistema de filtres que permetia el processament en cadena del contingut[^36].
6. Configuració Simplificada: Moltes directives de configuració es van simplificar i racionalitzar[^37].
1.7 Apache 2.4 i l'Era Moderna (2012-Present)
Apache 2.4, llançat el febrer de 2012, va portar millores significatives de rendiment i funcionalitat[^38]:
1. Event MPM: L'MPM event, que havia estat experimental a 2.2, es va declarar stable i va esdevenir el MPM per defecte en moltes distribucions. Aquest MPM millora significativament el rendiment en escenaris d'alta concurrència[^39].
2. Memòria Asíncrona I/O: Suport millorat per a operacions asíncrones, permetent millor escalabilitat[^40].
3. Suport HTTP/2: Les versions posteriors de 2.4 van afegir suport complet per a HTTP/2 mitjançant el mòdul mod_http2[^41].
4. Millor Rendiment: Optimitzacions generals que van resultar en un rendiment significativament millorat en comparació amb 2.2[^42].
5. Configuració per Runtime: Possibilitat de modificar certa configuració sense reiniciar el servidor[^43].
1.8 Situació Actual i Competència
Tot i la seva posició dominant durant dècades, Apache ha vist com la seva quota de mercat ha disminuït gradualment des del seu màxim el 2005. Segons estadístiques de Netcraft, el desembre de 2018 Apache tenia una quota de mercat del 18.94% (313 milions de llocs web), comparada amb el 25.74% (446 milions) només un any abans[^44].
Aquesta disminució es deu principalment a la competència de servidors més nous i especialitzats:
Nginx: Llançat el 2004, Nginx va ser dissenyat des de zero per a alt rendiment i baixa utilització de memòria, especialment sota càrrega elevada. Nginx utilitza una arquitectura asíncrona basada en esdeveniments que la fa extremadament eficient per servir contingut estàtic i com a proxy invers[^45].
Microsoft IIS: El servidor natiu de Windows ha mantingut una quota significativa, especialment en entorns corporatius Windows[^46].
LiteSpeed: Servidor comercial que ofereix compatibilitat amb configuracions Apache però amb millor rendiment[^47].
Tot i aquesta competència, Apache continua sent àmpliament utilitzat i respectat per diverses raons:
- Maduresa i Estabilitat: Dècades de desenvolupament i proves en producció
- Flexibilitat: L'arquitectura modular permet una personalització extrema
- Suport de Llenguatges: Excellent integració amb PHP, Python, Perl i altres llenguatges
- Documentació: Possiblement la documentació més completa de qualsevol servidor web
- Compatibilitat: Funciona en pràcticament qualsevol sistema operatiu
- Comunitat: Una de les comunitats de codi obert més grans i actives del món
A més, moltes de les empreses més grans del món continuen utilitzant Apache. Google, per exemple, utilitza una versió modificada d'Apache anomenada Google Web Server (GWS) per a part de la seva infraestructura[^48]. Molts projectes de Wikimedia també s'executen sobre servidors Apache[^49].
2. Arquitectura i Models de Processament
2.1 Arquitectura General d'Apache
Apache HTTP Server segueix una arquitectura modular de tres capes que el fa extraordinàriament flexible i potent[^50]:
1. Core (Nucli): El nucli d'Apache conté només la funcionalitat essencial per gestionar el cicle de vida del servidor, la configuració bàsica, i l'estructura de mòduls. És deliberadament minimalista per mantenir l'eficiència[^51].
2. MPM (Multi-Processing Module): Un únic MPM s'encarrega de gestionar com el servidor accepta connexions i les assigna a processos o fils per processar-les. Només un MPM pot estar actiu alhora[^52].
3. Mòduls Funcionals: Tots els altres aspectes del servidor - des del processament HTTP fins a la compressió, des de l'autenticació fins a la reescriptura d'URLs - són gestionats per mòduls que es poden carregar o descarregar segons sigui necessari[^53].
Aquest disseny permet als administradors crear servidors altament personalitzats, carregant només els mòduls necessaris i configurant l'MPM més adequat per a les seves necessitats específiques.
2.2 Multi-Processing Modules (MPMs): Filosofies de Gestió
Els Multi-Processing Modules són possiblement l'aspecte més important de l'arquitectura d'Apache, ja que determinen fonamentalment com el servidor gestiona la càrrega de treball i la concurrència. La tria de l'MPM adequat pot significar la diferència entre un servidor eficient i un que col·lapsa sota càrrega[^54].
2.2.1 MPM Prefork: El Model Clàssic
L'MPM Prefork implementa un model de servidor web no-threaded (sense fils) i pre-forking (amb pre-generació de processos)[^55]. Aquest és el model tradicional, similar a Apache 1.3, i durant molts anys va ser l'MPM per defecte.
Funcionament Detallat:
El servidor Prefork manté un procés pare principal (parent process) que és responsable de gestionar un conjunt (pool) de processos fill (child processes)[^56]. El cicle de vida funciona així:
- A l'arrencada, el procés pare crea un nombre mínim de processos fill (definit per
StartServers) - Cada procés fill conté un únic fil d'execució i pot gestionar una única connexió HTTP alhora
- El procés pare monitoritza constantment la càrrega i ajusta el nombre de processos fill:
- Si hi ha massa processos inactius, en mata alguns
- Si no hi ha prou processos inactius disponibles, en crea de nous (fins a
MaxSpareServers) - Mai es creen més processos que
MaxRequestWorkers(anteriormentMaxClients) - Quan arriba una petició, s'assigna a un procés fill disponible
- Cada procés fill gestiona un màxim de peticions (definit per
MaxConnectionsPerChild, anteriormentMaxRequestsPerChild) abans de finalitzar i ser substituït per un procés nou[^57]
Avantatges de Prefork:
- Aïllament complet: Com cada petició s'executa en un procés separat amb el seu propi espai de memòria, un error en una petició no pot afectar altres peticions. Si un procés fill col·lapsa, només afecta aquella petició específica[^58]
- Compatibilitat amb codi no thread-safe: Moltes biblioteques i mòduls PHP (especialment mod_php) no són thread-safe. Prefork és l'única opció segura en aquests casos[^59]
- Depuració més senzilla: L'aïllament de processos facilita el debugging
- Estabilitat demostrada: És el model més madur i provat d'Apache
Desavantatges de Prefork:
- Alt consum de memòria: Cada procés fill és independent i té el seu propi espai de memòria. Un servidor amb 100 connexions simultànies necessita 100 processos completament separats, cadascun consumint memòria[^60]
- Escalabilitat limitada: El consum de memòria limita el nombre de connexions simultànies que el servidor pot gestionar
- Overhead de creació de processos: Crear nous processos és més costós que crear nous fils
Configuració Típica de Prefork:
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxRequestWorkers 150
MaxConnectionsPerChild 3000
</IfModule>
StartServers: Nombre de processos fill creats a l'arrencadaMinSpareServers: Mínim de processos inactius sempre disponiblesMaxSpareServers: Màxim de processos inactius permesosMaxRequestWorkers: Màxim absolut de connexions simultàniesMaxConnectionsPerChild: Peticions màximes per procés abans de reciclar-lo (0 = infinit)[^61]
2.2.2 MPM Worker: El Model Híbrid
L'MPM Worker va ser introduït amb Apache 2.0 per abordar les limitacions de memòria de Prefork implementant un model híbrid multi-procés/multi-thread[^62].
Funcionament Detallat:
Worker utilitza múltiples processos fill, però cada procés fill conté múltiples fils (threads). Aquesta arquitectura de dues capes proporciona un equilibri entre aïllament i eficiència[^63]:
- A l'arrencada, es creen diversos processos fill (definits per
StartServers) - Cada procés fill crea un nombre fix de fils (definit per
ThreadsPerChild) - Cada fil pot gestionar una connexió HTTP simultàniament
- Un únic procés amb 25 fils pot gestionar 25 connexions simultànies
- El nombre total de connexions simultànies és:
Processos × ThreadsPerChild
Exemple Pràctic:
Si configurem:
Això significa: - A l'arrencada: 3 processos × 25 fils = 75 connexions simultànies possibles - Màxim absolut: 150 connexions simultànies (6 processos × 25 fils)[^64]
Avantatges de Worker:
- Eficiència de memòria: Els fils dins del mateix procés comparteixen l'espai de memòria, reduint dràsticament el consum global. Mentre Prefork podria necessitar 500MB per 100 connexions, Worker podria gestionar-ho amb 150MB[^65]
- Major escalabilitat: Pot gestionar moltes més connexions simultànies amb els mateixos recursos
- Menor overhead: Crear i destruir fils és molt més ràpid i menys costós que crear processos
- Bon rendiment general: Excel·lent per a la majoria de càrregues de treball modernes
Desavantatges de Worker:
- Requisits de thread-safety: Tots els mòduls i biblioteques utilitzats han de ser thread-safe. Això exclou mod_php tradicional i algunes biblioteques antigues[^66]
- Complexitat de debugging: Els problemes relacionats amb la concurrència de fils poden ser difícils de diagnosticar
- Keep-Alive problemàtic: Un fil queda "bloquejat" esperant durant tot el perióde de keep-alive (que pot ser llarg), encara que la connexió estigui inactiva. Això pot esgotar els fils disponibles[^67]
Configuració Típica de Worker:
<IfModule mpm_worker_module>
StartServers 3
MinSpareThreads 75
MaxSpareThreads 250
ThreadsPerChild 25
MaxRequestWorkers 400
MaxConnectionsPerChild 10000
</IfModule>
MinSpareThreads/MaxSpareThreads: Fils totals inactius a mantenirThreadsPerChild: Fils per procés (fix)MaxRequestWorkers: Connexions simultànies màximes totalsMaxConnectionsPerChild: Connexions per procés abans de reciclar-lo[^68]
2.2.3 MPM Event: L'Optimització Moderna
L'MPM Event va ser introduït com a experimental en Apache 2.2 i es va declarar stable en Apache 2.4[^69]. És actualment l'MPM per defecte en la majoria de sistemes Unix moderns i representa l'estat de l'art en gestió de connexions.
El Problema del Keep-Alive:
Per entendre Event, primer cal entendre el problema que resol. HTTP/1.1 va introduir connexions persistents (keep-alive): després de servir una petició, la connexió TCP es manté oberta durant un perióde (típicament 5-15 segons), esperant que el client enviï noves peticions[^70]. Això estalvia el costly three-way handshake de TCP per a cada petició.
No obstant això, amb Worker, un fil queda assignat a la connexió durant tot aquest temps d'espera, fins i tot quan la connexió està completament inactiva. En un servidor amb 1000 connexions keep-alive actives però inactives, Worker necessitaria 1000 fils esperant, cosa que limita severament l'escalabilitat[^71].
La Solució d'Event:
Event soluciona això mitjançant una arquitectura sofisticada amb fils especialitzats[^72]:
-
Listener Thread: Cada procés fill té un fil "listener" dedicat que utilitza APIs modernes del kernel (epoll en Linux, kqueue en BSD) per monitoritzar totes les connexions keep-alive de manera asíncrona[^73]
-
Worker Threads: Fils que fan el treball real de processar peticions HTTP
Cicle de Vida d'una Connexió en Event:
1. Nova connexió → Listener Thread accepta → Assigna a Worker Thread
2. Worker Thread processa petició → Envia resposta
3. Si keep-alive activat:
- Connexió passa de nou al Listener Thread
- Worker Thread queda LLIURE per servir altres peticions
4. Quan arriba nova petició en la mateixa connexió:
- Listener Thread detecta activitat
- Reassigna connexió a un Worker Thread disponible
5. Si keep-alive timeout expira sense activitat:
- Listener Thread tanca la connexió
Avantatges Clau d'Event:
- Escalabilitat màssiva: Pot gestionar desenes de milers de connexions simultànies perquè les connexions inactives no consumeixen fils valuosos[^74]
- Eficiència de recursos: Similar a Worker en consum de memòria, però molt millor utilització de fils
- Rendiment superior: En escenaris reals (amb keep-alive habitual), Event pot ser 2-3 vegades més eficient que Worker[^75]
- Gestió intel·ligent de recursos: Utilitza APIs modernes del kernel per gestió eficient d'esdeveniments
Millores en Apache 2.4.24+:
A partir de la versió 2.4.24, Event va rebre millores significatives en la gestió de graceful restarts i l'ús del scoreboard (la taula que monitoritza l'estat de tots els processos i fils)[^76]:
- Permet ús de tots els slots del scoreboard fins a
ServerLimit - Gestió més intel·ligent de processos en finalització graceful
- Millor resposta a canvis dinàmics de càrrega
Limitacions d'Event:
- Filtres incompatibles: Alguns filtres de connexió o d'output que necessiten llegir/modificar tota la resposta poden forçar Event a comportar-se com Worker per a aquestes connexions[^77]
- Proxy: Quan s'utilitza com a proxy, l'improved connection handling pot no funcionar completament, ja que el worker no pot determinar on acaba la resposta[^78]
Configuració Típica d'Event:
<IfModule mpm_event_module>
StartServers 3
MinSpareThreads 75
MaxSpareThreads 250
ThreadsPerChild 25
MaxRequestWorkers 400
MaxConnectionsPerChild 10000
# Event-specific settings
AsyncRequestWorkerFactor 2
</IfModule>
AsyncRequestWorkerFactor és específic d'Event: multiplica el nombre de connexions que un bloc de processos/fils pot gestionar. Per defecte 2, significa que el servidor pot acceptar MaxRequestWorkers × AsyncRequestWorkerFactor connexions totals (moltes en estat keep-alive)[^79].
2.3 Comparativa i Recomanacions d'Ús dels MPMs
| Aspecte | Prefork | Worker | Event |
|---|---|---|---|
| Model | Multi-procés | Híbrid (processos + fils) | Híbrid + async I/O |
| Connexions simultànies | ★★☆☆☆ | ★★★★☆ | ★★★★★ |
| Memòria necessària | ★☆☆☆☆ | ★★★★☆ | ★★★★☆ |
| Thread-safety requerit | ✗ No | ✓ Sí | ✓ Sí |
| Keep-alive eficient | ★☆☆☆☆ | ★★☆☆☆ | ★★★★★ |
| Estabilitat | ★★★★★ | ★★★★☆ | ★★★★☆ |
| Millor per a... | mod_php, biblioteques legacy | APIs, alta concurrència | Hosting modern, HTTP/2 |
Recomanacions Pràctiques[^80]:
Usa Prefork si: - Utilitzes mod_php (PHP com a mòdul Apache DSO) - Tens mòduls o biblioteques que no són thread-safe - Prioritzes estabilitat absoluta sobre rendiment - Tens recursos de memòria abundants i connexions moderades
Usa Worker si: - No tens restriccions de thread-safety - Apache actua com a proxy/reverse proxy - Necessites millor eficiència de memòria que Prefork - La teva càrrega no té moltes connexions keep-alive
Usa Event si (recomanat per defecte): - Servidor modern amb sistemes operatius actuals - Tot el teu codi i mòduls són thread-safe - Utilitzes PHP-FPM (en lloc de mod_php) - Necessites gestionar moltes connexions simultànies - Fas servir HTTP/2
3. Sistema Modular d'Apache
3.1 Filosofia del Sistema Modular
Una de les decisions de disseny més brillants d'Apache és la seva arquitectura completament modular[^81]. El core d'Apache només proporciona:
- Gestió del cicle de vida del servidor
- Parsing de configuració
- Framework de mòduls
- Gestió bàsica de connexions
Pràcticament tota la funcionalitat real - des del processament de peticions HTTP fins a la compressió, des de l'autenticació fins a la generació de directoris - està implementada en mòduls independents[^82].
Avantatges d'Aquesta Arquitectura:
- Personalització: Els administradors carreguen només els mòduls necessaris
- Eficiència: Menys mòduls carregats = menys memòria utilitzada
- Seguretat: Deshabilitar mòduls innecessaris redueix la superfície d'atac
- Extensibilitat: Qualsevol desenvolupador pot crear mòduls nous
- Mantenibilitat: Cada mòdul es pot desenvolupar i provar independentment[^83]
3.2 Tipus de Mòduls
Els mòduls d'Apache es poden classificar en diverses categories segons la seva funcionalitat[^84]:
3.2.1 Mòduls de Processament HTTP (Core HTTP)
mod_http: Proporciona el processament bàsic del protocol HTTP. Aquest és pràcticament l'únic mòdul absolutament essencial[^85].
mod_mime: Determina el tipus MIME dels fitxers basant-se en l'extensió del fitxer o contingut[^86].
# Exemple de configuració mod_mime
AddType application/json .json
AddType application/pdf .pdf
AddEncoding gzip .gz
mod_dir: Gestiona peticions de directoris i serveix fitxers d'índex[^87].
mod_autoindex: Genera llistats automàtics de directoris quan no hi ha fitxer d'índex[^88].
<Directory /var/www/downloads>
Options +Indexes
IndexOptions FancyIndexing HTMLTable VersionSort
</Directory>
3.2.2 Mòduls d'Autenticació i Autorització
mod_auth_basic: Implementa autenticació HTTP Basic[^89].
<Directory /var/www/privat>
AuthType Basic
AuthName "Àrea Restringida"
AuthUserFile /etc/apache2/.htpasswd
Require valid-user
</Directory>
mod_auth_digest: Autenticació Digest, més segura que Basic[^90].
mod_authz_core: Proporciona la infraestructura d'autorització central[^91].
mod_authz_host: Autorització basada en host (IP, DNS)[^92].
3.2.3 Mòduls de Reescriptura i Redireccions
mod_rewrite: El mòdul més potent i complex d'Apache per reescriure URLs dinàmicament utilitzant expressions regulars[^93].
RewriteEngine On
# Forçar HTTPS
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
# URLs amigables
RewriteRule ^producte/([0-9]+)/([a-z-]+)$ producte.php?id=$1&slug=$2 [L,QSA]
# Redirigir www a no-www
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]
mod_alias: Proporciona directives simples per a redireccions i àlies[^94].
3.2.4 Mòduls de Proxy i Balanceig
mod_proxy: Funcionalitat de proxy/gateway bàsica[^95].
mod_proxy_http: Suport proxy per a HTTP/HTTPS[^96].
mod_proxy_fcgi: Proxy per a FastCGI (essencial per PHP-FPM)[^97].
mod_proxy_balancer: Balanceig de càrrega entre múltiples backend servers[^98].
<Proxy balancer://mycluster>
BalancerMember http://server1:8080 route=s1
BalancerMember http://server2:8080 route=s2
BalancerMember http://server3:8080 route=s3
ProxySet lbmethod=byrequests
ProxySet stickysession=JSESSIONID
</Proxy>
ProxyPass / balancer://mycluster/
ProxyPassReverse / balancer://mycluster/
3.2.5 Mòduls de SSL/TLS
mod_ssl: Implementa suport SSL/TLS utilitzant OpenSSL[^99].
<VirtualHost *:443>
SSLEngine on
SSLCertificateFile /etc/ssl/certs/cert.pem
SSLCertificateKeyFile /etc/ssl/private/key.pem
SSLCertificateChainFile /etc/ssl/certs/chain.pem
# Només protocols segurs
SSLProtocol -all +TLSv1.2 +TLSv1.3
# Cipher suites moderns
SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256
SSLHonorCipherOrder off
# OCSP Stapling
SSLUseStapling on
</VirtualHost>
3.2.6 Mòduls de Compressió i Optimització
mod_deflate: Compressió de contingut amb gzip/deflate[^100].
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/plain text/xml
AddOutputFilterByType DEFLATE text/css text/javascript
AddOutputFilterByType DEFLATE application/javascript application/json
AddOutputFilterByType DEFLATE application/xml application/rss+xml
</IfModule>
mod_expires: Control de cache del navegador amb headers Expires[^101].
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/jpg "access plus 1 year"
ExpiresByType image/jpeg "access plus 1 year"
ExpiresByType image/png "access plus 1 year"
ExpiresByType text/css "access plus 1 month"
ExpiresByType application/javascript "access plus 1 month"
ExpiresByType application/pdf "access plus 1 month"
</IfModule>
mod_headers: Modificació de headers HTTP de petició i resposta[^102].
# Headers de seguretat
Header always set X-Frame-Options "SAMEORIGIN"
Header always set X-Content-Type-Options "nosniff"
Header always set X-XSS-Protection "1; mode=block"
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
# Content Security Policy
Header always set Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline'"
# Eliminar header Server
Header unset Server
3.2.7 Mòduls de Logging i Monitoratge
mod_log_config: Registre personalitzable de peticions[^103].
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %D" detailed
CustomLog /var/log/apache2/access.log detailed
# Log només errors 4xx i 5xx
SetEnvIf Request_Status ^[45] error_log
CustomLog /var/log/apache2/errors.log common env=error_log
mod_status: Pàgina d'estat del servidor per monitoratge[^104].
<Location /server-status>
SetHandler server-status
Require ip 127.0.0.1 192.168.1.0/24
</Location>
ExtendedStatus On
mod_info: Informació detallada de configuració del servidor[^105].
3.2.8 Mòduls de Llenguatges de Programació
mod_php: Integra PHP directament a Apache (DSO)[^106].
⚠️ Nota Important: mod_php NO és thread-safe i només funciona amb MPM Prefork. L'aproximació moderna és utilitzar PHP-FPM amb mod_proxy_fcgi.
PHP-FPM Configuration (recomanada):
<FilesMatch \.php$>
SetHandler "proxy:unix:/run/php/php8.2-fpm.sock|fcgi://localhost/"
</FilesMatch>
3.3 Gestió de Mòduls
En Debian/Ubuntu
# Llistar mòduls disponibles
ls /etc/apache2/mods-available/
# Llistar mòduls habilitats
ls /etc/apache2/mods-enabled/
# Habilitar mòdul
sudo a2enmod nom_modul
sudo systemctl reload apache2
# Deshabilitar mòdul
sudo a2dismod nom_modul
sudo systemctl reload apache2
# Exemples comuns
sudo a2enmod rewrite # URL rewriting
sudo a2enmod ssl # HTTPS
sudo a2enmod headers # Modificar headers
sudo a2enmod proxy proxy_http # Proxy invers
sudo a2enmod deflate # Compressió
sudo a2enmod expires # Control cache
En CentOS/RHEL
# Mòduls es gestionen editant
sudo vi /etc/httpd/conf.modules.d/00-base.conf
# Carregar mòdul
LoadModule rewrite_module modules/mod_rewrite.so
# Comentar per deshabilitar
#LoadModule rewrite_module modules/mod_rewrite.so
sudo systemctl reload httpd
4. Configuració i Estructura de Fitxers
4.1 Estructura de Directoris Apache
Debian/Ubuntu
/etc/apache2/
├── apache2.conf # Configuració principal
├── ports.conf # Ports d'escolta
├── envvars # Variables d'entorn
├── mods-available/ # Mòduls disponibles
├── mods-enabled/ # Mòduls actius (symlinks)
├── conf-available/ # Configuracions disponibles
├── conf-enabled/ # Configuracions actives (symlinks)
├── sites-available/ # Virtual hosts disponibles
└── sites-enabled/ # Virtual hosts actius (symlinks)
/var/www/ # Directori arrel per defecte
/var/log/apache2/ # Logs
CentOS/RHEL
/etc/httpd/
├── conf/
│ └── httpd.conf # Configuració principal
├── conf.d/ # Configuracions addicionals
├── conf.modules.d/ # Configuracions de mòduls
└── logs/ # Symlink a /var/log/httpd
/var/www/ # Directori arrel per defecte
/var/log/httpd/ # Logs
4.2 Fitxer de Configuració Principal
apache2.conf / httpd.conf
Aquest fitxer conté la configuració global del servidor[^107]:
# Directori arrel del servidor
ServerRoot "/etc/apache2"
# Port d'escolta
Listen 80
# Usuari/Grup d'execució
User www-data
Group www-data
# Administrador del servidor
ServerAdmin webmaster@exemple.cat
# Nom del servidor
ServerName www.exemple.cat:80
# Directori de documents per defecte
DocumentRoot "/var/www/html"
# Configuració del directori arrel
<Directory />
Options FollowSymLinks
AllowOverride None
Require all denied
</Directory>
<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
# Directiva DirectoryIndex
DirectoryIndex index.html index.php
# Timeout
Timeout 60
# KeepAlive
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5
# Logs
ErrorLog ${APACHE_LOG_DIR}/error.log
LogLevel warn
4.3 Directives de Configuració Principals
Directive Options
Controla quines funcions estan disponibles en un directori[^108]:
<Directory /var/www/html>
# Múltiples opcions separades per espai
Options Indexes FollowSymLinks MultiViews
</Directory>
Opcions disponibles:
- All: Totes les opcions excepte MultiViews
- None: Cap opció
- Indexes: Genera llistat de directori si no hi ha DirectoryIndex
- FollowSymLinks: Permet seguir enllaços simbòlics
- SymLinksIfOwnerMatch: Segueix symlinks només si són del mateix propietari
- ExecCGI: Permet executar scripts CGI
- MultiViews: Negociació de contingut
- Includes: Permet Server-Side Includes (SSI)
Es pot utilitzar + o - per afegir/treure opcions:
Directive AllowOverride
Determina quines directives poden ser sobreescrites per fitxers .htaccess[^109]:
Valors:
- All: Permet sobreescriure totes les directives
- None: No permet .htaccess (millor rendiment)
- AuthConfig: Directives d'autenticació
- FileInfo: Directives de tipus de document
- Indexes: Directives de directori
- Limit: Directives d'autorització
- Options: Directive Options
Millor Pràctica: Usa AllowOverride None i defineix tot a la configuració principal per millor rendiment. Només usa AllowOverride si realment necessites flexibilitat a nivell de directori.
Directives de Control d'Accés
Apache 2.4 va canviar la sintaxi de control d'accés[^110]:
Sintaxi Antiga (Apache 2.2):
Sintaxi Nova (Apache 2.4+):
# Permetre a tothom
Require all granted
# Denegar a tothom
Require all denied
# Permetre IPs específiques
Require ip 192.168.1.0/24 10.0.0.5
# Permetre hosts específics
Require host .exemple.cat
# Permetre usuaris autenticats
Require valid-user
# Permetre usuaris específics
Require user joan maria
# Permetre grups específics
Require group administradors
# Combinacions lògiques
<RequireAll>
Require all granted
Require not ip 192.168.1.100
</RequireAll>
<RequireAny>
Require ip 192.168.1.0/24
Require group administradors
</RequireAny>
5. Virtual Hosts i Hosting Múltiple
5.1 Concepte de Virtual Hosts
Els Virtual Hosts permeten a un únic servidor Apache servir múltiples llocs web, cadascun amb el seu propi nom de domini i configuració[^111]. Això és fonamental per:
- Hosting compartit
- Desenvolupament multi-site
- Separació de projectes
- Optimització de recursos
Hi ha dos tipus de Virtual Hosts:
Name-based: Múltiples hosts comparteixen la mateixa adreça IP. Apache diferencia entre ells pel header Host: HTTP[^112].
IP-based: Cada host té una adreça IP diferent (poc comú avui dia)[^113].
5.2 Configuració de Virtual Hosts
Virtual Host Bàsic
<VirtualHost *:80>
ServerName www.exemple.cat
ServerAlias exemple.cat
ServerAdmin admin@exemple.cat
DocumentRoot /var/www/exemple
<Directory /var/www/exemple>
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/exemple-error.log
CustomLog ${APACHE_LOG_DIR}/exemple-access.log combined
</VirtualHost>
Virtual Host amb SSL
<VirtualHost *:443>
ServerName www.exemple.cat
ServerAlias exemple.cat
DocumentRoot /var/www/exemple
# Configuració SSL
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/exemple.cat/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/exemple.cat/privkey.pem
# Protocols i Ciphers moderns
SSLProtocol -all +TLSv1.2 +TLSv1.3
SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384
SSLHonorCipherOrder off
# HSTS
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
<Directory /var/www/exemple>
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/exemple-ssl-error.log
CustomLog ${APACHE_LOG_DIR}/exemple-ssl-access.log combined
</VirtualHost>
Virtual Host amb PHP-FPM
<VirtualHost *:80>
ServerName app.exemple.cat
DocumentRoot /var/www/app
<Directory /var/www/app>
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
</Directory>
# PHP-FPM via socket Unix
<FilesMatch \.php$>
SetHandler "proxy:unix:/run/php/php8.2-fpm.sock|fcgi://localhost/"
</FilesMatch>
# O via TCP
# <FilesMatch \.php$>
# SetHandler "proxy:fcgi://127.0.0.1:9000"
# </FilesMatch>
ErrorLog ${APACHE_LOG_DIR}/app-error.log
CustomLog ${APACHE_LOG_DIR}/app-access.log combined
</VirtualHost>
Virtual Host com a Proxy Invers
<VirtualHost *:80>
ServerName api.exemple.cat
# Proxy a aplicació Node.js
ProxyPreserveHost On
ProxyPass / http://localhost:3000/
ProxyPassReverse / http://localhost:3000/
# Suport WebSocket
RewriteEngine On
RewriteCond %{HTTP:Upgrade} websocket [NC]
RewriteCond %{HTTP:Connection} upgrade [NC]
RewriteRule ^/?(.*) "ws://localhost:3000/$1" [P,L]
# Headers de proxy
RequestHeader set X-Forwarded-Proto "http"
RequestHeader set X-Forwarded-Port "80"
ErrorLog ${APACHE_LOG_DIR}/api-error.log
CustomLog ${APACHE_LOG_DIR}/api-access.log combined
</VirtualHost>
5.3 Gestió de Virtual Hosts
Debian/Ubuntu
# Crear fitxer de configuració
sudo nano /etc/apache2/sites-available/exemple.conf
# Habilitar el site
sudo a2ensite exemple.conf
# Deshabilitar el site
sudo a2dissite exemple.conf
# Verificar configuració
sudo apache2ctl configtest
# Recarregar Apache
sudo systemctl reload apache2
CentOS/RHEL
# Crear fitxer de configuració
sudo vi /etc/httpd/conf.d/exemple.conf
# Verificar configuració
sudo httpd -t
# Reiniciar Apache
sudo systemctl reload httpd
6. Mòduls Essencials i la Seva Funcionalitat
6.1 mod_rewrite: El Mòdul Més Potent
mod_rewrite és un dels mòduls més potents i complexos d'Apache. Permet reescriure URLs dinàmicament utilitzant expressions regulars[^114].
Exemple 1: Redireccions HTTP → HTTPS
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Exemple 2: Eliminar www
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]
Exemple 3: URLs Amigables per SEO
RewriteEngine On
# /producte/123/ordinador-potent → producte.php?id=123&slug=ordinador-potent
RewriteRule ^producte/([0-9]+)/([a-z0-9-]+)$ producte.php?id=$1&slug=$2 [L,QSA]
# /categoria/tecnologia → categoria.php?cat=tecnologia
RewriteRule ^categoria/([a-z0-9-]+)$ categoria.php?cat=$1 [L,QSA]
Exemple 4: Bloquejar Hotlinking d'Imatges
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^https?://(www\.)?exemple\.cat [NC]
RewriteRule \.(jpg|jpeg|png|gif|webp)$ /imatges/hotlink.png [NC,L]
Exemple 5: Mantenir URLs Antics (SEO)
RewriteEngine On
# Redirigir URLs antics a nous
RewriteRule ^antiga-seccio/(.*)$ nova-seccio/$1 [R=301,L]
# Múltiples redireccions
RewriteRule ^/vell$ /nou [R=301,L]
RewriteRule ^/productes-vells/([0-9]+)$ /productes/$1 [R=301,L]
6.2 mod_ssl: Configuració Segura
Configuració SSL/TLS Moderna
<VirtualHost *:443>
ServerName www.exemple.cat
SSLEngine on
# Certificats Let's Encrypt
SSLCertificateFile /etc/letsencrypt/live/exemple.cat/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/exemple.cat/privkey.pem
# Protocols moderns (només TLS 1.2 i 1.3)
SSLProtocol -all +TLSv1.2 +TLSv1.3
# Cipher Suites segurs (Mozilla Intermediate)
SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
# Preferència del servidor
SSLHonorCipherOrder off
# OCSP Stapling (millora rendiment SSL)
SSLUseStapling on
SSLStaplingCache "shmcb:logs/ssl_stapling(32768)"
# Headers de seguretat
Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"
Header always set X-Frame-Options "SAMEORIGIN"
Header always set X-Content-Type-Options "nosniff"
Header always set X-XSS-Protection "1; mode=block"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
# Content Security Policy
Header always set Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; font-src 'self' data:; connect-src 'self'; frame-ancestors 'self'"
</VirtualHost>
6.3 mod_proxy: Proxy Invers i Balanceig
Proxy Invers Simple
<VirtualHost *:80>
ServerName app.exemple.cat
ProxyPreserveHost On
ProxyPass / http://localhost:8080/
ProxyPassReverse / http://localhost:8080/
# Timeout personalitzat
ProxyTimeout 300
# Headers personalitzats
RequestHeader set X-Forwarded-Proto "http"
RequestHeader set X-Real-IP %{REMOTE_ADDR}e
</VirtualHost>
Balanceig de Càrrega
<Proxy balancer://mycluster>
# Definir servidors backend
BalancerMember http://backend1.local:8080 route=node1 retry=60
BalancerMember http://backend2.local:8080 route=node2 retry=60
BalancerMember http://backend3.local:8080 route=node3 retry=60 status=+H
# Mètode de balanceig
ProxySet lbmethod=byrequests
# Session stickiness
ProxySet stickysession=JSESSIONID
# Health check
ProxySet failonstatus=500,503
</Proxy>
<VirtualHost *:80>
ServerName app.exemple.cat
ProxyPass / balancer://mycluster/
ProxyPassReverse / balancer://mycluster/
# Pàgina de gestió del balancer
<Location /balancer-manager>
SetHandler balancer-manager
Require ip 192.168.1.0/24
</Location>
</VirtualHost>
7. Seguretat en Apache
7.1 Hardening Bàsic
Ocultar Informació del Servidor
Limitar Mètodes HTTP
Protegir Fitxers Sensibles
# Denegar accés a fitxers .ht*
<FilesMatch "^\.ht">
Require all denied
</FilesMatch>
# Denegar accés a fitxers de configuració
<FilesMatch "\.(env|ini|log|config)$">
Require all denied
</FilesMatch>
Configurar Timeouts i Límits
Timeout 60
KeepAliveTimeout 5
MaxKeepAliveRequests 100
# Limitar mida de petició
LimitRequestBody 10485760 # 10MB
LimitRequestFields 50
LimitRequestFieldSize 8190
LimitRequestLine 8190
7.2 Protecció contra Atacs Comuns
Protecció contra SQL Injection
# mod_security recomanat, però també:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{QUERY_STRING} (\<|%3C).*script.*(\>|%3E) [NC,OR]
RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [OR]
RewriteCond %{QUERY_STRING} _REQUEST(=|\[|\%[0-9A-Z]{0,2})
RewriteRule ^(.*)$ - [F,L]
</IfModule>
Protecció DDoS Bàsica
# mod_evasive (instal·lar per separat)
<IfModule mod_evasive20.c>
DOSHashTableSize 3097
DOSPageCount 10
DOSSiteCount 100
DOSPageInterval 2
DOSSiteInterval 2
DOSBlockingPeriod 60
</IfModule>
# Rate limiting amb mod_ratelimit
<Location /api/>
SetOutputFilter RATE_LIMIT
SetEnv rate-limit 100
</Location>
7.3 Autenticació i Autorització
Autenticació Bàsica amb .htpasswd
# Crear fitxer .htpasswd
sudo htpasswd -c /etc/apache2/.htpasswd usuari1
# Afegir més usuaris (sense -c)
sudo htpasswd /etc/apache2/.htpasswd usuari2
<Directory /var/www/privat>
AuthType Basic
AuthName "Àrea Restringida - Accés Només Autoritzat"
AuthUserFile /etc/apache2/.htpasswd
Require valid-user
</Directory>
Autenticació per IP + Contrasenya
<Directory /var/www/admin>
AuthType Basic
AuthName "Administració"
AuthUserFile /etc/apache2/.htpasswd
<RequireAll>
Require valid-user
Require ip 192.168.1.0/24
</RequireAll>
</Directory>
8. Optimització i Rendiment
8.1 Configuració MPM per Rendiment
MPM Event Optimitzat (Recomanat)
<IfModule mpm_event_module>
StartServers 3
MinSpareThreads 75
MaxSpareThreads 250
ThreadsPerChild 25
MaxRequestWorkers 400
MaxConnectionsPerChild 10000
AsyncRequestWorkerFactor 2
</IfModule>
Càlcul de Recursos:
Memòria per thread ≈ 1-3 MB
Processos màxims = MaxRequestWorkers / ThreadsPerChild
= 400 / 25 = 16 processos
Memòria màxima ≈ 16 processos × 25 threads × 2MB = 800MB
8.2 Compressió de Contingut
<IfModule mod_deflate.c>
# Habilitar compressió per tipus
AddOutputFilterByType DEFLATE text/html text/plain text/xml
AddOutputFilterByType DEFLATE text/css text/javascript
AddOutputFilterByType DEFLATE application/javascript application/json
AddOutputFilterByType DEFLATE application/xml application/rss+xml
AddOutputFilterByType DEFLATE image/svg+xml
# No comprimir imatges ja comprimides
SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png|zip|gz|rar)$ no-gzip
# Nivell de compressió (1-9, per defecte 6)
DeflateCompressionLevel 6
</IfModule>
8.3 Cache del Navegador
<IfModule mod_expires.c>
ExpiresActive On
# HTML i XML - 1 hora
ExpiresByType text/html "access plus 1 hour"
ExpiresByType application/xhtml+xml "access plus 1 hour"
# CSS i JavaScript - 1 mes
ExpiresByType text/css "access plus 1 month"
ExpiresByType application/javascript "access plus 1 month"
# Imatges - 1 any
ExpiresByType image/jpeg "access plus 1 year"
ExpiresByType image/png "access plus 1 year"
ExpiresByType image/gif "access plus 1 year"
ExpiresByType image/svg+xml "access plus 1 year"
ExpiresByType image/webp "access plus 1 year"
# Fonts - 1 any
ExpiresByType font/woff "access plus 1 year"
ExpiresByType font/woff2 "access plus 1 year"
# Per defecte - 1 setmana
ExpiresDefault "access plus 1 week"
</IfModule>
<IfModule mod_headers.c>
# Cache-Control per tipus
<FilesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|svg|webp)$">
Header set Cache-Control "public, max-age=31536000, immutable"
</FilesMatch>
<FilesMatch "\.(css|js)$">
Header set Cache-Control "public, max-age=2592000"
</FilesMatch>
<FilesMatch "\.(html|htm)$">
Header set Cache-Control "public, max-age=3600"
</FilesMatch>
</IfModule>
8.4 Desactivar .htaccess per Rendiment
# apache2.conf - Millor rendiment
<Directory /var/www>
AllowOverride None
</Directory>
# Moure configuració de .htaccess a VirtualHost
<VirtualHost *:80>
ServerName www.exemple.cat
DocumentRoot /var/www/exemple
# Tota la configuració aquí en lloc de .htaccess
<Directory /var/www/exemple>
Options -Indexes +FollowSymLinks
# Rewrite rules
RewriteEngine On
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
# PHP settings
php_value upload_max_filesize 10M
php_value post_max_size 10M
</Directory>
</VirtualHost>
9. Casos Pràctics
9.1 WordPress amb Apache
<VirtualHost *:80>
ServerName blog.exemple.cat
DocumentRoot /var/www/wordpress
<Directory /var/www/wordpress>
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
</Directory>
# PHP-FPM
<FilesMatch \.php$>
SetHandler "proxy:unix:/run/php/php8.2-fpm.sock|fcgi://localhost/"
</FilesMatch>
# WordPress Permalinks
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
ErrorLog ${APACHE_LOG_DIR}/wordpress-error.log
CustomLog ${APACHE_LOG_DIR}/wordpress-access.log combined
</VirtualHost>
9.2 Laravel amb Apache
<VirtualHost *:80>
ServerName laravel.exemple.cat
DocumentRoot /var/www/laravel/public
<Directory /var/www/laravel/public>
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
# Laravel routing
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php [L]
</IfModule>
</Directory>
<FilesMatch \.php$>
SetHandler "proxy:unix:/run/php/php8.2-fpm.sock|fcgi://localhost/"
</FilesMatch>
ErrorLog ${APACHE_LOG_DIR}/laravel-error.log
CustomLog ${APACHE_LOG_DIR}/laravel-access.log combined
</VirtualHost>
9.3 Aplicació Node.js amb Proxy Invers
<VirtualHost *:80>
ServerName nodejs.exemple.cat
ProxyPreserveHost On
ProxyPass / http://localhost:3000/
ProxyPassReverse / http://localhost:3000/
# WebSocket support
RewriteEngine On
RewriteCond %{HTTP:Upgrade} =websocket [NC]
RewriteRule /(.*) ws://localhost:3000/$1 [P,L]
RewriteCond %{HTTP:Upgrade} !=websocket [NC]
RewriteRule /(.*) http://localhost:3000/$1 [P,L]
ErrorLog ${APACHE_LOG_DIR}/nodejs-error.log
CustomLog ${APACHE_LOG_DIR}/nodejs-access.log combined
</VirtualHost>
10. Referències
[^1]: Apache HTTP Server Project. "About the Apache HTTP Server Project". https://httpd.apache.org/ABOUT_APACHE.html [^2]: Neterra Blog. (2019). "The history of the Apache HTTP Server, how it all came together". https://blog.neterra.cloud/en/the-history-of-the-apache-http-server-how-it-all-came-together/ [^3]: Apache Software Foundation. "ASF History". https://apache.org/history/ [^4]: Wikipedia. "The Apache Software Foundation". https://en.wikipedia.org/wiki/The_Apache_Software_Foundation [^5]: Apache HTTP Server Project. "About Apache - History". [^6]: Neterra Blog. (2019). "Apache 0.6.2 release". [^7]: Wikipedia. "Apache HTTP Server - Name". https://en.wikipedia.org/wiki/Apache_HTTP_Server [^8]: Apache HTTP Server. (1995). Original documentation. [^9]: Behlendorf, B. (2000). Interview on Apache naming. Referenced in Wikipedia article. [^10]: Apache Software Foundation. "Name explanation and cultural respect". [^11]: Wikipedia. "Apache HTTP Server - According to The Apache Software Foundation". [^12]: Behlendorf, B. (2000). Interview quote on "patchy" pun. [^13]: Natives in Tech. (2023). Statement on cultural appropriation. [^14]: TechTarget. "What is Apache?". https://www.techtarget.com/whatis/definition/Apache [^15]: Apache Software Foundation. "Open Source philosophy". [^16]: Apache HTTP Server Project. "Collaborative development model". [^17]: Apache HTTP Server. "Modular architecture documentation". [^18]: Apache HTTP Server. "Cross-platform support". [^19]: Fielding, R. T. et al. HTTP/1.1 RFC contributions. [^20]: Apache Software Foundation. "Community contributions". [^21]: Wikipedia. "Servidor HTTP Apache - Market share". https://es.wikipedia.org/wiki/Servidor_HTTP_Apache [^22]: Wikipedia. "Apache HTTP Server - 100 million websites milestone". [^23]: Apache Software Foundation. "ASF Incorporation 1999". https://apache.org/history/ [^24]: Wikipedia. "Apache Software Foundation - Founding members". [^25]: Apache Software Foundation. "ASF History - Foundation purpose". [^26]: Apache Software Foundation. "The Apache Way - Meritocracy". [^27]: Apache Software Foundation. "The Apache Way - Community consensus". [^28]: Apache Software Foundation. "The Apache Way - Transparency". [^29]: Apache Software Foundation. "The Apache Way - Vendor independence". [^30]: Apache Software Foundation. "The Apache Way - Industry influence". [^31]: Apache HTTP Server. "Apache 2.0 Release Notes". [^32]: Apache HTTP Server 2.0. "Thread-safe API documentation". [^33]: Apache HTTP Server 2.0. "MPM documentation". [^34]: Apache HTTP Server 2.0. "IPv6 support". [^35]: Apache HTTP Server 2.0. "Windows platform improvements". [^36]: Apache HTTP Server 2.0. "Filter chain documentation". [^37]: Apache HTTP Server 2.0. "Configuration directives simplification". [^38]: Apache HTTP Server 2.4. "Release announcement". https://httpd.apache.org/ [^39]: Apache HTTP Server 2.4. "Event MPM stable status". [^40]: Apache HTTP Server 2.4. "Async I/O improvements". [^41]: Apache HTTP Server 2.4. "mod_http2 documentation". [^42]: Apache HTTP Server 2.4. "Performance benchmarks". [^43]: Apache HTTP Server 2.4. "Runtime configuration". [^44]: Neterra Blog. (2019). "Apache market share statistics". [^45]: Nginx documentation. "Architecture and design philosophy". [^46]: Microsoft IIS documentation. "Market presence". [^47]: LiteSpeed Technologies. "Product documentation". [^48]: Wikipedia. "Google Web Server". [^49]: Wikimedia. "Infrastructure documentation". [^50]: Apache HTTP Server. "Architecture Overview". https://httpd.apache.org/docs/2.4/ [^51]: Apache HTTP Server 2.4. "Core Features". https://httpd.apache.org/docs/2.4/mod/core.html [^52]: Apache HTTP Server 2.4. "Multi-Processing Modules (MPMs)". https://httpd.apache.org/docs/2.4/mpm.html [^53]: Apache HTTP Server 2.4. "Module Index". https://httpd.apache.org/docs/2.4/mod/ [^54]: Server Fault. "How do I select which Apache MPM to use?". https://serverfault.com/questions/383526/ [^55]: Apache HTTP Server 2.4. "Apache MPM prefork". https://httpd.apache.org/docs/2.4/mod/prefork.html [^56]: TecAdmin. "What is Apache MPM". https://tecadmin.net/apache-mpm-prefork-and-worker-and-event/ [^57]: Apache HTTP Server 2.4. "prefork - Process management". [^58]: Server Fault. "Prefork isolation advantages". [^59]: Plesk Support. "What are the differences between MPM Event and MPM Prefork". https://support.plesk.com/hc/en-us/articles/12388429705239 [^60]: LinkedIn Learning. "Prefork memory consumption". https://www.linkedin.com/pulse/what-apache-prefork-worker-event-mpm-multi-processing-bipin-tiwari [^61]: Red Hat Documentation. "MPM prefork configuration". https://docs.redhat.com/en/documentation/red_hat_jboss_core_services/2.4.51/html/apache_http_server_connectors_and_load_balancing_guide/multi_processing_modules [^62]: Apache HTTP Server 2.4. "Apache MPM worker". https://httpd.apache.org/docs/2.4/mod/worker.html [^63]: Stack Overflow. "Apache Prefork vs Worker MPM". https://stackoverflow.com/questions/13883646/apache-prefork-vs-worker-mpm [^64]: Red Hat Documentation. "Worker MPM calculations". [^65]: Liquid Web. "MPM Worker memory efficiency". https://www.liquidweb.com/blog/apache-performance-tuning-apache-mpm-modules/ [^66]: Server Fault. "Thread-safety requirements". [^67]: Server Fault. "Keep-Alive problem in Worker". [^68]: Red Hat Documentation. "Worker MPM configuration parameters". [^69]: Apache HTTP Server 2.4. "Apache MPM event". https://httpd.apache.org/docs/2.4/mod/event.html [^70]: DigitalOcean. "How To Configure Apache HTTP with MPM Event and PHP-FPM". https://www.digitalocean.com/community/tutorials/how-to-configure-apache-http-with-mpm-event-and-php-fpm-on-freebsd-12-0 [^71]: Liquid Web. "Event MPM advantages". [^72]: Apache HTTP Server 2.4. "event - Architecture description". [^73]: Apache HTTP Server 2.4. "event - Listener thread mechanism". [^74]: DigitalOcean. "Event MPM scalability". [^75]: Liquid Web. "Event MPM performance benefits". [^76]: Apache HTTP Server 2.4. "event - Improvements since 2.4.24". [^77]: Apache HTTP Server 2.4. "event - Incompatible filters". [^78]: Apache HTTP Server 2.4. "event - Limitations section". [^79]: Apache HTTP Server 2.4. "event - AsyncRequestWorkerFactor". [^80]: Server Fault. "MPM selection recommendations". [^81]: Apache HTTP Server. "Modular Architecture Philosophy". [^82]: Wikipedia. "Servidor HTTP Apache - Arquitectura modular". https://es.wikipedia.org/wiki/Servidor_HTTP_Apache [^83]: Apache HTTP Server 2.4. "Module advantages". [^84]: Apache HTTP Server 2.4. "Module Index - Categories". [^85]: Apache HTTP Server 2.4. "Core Features". https://httpd.apache.org/docs/2.4/mod/core.html [^86]: Apache HTTP Server 2.4. "Apache Module mod_mime". https://httpd.apache.org/docs/2.4/mod/mod_mime.html [^87]: Apache HTTP Server 2.4. "Apache Module mod_dir". https://httpd.apache.org/docs/2.4/mod/mod_dir.html [^88]: Apache HTTP Server 2.4. "Apache Module mod_autoindex". https://httpd.apache.org/docs/2.4/mod/mod_autoindex.html [^89]: Apache HTTP Server 2.4. "Apache Module mod_auth_basic". https://httpd.apache.org/docs/2.4/mod/mod_auth_basic.html [^90]: Apache HTTP Server 2.4. "Apache Module mod_auth_digest". https://httpd.apache.org/docs/2.4/mod/mod_auth_digest.html [^91]: Apache HTTP Server 2.4. "Apache Module mod_authz_core". https://httpd.apache.org/docs/2.4/mod/mod_authz_core.html [^92]: Apache HTTP Server 2.4. "Apache Module mod_authz_host". https://httpd.apache.org/docs/2.4/mod/mod_authz_host.html [^93]: Apache HTTP Server 2.4. "Apache Module mod_rewrite". https://httpd.apache.org/docs/2.4/mod/mod_rewrite.html [^94]: Apache HTTP Server 2.4. "Apache Module mod_alias". https://httpd.apache.org/docs/2.4/mod/mod_alias.html [^95]: Apache HTTP Server 2.4. "Apache Module mod_proxy". https://httpd.apache.org/docs/2.4/mod/mod_proxy.html [^96]: Apache HTTP Server 2.4. "Apache Module mod_proxy_http". https://httpd.apache.org/docs/2.4/mod/mod_proxy_http.html [^97]: Apache HTTP Server 2.4. "Apache Module mod_proxy_fcgi". https://httpd.apache.org/docs/2.4/mod/mod_proxy_fcgi.html [^98]: Apache HTTP Server 2.4. "Apache Module mod_proxy_balancer". https://httpd.apache.org/docs/2.4/mod/mod_proxy_balancer.html [^99]: Apache HTTP Server 2.4. "Apache Module mod_ssl". https://httpd.apache.org/docs/2.4/mod/mod_ssl.html [^100]: Apache HTTP Server 2.4. "Apache Module mod_deflate". https://httpd.apache.org/docs/2.4/mod/mod_deflate.html [^101]: Apache HTTP Server 2.4. "Apache Module mod_expires". https://httpd.apache.org/docs/2.4/mod/mod_expires.html [^102]: Apache HTTP Server 2.4. "Apache Module mod_headers". https://httpd.apache.org/docs/2.4/mod/mod_headers.html [^103]: Apache HTTP Server 2.4. "Apache Module mod_log_config". https://httpd.apache.org/docs/2.4/mod/mod_log_config.html [^104]: Apache HTTP Server 2.4. "Apache Module mod_status". https://httpd.apache.org/docs/2.4/mod/mod_status.html [^105]: Apache HTTP Server 2.4. "Apache Module mod_info". https://httpd.apache.org/docs/2.4/mod/mod_info.html [^106]: PHP Documentation. "Apache 2.x on Unix systems". https://www.php.net/manual/en/install.unix.apache2.php [^107]: Apache HTTP Server 2.4. "Configuration Files". https://httpd.apache.org/docs/2.4/configuring.html [^108]: Apache HTTP Server 2.4. "Options Directive". https://httpd.apache.org/docs/2.4/mod/core.html#options [^109]: Apache HTTP Server 2.4. "AllowOverride Directive". https://httpd.apache.org/docs/2.4/mod/core.html#allowoverride [^110]: Apache HTTP Server 2.4. "Access Control". https://httpd.apache.org/docs/2.4/howto/access.html [^111]: Apache HTTP Server 2.4. "Apache Virtual Host documentation". https://httpd.apache.org/docs/2.4/vhosts/ [^112]: Apache HTTP Server 2.4. "Name-based Virtual Host Support". https://httpd.apache.org/docs/2.4/vhosts/name-based.html [^113]: Apache HTTP Server 2.4. "IP-based Virtual Host Support". https://httpd.apache.org/docs/2.4/vhosts/ip-based.html [^114]: Apache HTTP Server 2.4. "Apache mod_rewrite Introduction". https://httpd.apache.org/docs/2.4/rewrite/intro.html
Document elaborat per a CFGS ASIR/DAW
Darrera actualització: Octubre 2025