Guide till en blixtsnabb WordPress-server

Även om våra webbhotellspaket är väldigt snabba och väl anpassade för WordPress så kan man ibland behöva något lite extra för att snabba upp sin WordPress-sida. Vi tänkte därför visa hur man sätter upp en blixtrande snabb WordPress-server, med de allra senaste tekniska programmen på marknaden.

Även om det är enkelt att följa denna guide så bör man ändå ha viss vana av att hantera en Linux-server sedan tidigare. Vi kommer köra program såsom MariaDB, Nginx, PHP-FPM och Redis på servern. Det är extremt snabba och optimerade program, men de kan även orsaka huvudvärk om man inte kan hantera dem ordentligt.

Använd denna guide på egen risk. 🙂

Vår kundtjänst har inte möjlighet att erbjuda support på denna installation, men ni får gärna lämna en kommentar här nedan om ni har några frågor. Om ni har förslag på förändringar/förbättringar i denna guide så mottas det givetvis tacksamt (och kan leda till fortsatta uppdateringar av denna guide).

Till vår WordPress-server använder vi en snabb och kraftfull VPS hos FS Data med Linux Ubuntu 12.04 som operativsystem. Samtliga kommandon nedan körs inloggad på servern via SSH som root-användare.

Guide till en blixtsnabb WordPress-server

Uppdatera servern

Börja med att uppdatera servern. Detta bör man fortsättningsvis göra åtminstone en gång i veckan.

apt-get update && apt-get upgrade

Om frågor uppstår under uppdateringen, svara ja på dessa. Det gör man antingen genom att trycka på Y eller enter-knappen. Detsamma gäller samtliga kommandon nedan, om inte annat anges.

Installera MariaDB

Vi börjar med att installera databasservern MariaDB, istället för MySQL. MariaDB är en snabbare databasserver än MySQL. Den utvecklas aktivt under ledning av tidigare MySQL-utvecklare och är fullt binärkompatibel med MySQL.

apt-get install python-software-properties
apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 0xcbcb082a1bb943db
add-apt-repository 'deb http://mirror.netcologne.de/mariadb/repo/5.5/ubuntu precise main'
apt-get update
apt-get install mariadb-server

Ange ett säkert lösenord för root-användaren när detta efterfrågas.

Därefter säkerställer vi databasservern genom att ta bort databas/användare som skapas automatiskt med installationen av MariaDB. Vi tar även bort möjligheten till fjärranslutning mot databasservern som root-användare.

mysql_secure_installation

Följ instruktionerna på skärmen. Om du har angivit ett säkert lösenord så behöver du inte byta detta. Övriga frågor kan du svara “Y” på.

Installera Nginx och PHP-FPM

Som webbserver använder vi Nginx istället för Apache. Nginx är mycket snabbare och mindre resurskrävande än Apache. WordPress fungerar alldeles utmärkt med Nginx, med vissa justeringar. För PHP använder vi PHP-FPM, av säkerhets- och prestandaskäl.

apt-get install nginx
apt-get install php5-cgi php5-cli php5-common php5-curl php5-fpm php5-gd php5-imap php5-mcrypt php5-mhash
php5-mysql php5-pspell php5-remctl php5-sqlite php5-suhosin php5-svn php5-tidy php5-xmlrpc php5-xsl
php-pear php-apc

Listan med PHP-tillägg ovan kan givetvis minskas om man så önskar det (för ännu bättre prestanda).

– Konfigurera Nginx

Nginx är rätt bra konfigurerad redan från början. Vi behöver därför bara göra några mindre justeringar.

nano /etc/nginx/nginx.conf

Uppdatera/lägg till följande variabler:

worker_connections 1024;
client_max_body_size 25m;

Avkommentera även samtliga rader som inkluderar gzip. Med gzip-stödet komprimeras samtliga filer, vilket ger en avsevärd förbättring av hastigheten på WordPress.

– Konfigurera PHP

Den observante såg att vi installerade PHP-tillägget APC. Till detta cache-tillägg tilldelar vi 256 MB minne så här:

echo "apc.shm_size="256"" >> /etc/php5/conf.d/apc.ini

Öppna därefter filen /etc/php5/fpm/php.ini med valfri textredigerare och uppdatera följande värden:

memory_limit = 128M
max_execution_time = 120
max_input_time = 300
post_max_size = 25M
upload_max_filesize = 25M

Lägg även in detta i slutet av filen:

cgi.fix_pathinfo = 0

Förändringarna i php.ini ger WordPress mer tid till att avsluta script, minskar eventuell minnesförlust och ökar storleken på filer som man kan ladda upp. Variabeln som läggs till i slutet kan ställa till problem med WordPress, det är därför vi inaktiverar den.

Lägg upp en webbsajt

Nu är det dags att skapa en WordPress-sajt på servern. Av säkerhetsskäl så kör vi denna sajt med en egen användare. På så sätt begränsas rättigheterna samtidigt som man bl a får möjlighet att logga in via SFTP med sin egen användare. I nedanstående instruktioner får ni byta ut exempel_se och exempel.se mot era egna användarnamn och domännamn.

adduser exempel_se

Välj ett säkert lösenord och tryck på enter-knappen för övriga frågor. Därefter skapar vi en databas för sajten.

mysql -u root -p

Ange det tidigare valda lösenordet för root-användaren till MariaDB. Väl inloggad, kör följande kommandon:

CREATE DATABASE exempel_se;
GRANT ALL PRIVILEGES on exempel_se.* TO "exempel_se"@"%" IDENTIFIED BY "lösenord";
FLUSH PRIVILEGES;
EXIT;

Byt givetvis ut “lösenord” mot ett eget lösenord.

Nu ska vi skapa en PHP-konfiguration för webbsajten. Men vi börjar med att flytta undan standardkonfigurationen.

cd /etc/php5/fpm/pool.d/
mv www.conf ../

Sedan skapar vi en konfiguration för sajten med valfri textredigerare.

nano exempel.se.conf

Lägg in följande text och spara denna fil:

[exempel.se]
listen = 127.0.0.1:9000
listen.backlog = -1
listen.owner = exempel_se
listen.group = exempel_se
listen.mode = 0666
user = exempel_se
group = exempel_se
pm = dynamic
pm.max_children = 15
pm.start_servers = 5
pm.min_spare_servers = 3
pm.max_spare_servers = 5
pm.max_requests = 50
request_slowlog_timeout = 60s
slowlog = /var/log/php-fpm.log.slow

De värden som anges i PHP-konfigurationen bör anpassas beroende på hur mycket minne man vill använda för PHP. Med denna konfiguration används ca 1 GB RAM-minne (i kombination med APC-cachen).

Därefter skapar vi konfigurationen för webbsajten i webbservern (Nginx).

nano /etc/nginx/sites-enabled/exempel.se

Nedanstående konfiguration gäller för en sajt, i kombination med PHP-konfigurationen ovan. Konfigurationen anger även denna sajt som standardsajt på servern, så att man kan surfa in till den direkt via sin egen IP-adress (med värdet “default” under listen).

Om man vill ha fler sajter på samma server (och inte köra dem i ett WordPress-nätverk) så behöver man ändra portnummer för ytterligare sajter. Här använder vi t ex portnummer 9000. För extra sajter, öka detta till 9001, 9002 osv. Glöm inte bort att exkludera “default” för extra sajter.

server {
listen 80 default deferred;
server_name exempel.se *.exempel.se;
index index.php;
charset utf-8;
root /home/exempel_se/exempel.se;

location / {
try_files $uri $uri/ /index.php?$args;
}

rewrite /wp-admin$ $scheme://$host$uri/ permanent;

location ~* .(js|css|png|jpg|jpeg|gif|ico)$ {
expires max;
log_not_found off;
}

rewrite /files/$ /index.php last;

if ($uri !~ wp-content/plugins) {
rewrite /files/(.+)$ /wp-includes/ms-files.php?file=$1 last;
}

if (!-e $request_filename) {
rewrite ^/[_0-9a-zA-Z-]+(/wp-.*) $1 last;
rewrite ^/[_0-9a-zA-Z-]+.*(/wp-admin/.*.php)$ $1 last;
rewrite ^/[_0-9a-zA-Z-]+(/.*.php)$ $1 last;
}

location ~ .php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+.php)(/.+)$;
include fastcgi_params;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass 127.0.0.1:9000;
}
}

Ovanstående konfiguration anpassas givetvis efter eget användarnamn och domännamn. Konfigurationen fungerar med både en vanlig WordPress-sida och WordPress Multisite (nätverkssida).

Installera WordPress

Nu ska vi lite snabbt hämta ner och installera WordPress. För att automatiskt få den senaste versionen av WordPress så använder vi subversion. I dagsläget fungerar inte subversion med WordPress-översättningar, så där behöver man kontrollera senaste version och anpassa installationen därefter (vi hämtar den svenska översättningen för WordPress 3.5.1 här nedan).

apt-get install subversion
mkdir /home/exempel_se/exempel.se && cd /home/exempel_se/exempel.se
svn co http://core.svn.wordpress.org/tags/3.5.1/ .
mkdir wp-content/languages && cd wp-content/languages/
wget http://svn.automattic.com/wordpress-i18n/sv_SE/tags/3.5.1/messages/sv_SE.mo
cd -
mv wp-config-sample.php wp-config.php
nano wp-config.php

Ange uppgifterna för din databas. För att aktivera det svenska språkstödet, ändra denna variabel:

define ('WPLANG', 'sv_SE');

Spara och stäng wp-config.php. Denna fil kan med fördel även flyttas en mapp nedåt (av säkerhetsskäl). Dessutom så behöver vi sätta rätt ägare till samtliga WordPress-filer.

cd ..
mv exempel.se/wp-config.php .
chown -Rf exempel_se:exempel_se *

Nu är WordPress installerat och klart. Det enda som kvarstår är att slutföra installationen via WordPress webbgränssnitt.

För att våra ändringar av Nginx och PHP-FPM ska träda i kraft så behöver vi ladda om dessa tjänster. Så här gör vi det:

service nginx reload
service php5-fpm reload

Därefter är det bara att surfa till IP-adressen för servern och ange de uppgifter som där efterfrågas av WordPress. Om du har en WordPress-sida som du vill importera till denna nya server så är det en bra idé att göra det nu.

– Kort om tillägg

Installera inga WordPress-tillägg för cache (såsom WP Super Cache, W3 Cache osv). Cachen på denna server hanteras separat, via Redis, och konflikter kan uppstå med cache-tillägg.

Installation av WordPress-tillägget nginx Compatibility rekommenderas. Detta löser omskrivningar i WordPress med Nginx (WordPress är från grunden anpassat för omskrivningar med Apache).

WordPress-tillägg som är väldigt beroende av funktioner i Apache kanske inte fungerar med denna server. Det är som sagt en väldigt optimerad och specialanpassad server, så installera och testa nya tillägg på egen risk.

Installera och konfigurera Redis

Istället för en traditionell cache med WordPress-tillägg så ska vi köra Redis. Redis är en lokal cacheserver som lagrar data i RAM-minnet för maximal hastighet i t ex WordPress. Inspiration till detta kommer från Jim Westergrens utmärkta guide till WordPress med Redis.

Börja med att installera Redis.

apt-get install redis-server

Redis kommer att ligga och köra som en servertjänst i bakgrunden. För att kommunicera med denna server så använder vi PHP-biblioteket Predis.

cd /home/exempel_se/exempel.se/
wget http://uploads.staticjw.com/ji/jim/predis.php

Därefter ska vi ersätta WordPress egen index.php med en Redis-anpassad index-sida. Kopiera denna all text:

Skapa sedan en fil som heter index-with-redis.php.

nano index-with-redis.php

Klistra in den kopierade texten och spara filen. Som du kan se så finns det tre variabler som man kan definiera i toppen av denna fil. Testa gärna att t ex sätta debug-flaggan. Filen innehåller även information om hur man hanterar cachen (missa inte det).

Därefter tar vi en backup på den ursprungliga index-sidan och ersätter den med vår Redis-sida.

cp index.php index-backup.php
cp index-with-redis.php index.php
chown exempel_se:exempel_se *

Den enda egentliga nackdelen med att köra cache i WordPress med Redis, det är att man måste ersätta index-sidan varje gång man har uppdaterat till en ny version av WordPress (då index.php ersätts med uppdateringen).

Om du har satt debug-flaggan i din nya index-fil så är det bara att surfa till din WordPress-sida och njuta av den minimala laddningstid som visas längst ner på sidan.

Några avslutande ord

Det tål att upprepas att denna guide inte bör följas om man saknar grundläggande kunskap om Linux och inte är beredd att lägga ner en hel del tid på att lära sig mer om de olika programvarorna angivna ovan. Det finns utrymme för optimeringar och förbättringar, men med denna installation till grund så kommer man väldigt långt, väldigt snabbt.

Faktum är att ovanstående guide kommer att användas för det populära och vältrafikerade humornätverket Skyltat.se, som ligger på en VPS hos FS Data. När detta WordPress-nätverk är migrerat (tester pågår just nu) så kommer mer information och laddningstider även att läggas in här.

Lämna gärna en kommentar nedan om du har några frågor eller om du har förslag till ytterligare förbättringar!

You Might Also Like
10 Comments
Lämna ett svar