Installera en LEMP server för WordPress

Posted 19.08.2015 in WordPress by Jakob Lundberg

Det finns i dagens läge ett flertal olika alternative för att hosta en WordPress installation.

En vanlig lösning kan vara att använda en delad hosting lösning så som t.ex. HostGator. Det är en väldigt kostnadseffektiv lösning. Nackdelen med delad hosting är att prestandan i vissa fall kan bli lidande. Detta kan vara av stor vikt. Användarna kan få en direkt negativ upplevelse om det tar extra länge att ladda sidan. Även Google är medvetna om detta och flyttar långsamma sidor längre ner i listan av sökresultat. Det finns även leverantörer som specialiserat sig på att endast hosta WordPress installationer och erbjuder även högpresterande alternativ. Man får dock betala en hel del för de högpresterande lösningarna.

Så vad kan man göra istället? Ett alternativ är att hyra en egen server, vps eller dedikerad server, och där installera sin WordPress sida.

Förutsättningar för WordPress

Men vad är det egentligen som behövs för att köra WordPress på en server? I grund och botten är det 4 saker som krävs.

  • Ett operativsystem
  • En webbserver
  • En MySQL databas
  • PHP

För var och en av dessa förutsättningar finns det ett antal alternativ att välja på.

Operativsystem

Valet av operativsystem är ett hett diskuterat område med många faktorer att välja på. Exempel är

  • Ubuntu
  • Debian
  • CentOS/RHEL
  • FreeBSD

Inget val är rätt eller fel. Ubuntu har fördelen med att det är ett väldigt vanligt val och det finns därför mycket dokumentation och många duktiga personer att fråga om råd. Därför kommer jag att i det här exemplet att använda Ubuntu.

Webbserver

Också vid valet av webbserver finns det ett antal alternativ. Det vanligaste valet för WordPress är Apache. Apache är en webbserver med väldigt omfattande funktionalitet. Bland dess funktionalitet finns ett inbyggd stöd för PHP vilket givetvis är en stor orsak till att kombinationen Apache/PHP är så populär. Nackdelen med Apache och dess inbyggda PHP modul är att det snabbt kan bli onödigt resurskrävande vilket leder till längre laddtider. Apache har även ett konfigurationsformat som jag personligen finner ganska svårläst. På grund av dessa orsaker kommer jag i detta exempel att välja en annan webbserver, nämligen Nginx.

Nginx har inte lika mycket funktionalitet. Det är helt enkelt en HTTP router som tar emot anrop och skickar dem vidare till statiska filer, en unix socket eller en annan webbserver. Eftersom Nginx är fokuserad på just denna uppgift så är den väldigt effektiv på att göra just det. Och det är enkelt att styra anrop av bilder till statiska filer och anrop till dynamiska sidor till en bakomliggande PHP process.

PHP

Nästa del i pusslet är PHP processen. Som tidigare nämnt är Apaches PHP modul ett alternativ. Men eftersom vi vill undvika prestanda problemen som finns där så väljer vi istället in fristående PHP process. En sådan är PHP FastCGI process manager, eller php-fpm. Den kan enkelt konfigureras att svara på en unix socket som sedan kan kopplas ihop med Nginx.

MySQL

Det sista valet vi behöver göra är vilken databas vi vill använda. WordPress är byggt för att använda MySQL som databas och valet verkar därför ganska enkelt. Men det finns ändå alternativ här också. MariaDB är gjort att fungera som en direkt ersättare av MySQL och har en hel del intressanta finesser så som stöd för Galera Master-Master kluster. Men för att hålla det enkelt kommer vi här att titta på installationen av MySQL.

För att summera valen som här gjorts så kommer vi att använda

Detta kan refereras som en LEMP stack. Linux(Ubuntu), Nginx(Uttalas Engine X), MySQL och PHP.

Installation

Installation av Ubuntu

Installationen av operativsystemet är oftast automatisk från en färdig template. Men det kan vara olika beroende på vad för server det är som används. Vi antar här att Ubuntu 14.04 är installerat direkt vid start av servern.

För att se till att servern är uppdaterad kör vi kommandona

apt-get update
apt-get upgrade

Installation av MySQL

För att installera databas servern installerar vi paketet mysql-server

apt-get install mysql-server

Vid installationen ombeds vi att fylla i ett lösenord för MySQLs root användare. Därefter gör vi grundinställningarna för databasen med följande kommandon

mysql_install_db
mysql_secure_installation

Med det andra kommandot säkrar vi upp databasen genom att

  • Se till att root användaren faktiskt har ett lösenord
  • Raderar anonyma användare
  • Förbjuder att root användaren kan ta kontakt med databasen över nätverket
  • Tar bort testdatabasen
  • Uppdaterar rättigheterna

Sedan kan vi skapa en databas och en användare för WordPress. För att göra detta startar vi MySQL klienten

mysql -u root -p

och loggar in med lösenordet vi just skapade.
Sedan kan vi göra förändringarna i databasen.

CREATE DATABASE wordpress;
CREATE USER wordpressuser@localhost IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON wordpress.* TO wordpressuser@localhost;
FLUSH PRIVILEGES;
exit

Vi har nu en databas användare för WordPress med rättigheter till databasen wordpress.

Installation av PHP-FPM

Först installerar vi PHP-FPM paketet. Vi behöver också installera själva PHP samt de extra moduler som kan behövas av WordPress.

apt-get install php5-fpm php5 php5-cli php5-curl php5-gd php5-imagick php5-mysql php5-xmlrpc

För att PHP-FPM ska fungera på ett säkert sätt med WordPress vill vi göra en förändring i dess konfigurering. Efter installation är PHP-FPM inställt att försöka rätta till felaktiga sökvägar. Detta kan resultera i att filer som inte är menade att exekveras blir det i alla fall. För att undvika detta ändrar vi i filen /etc/php5/fpm/php.ini

; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI.  PHP's
; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok
; what PATH_INFO is.  For more information on PATH_INFO, see the cgi specs.  Setting
; this to 1 will cause PHP CGI to fix its paths to conform to the spec.  A setting
; of zero causes PHP to behave as before.  Default is 1.  You should fix your scripts
; to use SCRIPT_FILENAME rather than PATH_TRANSLATED.
; http://php.net/cgi.fix-pathinfo
cgi.fix_pathinfo=0

Installation av Nginx

Installationen av Nginx görs med kommandot

apt-get install nginx

Sedan skapar vi en konfigurationsfil för vår WordPress instans. Den sparas som /etc/nginx/sites-available/wordpress.conf

server {
    listen       80;
    server_name  www.example.com;
    root /var/www/wordpress;
    index index.php;

    location / {
        try_files $uri/ $uri/ =404;
    }

    error_page      500 502 503 504  /50x.html;
    location = /50x.html {
        root /usr/share/nginx/html;
    }

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $request_filename;
        include fastcgi_params;
    }
}

Den här konfigurationen kommer att aktiveras för domännamnet www.example.com. Detta måste givetvis ändras till den specifika installationens domännamn. Vi utgår här även från att WordPress kommer att installeras i katalogen /var/www/wordpress. Vi konfigurerar även Nginx att vidarebefordra alla förfrågan som slutar med .php till PHP-FPM socketen.

Slutsats

Vi har nu en fullständig LEMP stack och är redo för att installera WordPress. Det går att göra mera avancerade konfigurationer för att maximera prestanda och säkerhet. Men vi har här en bas att utgå från.

Written by Jakob Lundberg

Jakob is a tech focused system designer. With a background in network management, system administration and development he has an interest in the entire stack.

Always looking for new and improved solutions. Never accepting that things have to be complicated.