Enkel prestandaoptimering av en server med Apache och MySQL

Özgür Bal Molnet Leave a Comment

apache and mysqlPerfekt! Du har precis skapat en Linux-server i City Cloud och kanske till och med använt vår färdiga LAMP-image. Eller så har du installerat Apache, PHP och MySQL på egen hand. Så långt är allting bra men det är bara början. För att göra din server mottaglig för så många anrop, och i sin tur besökare, som möjligt är det viktigt att göra vissa justeringar i Apache och MySQL.

När man pratar om web-prestanda menar man oftast snabba respons- och laddtider så att din hemsida laddas snabbare. Det är förstås lättare sagt än gjort då det finns en mängd olika åtgärder att titta på när man pratar om laddtider. Exempelvis kan det i vissa fall vara så att man har en riktig monsterserver men att mjukvaran inte är tillräckligt väl konfigurerad för att matcha behoven. Det kan också vara så att både servern och mjukvaran fungerar alldeles utmärkt men att man har några tabeller i sin databas som måste indexeras. Ditt PHP script kanske behöver optimeras.

Med andra ord finns det en rad olika scenarion som alla har olika lösningar. Det har skrivits flera böcker i ämnet men en regel är att prestandaoptimeringar är en pågående process där upprepning, testning och mätningar är nyckeln till en snabb hemsida.

I den här artikeln visar vi några praktiska tips som hjälper din standardinstallation att prestera lite bättre än normalt. Det finns förstås massor av andra saker man kan göra men de tips vi ger här är perfekta att börja med.

Apache2

 

 

 

 

Oanvända moduler

 

Apache-processer är minnestjuvar, det är väldigt vanligt att se processer som använder flera hundra MB RAM-minne. Tänk dig en server som har 1GB RAM där 5 personer surfar runt på hemsidan, det är inte jättesvårt att se hur snabbt det kan gå fel. Att inaktivera av oanvända moduler säkerställer att varje process som startas enbart använder de resurser som den behöver.

För att inaktivera en modul i Apache 2 använder du följande kommandon:

a2dismod module_name

And then make sure you restart Apache

apachectl restart

 

Keepalive (beständiga  anslutningar)

Det här alternativet talar om för Apache att hålla igång en anslutning till en klient så att den inte behöver skapa en ny hela tiden. Det kan vara bra att aktivera den här funktionen men bara om vi minskar ned KeepAliveTimeOut parametern. En lång timeout kan slöa ned servern med onödiga processer.

Då en webbsida vanligtvis inte tar mer än 3 sekunder att ladda (om inget är fel) bör denna siffra vara någonstans mellan 3-5. Om vi VET att vår sida har många sidvisningar (exempelvis om det är en webbapplikation) kan det även vara bra att ha ett stort tal för MaxKeepAliveRequests.

Timeout

Genom att sänka värdet för den generella timeout-tiden till en rimlig nivå säkerställer vi att inga Apaceprocesser ligger och körs för länge. Var dock försiktig så att du inte sänker timeouten för mycket, ett värde mellan 10-15 är en bra början.

Name server resolution

Apacheloggarna är en riktigt bra funktion som senare kan användas till en mängd olika saker. Allt från säkerhetsgranskning till trafikbearbetning. För oss människor är det mycket tydligare att använda oss av ett hostname istället för en IP-adress och medans en träff på en namnserver inte är speciellt mycket kan en sida med mycket trafik samla på sig en hel del förfrågningar.

Om du inte behöver den här specifika funktionen är det bäst att stänga av den.

htaccess file lookup

Om du har en virtuell host som inte använder sig av .htaccess filer kan du sätta AllowOverride parameter till “None” så att Apache inte letar efter .htaccess i varje filkatalog.

Antal processer

Detta är mestadels beroende på hur mycket tillgängligt minne och processorkärnor man har. De enkla inställningarna ger dig inte speciellt många samtidiga anslutningar men det är bra att testa sig fram till en bra balans. En sak måste du dock säkerställa; låt inte minnet ta slut för då kommer servern växla till disk och slöa ned din server ordentligt. Om du har inaktiverat den här funktionen kommer kerneln att börja avsluta processer (om vi har tur) eller helt stoppa servern.

Det är väldigt viktigt att ha ett ungefärligt hum om hur många besök vår hemsida kommer att ha. Med den ungefärliga siffran kan vi räkna ut och ställa in servern att klara av den beräknade lasten. I City Cloud kan vi tack och lov även skala om servern vid behov.

Här är ett exempel på inställningar för en City Cloud-server med 2 processorkärnor och 1GB RAM

StartServers         10
MinSpareServers      10
MaxSpareServers      15
ServerLimit     50
MaxClients         50
MaxRequestsPerChild   500

Dessa inställningar är något optimistiska. De förutsätter att du inte kommer att ha fler än 50 samtidiga besökare/klienter anslutna till servern. Självklart ställer man in detta efter behag. 50 samtidiga användare under dygnets mest hektiska tid kan representera en sida med 2-3000 dagliga besökare.

MySQL

Cachning

Det här är ett av de bästa sätten att optimera webbsidor som har mycket trafik och generellt sett läser från databasen. Att cacha betyder att vanliga förfrågningar hämtas från cacheminnet vilket är mycket snabbare än att göra om hela förfrågningen till databasen.

Cachning tar ut sin rätt på minnet så man måste säkerställa att det finns tillräckligt mycket minne kvar för vår MySQL server process. De parametrar som är av särskilt intresse är dessa, förutsatt att vi kör en server med 1GB RAM-minne.

query_cache_type = 1

query_cache_size = 32M

key_buffer_size = 64M

thread_cache_size =  4

max_connections =  150

Separera databasen

Det här är ingen inställning utan mer ett tillvägagångssätt. Om du börjar med en liten server har du troligen både webbservern och databasen på samma maskin. När trafiken ökar tenderar saker och ting bli lite rörigt då Apache och MySQL slåss om resurserna på servern.

Att flytta en databas från en maskin till en annan är inte jättekomplicerat och något som blir nödvändigt i takt med att din webbsida växer. Om du råkar ha en webbsida som ständigt växer kommer du så småningom även stöta på andra tekniker såsom replikering, automatisk failover och andra tekniker som används när du har en databas som huseras på flera maskiner.

Det finns inget substitut för en väl designad databas

Om din databas inte har en optimal struktur och är inställd på rätt sätt spelar det ingen som helst roll hur mycket du skalar ut. Du kommer alltid att ha flaskhalsar som inte har någonting med dina serverinställningar att göra. Att säkerställa att din databas har en bra struktur är precis lika viktigt som att ha rätt infrastruktur.

 

Sammanfattning

Kom ihåg att de exempel, tips och råd vi tagit upp bara är ett sätt att optimera. Självklart finns det andra alternativ såsom att välja en annan sorts webbserver (nginx exempelvis), vertikal och horisontell skalning, djupare optimering av databasen eller kanske koden.

Det vi har visat här kretsar kring bas-optimering och är inte den ultimata lösningen vilket närmast är att flytta ut databasen på en egen server etc. Dessa enkla optimeringar och tänket kring dem hjälper dig dock att komma igång och inte få prestandaproblem direkt när trafiken på din webbsida ökar.