Etikettarkiv: wordpress

Docker-hearts-WordPress

Docker med WordPress

Ni som läser denna blogg vet hur förälskad jag är i Docker. Jag tänkte nu försöka förklara hur du kan köra WordPress tillsammans med Docker. Det är ingen lätt process men det finns en stor uppsida:

  • Flexibilitet – Möjlighet att flytta komponenter mellan servrar lätt. Exempelvis lyfta ur databasmotorn eller webbservern.
  • Säkerhet - Allt separeras med hjälp av Linux Containers. Inte lika säkert som separata fysiska servrar eller virtuella maskiner.
  • Skalbarhet – Att växla upp delkomponenter är snabbt och enkelt. Lägga till och ta bort memcached exempelvis.
  • Driftsättning – Gå från utveckling, stage-miljö till driftsättning går snabbt och smidigt. Inga jobbiga beroenden som saknas eller är felaktiga.

Men hur gör man då? Jo först och främst är det några saker man måste tänka på:

  • En docker med Nginx + WordPress
  • Skrivbart filsystem för wp-content utanför dockern till WordPress.
  • En docker med MySQL (eller MariaDB, Percona)
  • Skrivbart filsystem för MySQL-databasen utanför dockern
  • Framtid: En docker med memcached.

Då sätter vi igång. Jag går ej igenom hur du installerar Docker utan det kan du läsa här eller köra Vagrant som jag gör på Mac OS X.

Installera NginxNginx

Den första dockern vi skapar ska ha Nginx samt WordPress installerat. Port 80 för http ska exponeras utåt.

Först och främst kör vi igång kommandotolken bash i Ubuntu 13.10 samt installerar Nginx.

# mkdir -p /data/wordpress/

Först enligt ovan kommando så skapar vi en gemensam katalog för våra containrar samt värdsystemet som ligger under /data.

# docker run -v /data/wordpress:/data/wordpress -p 80:80 -i -t ubuntu:13.10 /bin/bash
# apt-get update
# apt-get -y dist-upgrade
# apt-get -y install php5-fpm php5-gd php5-mysqlnd nginx php5-cli php5-curl php5-json

Ändra sedan /etc/nginx/sites-enabled/default och lägg till konfigurationsdirektiv enligt exempelvis den konfigg-template du hittar här. Du kan även konfigurera tonvis med andra inställningar i Nginx för att uppnå optimal prestanda, men det är ligger utanför denna guide.

Du måste även sätta root till den delade katalogen /data/wordpress/ i Nginx-konfen samt lägga till nedan i /etc/nginx/nginx.conf:

daemon off;

Vi avslutar dockern genom att trycka ctrl-D eller skriva exit.

Sedan kör vi följande för att spara ändringarna vi har genomfört i vår docker. Obs detta är viktigt annars går allt förlorat:

# docker ps -a

Kontrollera sedan vilket container ID den dockern vi just jobbade med och skriv ner ändringarna permanent genom en commit:

# docker commit 5d jonaslejon/nginx-wp:version1

Det räcker att skriva exempelvis de första två tecken i container ID. Ovan exempel så skriver jag bara 5d.

WordPress installationwordpress

Nästa steg är att ladda hem och installera WordPress. Detta görs genom att vi ansluter till dockern som vi just installerade Nginx på:

# docker run -v /data/wordpress:/data/wordpress -p 80:80 -i -t jonaslejon/nginx-wp:version1 bash

Sedan installerar vi wget samt går vi till root-katalogen för webbservern vilket i mitt fall är enligt följande:

# apt-get -y install wget
# chown www-data /data/wordpress/
# cd /data/wordpress/
# wget http://sv.wordpress.org/wordpress-3.8.1-sv_SE.tar.gz
# tar xvfz wordpress-3.8.1-sv_SE.tar.gz
# mv wordpress/* .
# exit

Då var WordPress och Nginx installerat. Och glöm framförallt inte att göra en commit på ändringarna:

# docker ps -a
# docker commit 7e6b550faa50 jonaslejon/nginx-wp:version3

Installation av MySQL, MariaDB eller Percona Server

Här ska vi inte glömma att skapa MySQL dockern i en helt ny docker och inte fortsätta med föregående Nginx-docker.

# mkdir -p /data/mysql

Först skapar vi en gemensam katalog där filerna till databasen ska leva kvar. Sen kör vi igång en docker och delar katalogen:

# docker run -v /data/mysql:/data/mysql -p 3306:3306 -i -t ubuntu:13.10 /bin/bash
# apt-get -y install mysql-server
# chown ubuntu /data/mysql
# vi /etc/mysql/my.cnf
# service mysql start
# echo "create database wordpress"|mysql -plösenord
# echo "GRANT ALL PRIVILEGES ON wordpress.* TO 'wordpress'@'localhost' IDENTIFIED BY 'wplösenord'" | mysql -plösenord
# exit 
# docker ps -a 
# docker commit 1f9b38696a7f jonaslejon/mysql:version1

Ovan så ändrar du även i konfigg-filen /etc/mysql/my.cnf där datadir finns (jag gör det med vi). Ändra katalogen från /var/lib/mysql till /data/mysql/.

Jag skapar även ovan en ny databas med namnet wordpress samt en användare med namnet wordpress och lösenordet wplösenord.

Om allt sedan fungerar och du har gjort en commit så kan du testa denna docker med:

# docker run -v /data/mysql:/data/mysql -p 3306:3306 -i -t jonaslejon/mysql:version1 /usr/bin/mysqld_safe

Starta upp allt

Då var två stycken Docker-containers skapade. Vi ska nu starta upp dessa och hoppas på att allt går vägen. Skillnaden här är att vi anger -d så att containrarna läggs i bakgrunden:

# docker run -d -v /data/mysql:/data/mysql -p 3306:3306 -i -t jonaslejon/mysql:version1 /usr/bin/mysqld_safe
Det vi gör sedan är att titta med docker ps:
docker ps
Samt kontrollera loggarna från containern:
docker logs

Ser bra ut! Då ska vi starta upp webbservern Nginx:

# docker run -v /data/wordpress:/data/wordpress -p 80:80 -i -t jonaslejon/nginx-wp:version3 sh -c "service php5-fpm start && service nginx start"
Verifiera att allt körs med hjälp av docker ps-kommandot.

Avslutande anmärkningar

Nu behöver du bara konfigurera WordPress genom att surfa till localhost:80. Detta står även under PORTS när du kör docker ps.

IP-adressen som du behöver när du konfigurerar WordPress-installationen till MySQL-databasen kan du få ut genom att köra inspect på rätt container:

# docker inspect c6e0c1e4e5f0|grep -i ipaddress
 "IPAddress": "172.17.0.2",

Om du ansluter via Vagrant mot containrarna så måste du även konfigurera i Vagrantfile alternativt när du kör vagrant up på följande sätt:

# FORWARD_PORTS=80,3306 vagrant [up|reload]

Övrigt

  • Du behöver inte ha en delad /data-katalog som jag kör med. Men bra om du vill ha data som ska leva en längre tid.
  • Du kan även köra Nginx och MySQL på samma container.
  • Supervisord kan vara bra att använda för att starta upp och hålla koll på processer.
  • Det finns färdiga containers i det centrala docker-indexet. Sök genom kommandot docker search wordpress eller klicka här >
  • Det finns ett fiffigt sätt att automatiskt koppla ihop två containers genom att använda -link argumentet. Då läggs miljövariablar innehållandes port samt IP-nummer till automatiskt på följande sätt:

docker link

Gillar du detta blogginlägg? Donera gärna till min Bitcoin-adress nedan eller dela detta inlägg i sociala medier.

  • 13cxyC2sFvNfAAShcAaSs2YMW3Q4ygstD4
Jonas Lejon WordPress Säkerhet

Föreläsning om WordPress och säkerhet

Föregående fredag så höll jag en föreläsning om WordPress och säkerhet på Västerås Science Park. Föreläste gjorde även Christoffer Larsson från Aftonbladet och hur de använder Vagrant för utvecklingsmiljön.

På min föreläsning om säkerhet så berättade jag om en händelse som inträffade för några år sedan då en angripare lyckades utnyttja en sårbarhet på en av mina bloggar och placera ut ett antal bakdörrar. Genom att bakdörra angriparens bakdörrar samt spåra IP-adressen mot andra anrop på min webbserver så lyckades jag till slut hitta alla bakdörrar.

Här finnes presentationen:

Läs mer om #wpbar här. Och tack till Västerås Science park samt Flowcom som sponsrat + arrangerat detta trevliga event.

Internetdagarna 2013

Internetdagarna

Det är inte så många veckor kvar till min favoritkonferens Internetdagarna. Konferensen har alltid så många intressanta föredrag att jag alltid har svårt att välja vilket jag ska gå på. Synd att jag inte kan klona mig!

Förutom Internet Discovery Days som går dag två så finns det ett antal intressanta spår dag ett:

  • Swedish Startup Sessions
  • Domännamnsbranschen just nu
  • Öppna data – vad händer under 2014?
  • En dag med WordPress

Använder du bokningskod IND13 så erhåller du rabatt.

Transparens: Jag hjälper till att marknadsföra Internetdagarna mot för att jag får marknadsföra min nya startup på Internetdagarna. Återkommer med mer information när det beger sig.

WordPress felsökning, prestanda och optimering

I måndags så höll jag ett uppskattat föredrag om hur du felsöker och optimerar WordPress. Själva presentationsmaterialet innehåller många punkter och är kladdigt, men har dock ett syfte: Att fungera som ett underlag vid felsökning/optimering.

Tack till @tdh, .SE mfl som såg till att årets upplaga av WordCamp gick av stapeln.

Presenstationen har CC-BY 2.0 licens.

Bild på mig av @dcarlbom:

Bilden ovan har licens CC BY NC SA och är tagen av Daniel Carlbom.

Jag föreläser om WordPress på WordCamp

Snart kan du höra mig föreläsa om WordPress och prestanda på WordCamp aka Internetdagarna Forum som är den första dagen av tre. Även så är det Internet Discovery Days under samma dag som jag även tycker att du inte får missa.

Under mitt föredrag kommer jag att fokusera på de erfarenheter jag erhållit då jag hjälp några av Sveriges största bloggare att få upp prestanda i WordPress istället för att köpa ny hårdvara.

Håll koll på wpsthlm.se eller Facebook-sidan. Hashtaggar som kan användas på Twitter är #wpSthlm eller #idd12.

Har din WordPress-blogg hackats? Läs det här

Fler och fler WordPress-bloggar hackas och en stor faktor är den sårbarhet som identifierades i TimThumb. TimThumb var inbakad i mängder plugins och teman som inte uppdateras.

Första tecknet på att din blogg hackats kan vara något av följande:

  • Din blogg försvinner från Googles-index. Dvs söker du efter din blogg så dyker den inte upp
  • Någon kontaktar dig gällande viagra eller liknande som din blogg länkar till
  • Du hittar nya filer eller så försvinner filer från din WordPress-installation

Det du måste göra när din blogg hackats är att börja om från början och försöka lista ut hur angriparna tog sig in. Så först och främst måste du se till att du har en backup av både filsystemet och databasen.

Om du har kontroll över underliggande operativsystem så bör du även installera om det då angriparna kan ha tagit sig in i operativsystemet. Att installera om och konfigurera operativsystemet är oftast krävande och tar lång tid.

Ominstallation av WordPress

Börja med att göra en ny installation av WordPress och läs sedan tillbaka databasen, ändra lösenord och titta så att inga nya konton dykt upp i WordPress. Innan du börjar med din nya installation av WordPress måste du se till att det är helt tomt på ditt konto, inga .htaccess-filer som kan vara dolda exempelvis då det finns exempel då angripare placerat bakdörrar i dessa. Om du känner dig osäker gällande dessa steg så bör du anlita eller fråga någon som kan WordPress bra.

Installera alla plugins som du behöver och gå manuellt igenom samtliga och undersök huruvida det har identifierats några sårbarheter i dem på sistone. Secunia har en söktjänst där du kan söka på pluginnamn.

Om du har ett egenutvecklat tema (theme) och vill återställa detta från din backup så bör du gå igenom samtliga .PHP-filer för att säkerställa att ingen bakdörr har tagit sig in.

Det finns även exempel då bloggar hackats genom delade miljöer på webbhotell, då hjälper det inte så mycket att du gör en nyinstallation om inte webbhotellet vidtar åtgärder. Överväg även möjligheterna att angriparen tagit sig in med ditt FTP-konto eller dylikt genom att testa vanliga lösenord eller läckta lösenord från exempelvis BloggToppen.

För att säkerställa att det just inte var TimThumb som används för intrång mot din blogg så kan du installera ett plugin som söker igenom efter den kod som TimTumb använder sig av. Här kan du ladda hem TimThumb vulnerability scanner:

Vidare läsning

Du bör även läsa WordPress FAQ gällande hackade WordPress-bloggar.

Detta blogginlägg kommer att uppdateras löpande med nya tips. Om du är intresserad av WordPress och säkerhet så bör du även läsa mitt inlägg om hur säkert WordPress är.

Nikke Lindqvist skrev även om hur viagra-spammare tar sig in i bloggar mer och mer här.

Dödar gamla buggar på bloggnätverket

I går så fixade jag en fem år gammal bugg som gjorde att cachningen på min sajt BloggVärde fungerade suboptimalt. Felet bestod i att jag använde en sekundräknare som uppdaterades i en SQL-fråga mot databasen.

Dock så cachar jag genom memcache och en md5-summa som beräknas på SQL-frågan, eftersom SQL-frågan blev ny varje sekund så cachades bara frågorna i en sekund. Det sänker förvisso belastningen till SQL-servern lite men när jag hade fixat buggen så gick sajten flera sekunder snabbare.

Jag har även flyttat över BloggNytt till molnet aka Amazon EC2 och håller på att flytta mer av mitt bloggnätverk från 2007.

Du glömmer väl inte att lägga till ping.bloggnytt.se i din lista över XML-RPC tjänster som du pingar från WordPress? Du lägger in http://ping.bloggnytt.se under Inställningar->Skrivinställningar och Uppdateringstjänster.

 

Hur säkert är WordPress?

En fråga som uppkommer relativt ofta är: Hur säkert är WordPress? Och för att svara på den frågan så finns det ett antal faktorer som jag anser intressanta att titta på och dessa inkluderar men begränsas ej till följande:

  • Ålder – Hur gammal är mjukvaran, om mjukvaran funnits 10 år eller några månader kan vara en faktor för nyare mjukvaror har troligtvis ej genomgått samma granskning (antalet ögon som tittat på koden).
  • Track record – Har det tidigare identifierats sårbarheter? Använd Secunia.
  • Öppen vs. stängd källkod – Jag litar mer på öppen källkod än stängd.
  • Kompetens hos utvecklare – Svårt att avgöra.
  • Kodstandard – Fulkod vs. finkod. Koden i WordPress är bra, dock ej supermycket kommenterad.
  • Uppdateringar – Sker det det några uppdateringar? Om koden senast uppdaterades 2005 så finns det med större sannolikhet brister. WordPress har ett bra system för uppgradering, glöm dock inte att uppdatera.
  • Installationsbas – Hur många använder systemet? Troligtvis har fler testat systemet om fler använder det. 14.7 percent of the top million websites in the world use WordPress.
  • Säkerhetsfunktioner och säkerhetsuppdateringar – Kommer det säkerhetsuppdateringar? Finns det några säkerhetshöjande funktioner i systemet. Här finns ett antal såsom slumpmässig nonce och HttpOnly cookies.
  • Komplexitet i systemet och antal rader kod.
Tittar man på ovan lista så ligger WordPress mycket bra till förutom sista punkten (men allt är ju relativt vad man jämför med). Men du bör även anamma lökprincipen:
 - Säkerhet skall likt löken byggas i flera lager, inte som en kedja. Faller ett lager finns det andra säkerhetsmekanismer som fortsätter skydda systemet. Källa
Så därför bör du även tänka på följande saker för att göra WordPress-säkrare:
  • Använd ej samma lösenord till WordPress som till övriga sajter/system.
  • Undvik kopplingar från WordPress-server till andra system. Använd gärna en molntjänst (ej delad db etc) som är frikopplad från övriga verksamhetssystem.
  • Undvik plugins – Om du vill använda plugins använd exempelvis enbart de som ingår i JetPack.me. Du kan även använda listan ovan för plugins, se till att de är uppdaterade exempelvis.
  • Använd https vid administration samt SCP eller motsvarande vid överföring av filer. Lägg till define('FORCE_SSL_ADMIN', true); i wp-config.php
  • Läs Hardening WordPress.
  • Uppdatera, uppdatera, uppdatera löpande både WordPress och underliggande operativsystem samt andra relaterade mjukvaror (exempelvis MySQL).
  • Säkra upp underliggande operativsystem samt databas. Minimera de privilegier som WordPress kan göra i MySQL.
  • Är personen som sätter upp WordPress och underliggande system kompetent?
  • Använd ett bra lösenord, byt namn på admin-kontot osv.
  • Teman (themes) kan även innehålla sårbarheter, se till att de också är uppdaterade och radera sådant du inte använder.
  • Håll koll på omvärlden – Din RSS-läsare bör minst innehålla WordPress.org News som uppdateras om någon allvarlig brist identifieras. Kan även rekommendera Sucuri-bloggen.
Nåväl, detta gav förhoppningsvis en liten insyn på några tänkvärda saker när det gäller WordPress och dess säkerhet. Lämna gärna en kommentar med det du tycker är viktigt eller om det är något jag har glömt.

WordPress prestanda 101

Under Sweden Social Web Camp så försökte jag på kort under en session tid förklara hur man kan analysera och hitta flaskhalsar i WordPress gällande prestanda. Så därför försökte jag här sammanfatta det jag pratade om på några rader.

Först och främst så bör du stänga av alla plugins och då se om prestandan fortfarande är dålig, för tyvärr finns det många dåliga plugins (se här då Computer Sweden intervjuade mig och Nikke, år 2009).

Okej, nästa grej att testa är att slå på något cache-plugin i form av W3 Total Cache eller WP Super Cache. Du kan även testa att ”städa upp” i databasen då många plugins lägger temporär eller onödig information i databasen (kommentera om du vet något plugin som gör detta).

Använder du ett cache-plugin så bör du även installera memcached samt titta i källkoden längst ner på sidan hur många SQL-anrop som cachas, exempelvis (skriver WP Super Cache också ut detta?):

Object Caching 730/765 objects using memcached

En annan grej man kan testa är att använda strace direkt från kommandotolken i Linux tillsammans med PHP, ungefär så här:

$ cd /min/blogg/

$ strace php index.php

Så får du lite loggrader utspottade på skärmen och om det står still länge på ett ställe så ser du exakt vad som händer på den raden. Samt så bör du även testa Xdebug så kan berätta exakt vilken rad i PHP-koden som går långsamt, tar lite tid att installera och använda.

Du kan även titta i MySQL:s slow-log som kan aktiveras på eller hittas i /etc/mysql/my.cnf (sök efter log_slow_queries).

Sist men inte minst det som jag brukar göra är att lägga upp Varnish som en front-end proxy framför Apache exempelvis, detta är en helt mer eller mindre transparent lösning. Kom även ihåg att Apache slukar massor av minne jämfört med Nginx som istället kan användas till memcached. Detta är nog det bästa tipset jag kan ge samt att testa använda ett CDN.

Sen finns det så klart mycket man kan göra på själva sidorna som WordPress spottar ut (sprites, javascript etc), men det är utanför detta blogginlägg.

Uppdatering: Glömde skriva två saker som jag nämnde på sessionen, dels är det att använda sig av en OP-code cache typ APC eller eAccelerator samt så kan även URL-strukturen i WordPress slöa ner prestandan.

Packlista inför Sweden Socal Web Camp

Om några dagar så bär det av till Tjärö och SSWC (Sweden Social Web Camp) där det kommer att avverkas en hel del intressanta sessioner såsom Tre vinklar av WordPresss, Visualisering av stora datamängder eller Offentlig sektor som plattform eller hur bra blev det egentligen med PSI-lagen.

Men, först måste man ju packa alla viktiga saker. Här kommer min lista:

  • Tält
  • Sovsäck
  • Uppblåsbar madrass (eldriven pump)
  • Öronproppar
  • Dator inkl. laddare & mus
  • Längre skarvkabel för utomhusbruk
  • Förgreningsdosa
  • iPhone-laddare
  • Extrabatteri till iPhone
  • Ögonskydd (om det skulle ljusa nätter)
  • Toalettartiklar såsom tvål, tandborste och tandkräm inkl. necessär
  • Våtservetter
  • Pannlampa
  • Hörlurar
  • Två varma tröjor
  • 4 x av följande: Kalsonger, tshirts, sockar och shorts
  • Regnkläder + stövlar om det finns risk för regn
  • Alkohol som ej behöver vara kall, såsom 3L-vinbox inkl. plastvinglas
  • Pengar i form av kontanter samt plastkort av olika typ
  • Visitkort
  • Två par handdukar
  • Badkläder
  • Varmare byxor
  • Silvertejp (eltejp?)
  • Mobila högtalare
  • Kudde
  • Jacka
  • Solglasögon
  • Solstol som även får plats i tältet
  • Plastpåsar i varierande storlek
  • Resorb och huvudvärkstabletter eller annat med ibuprofen
  • Vattenflaska
  • Extra par skor
  • Ryggsäck eller bärsäck beroende på hur mycket plats denna packning tar
  • Datorväska
  • Fickkniv
  • Koffeintabletter
  • Vattentät påse/väska
  • Nödproviant i form av nötter av olika sort