Att köra WordPress Multi-Site på VPS med multi domain mapping

Bakgrund

Ett problem som jag haft väldigt länge är att jag kört många olika WordPress-installationer för relativt små projekt. Det är inte alls särskilt roligt att underhålla alla dessa installationer, dvs att hålla kärnan och tillägg uppdaterade. I ett tidigare projekt så skapade Tedde Lundgren ett tillägg som tillät oss att koppla flera olika domäner (inte begränsat till subdomäner) till en installation.

Jag är medveten om att det finns liknande tillägg som exempelvis WordPress MU Domain Mapping. Det som skiljde Teddes version från denna var att vi fick tillgång till gruppering av domäner, så vi kan köra separata utvecklingsdomäner. Tillägget är för övrigt en riktig lättviktare och innehåller endast det som behövs, dvs inte bloatat. Tedde har planer på att släppa tillägget öppet senare i sommar.

Screenshot Domain Mapper

 
Så förra veckan gjorde jag slag i sak och beställde en VPS hos Ipeer. Vi har använt Ipeer på många projekt hos Populate så jag visste sedan tidigare att det fungerar bra.

Mjukvara och tjänster som används

  • Nginx – Webbserver
  • Apache– Webbserver
  • PHP + APC – APC används för cachning
  • Memcached – Memcached används för cachning
  • WordPress + W3 Total Cache – Publiceringsverktyg samt W3 Total Cache för att cacha
  • Ruby + Capistrano – Capistrano är en samling Rubyscript som används för att enkelt deploya till drift/utvecklingsserver
  • Git + GitHub – Git är versionshantering av källkod, GitHub är en tjänst för att samarbeta med andra utvecklare

Webbserver

Wikipedia skriver följande angående Nginx:

Nginx quickly delivers static content with efficient use of system resources. It can deploy dynamic HTTP content on a network using FastCGI handlers for scripts, and can serve as a very capable software load balancer.[2]

Med detta som grund så valde jag att använda Nginx som webbserver (@port 80) för att servera allt statiskt material (JavaScript, CSS och bilder), för att sedan proxy:a alla andra anrop vidare till Apache (@port 81).

Cachning och WordPress

Genom att använda Memcached, APC i kombination med W3 Total Cache så har jag fått ner laddningstiden i WordPress oerhört mycket. Ett problem som jag tyvärr upplever för tillfället är att administrationen i WordPress 3.1.3 är väldigt trög, det verkar vara ett känt problem som många inte upplevde i 3.0.x-branchen. Vi får se ifall det fixas i 3.2 som borde lanseras inom en snar framtid.

GitHub och Capistrano

Versionshantera, snälla! Även ifall du är den enda i projektet… På GitHub har jag samlat all kod jag använder i mina projekt. Jag har ett betalkonto som tillåter mig att ha 10 privata repositories och en medarbetare på dessa. All utveckling sker lokalt (på exempelvis http://hassis.dev) och när jag är nöjd så laddar jag upp på GitHub och den jag arbetar med laddar ner det lokalt och tittar över det. När vi sedan är överens om att det går att släppa publikt så kör vi ut allt genom Capistrano.

Capistrano förutsätter att man har tillgång till SSH och använder sig av publika nycklar för att autentisera sig mot servern.

Slutsats

Detta är tänkt som en genomgång vad jag använder för verktyg när jag utvecklar. Vill ni se lite exempel på källkod så får ni gärna säga till.

Virtuell utvecklingsmiljö med VirtualBox

Ett av problemen jag haft under längre tid har varit att jag trivs alldeles för bra att utveckla med min MacBook. Detta för att det är så mycket enklare att manövrera i operativsystemet mha terminalen, samt att det är så smidigt att använda Git, Ruby, Sass etc. you name it.

Jag försökte för någon månad sedan att åstadkomma en liknande miljö med VirtualBox och Ubuntu, det gick åt pipan. Igår kväll så började jag nysta i det igen och fick faktiskt fart på det hela!

Mitt mål

  • Sätta upp VirtualBox
  • Installera Ubuntu
  • Använda Ubuntu som utvecklingsserver och dela kataloger mha Samba
  • Kunna SSH:a till denna genom att denna får ett internt ip samt att den ska ha internetåtkomst
  • Sätta upp Git tillsammans med mitt Github-konto
  • Installera RVM och Rails, Padrino etc.

Sätta upp VirtualBox och installera Ubuntu

Ladda ner VirtualBox och installera Ubuntu (jag valde desktop edition). Jag har en trådad uppkoppling så jag sätter min trådade anslutning som delad och noterar vilket IP denna får (192.168.56.1). Det bör även finnas en “VirtualBox Host-Only Network”-adapter i dina nätverksanslutningar, det är denna som ska ha fått ett IP som ex. 192.168.56.1.

Gå in i inställningarna för VirtualBox och Ubuntu och sätt upp två anslutningar, en för NAT och en för “Endast värd-kort” (host-only-adapter). Ändra i din fil /etc/network/interfaces till detta:

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp

auto eth1
iface eth1 inet dhcp

Kör ifconfig -a och kontrollera så att du har två olika IP:n på din eth0 (min är 10.0.2.15) och eth1 (min är 192.168.56.101).

Har du fått till detta så kan du förhoppningsvis SSH:a till maskinen (förutsatt att du installerat en ssh-daemon)!

Sätta upp delning av kataloger

(Källa: Ubuntu Forums – HOWTO: Mounting SMB Shares)
Härligt, du har en fungerande Ubuntu som du nu kan starta upp och gömma i bakgrunden och sköta genom ex Putty. Eftersom jag fortfarande kommer sköta själva programmeringen i Windows-miljön så kommer jag vilja ha en katalog som är delad mellan Ubuntu och Windows. Jag skapade en katalog på Windows-datorn som jag kallade för VirtualUbuntu som jag satte som delad, sedan skapade jag en katalog på Ubuntu som jag planerar att montera denna nätverkskatalog i.

sudo mount -t cifs //192.168.56.1/VirtualUbuntu /home/mittusername/VirtualWin -o iocharset=utf8,username=mittanvandarnamn,password=mittlosenord,file_mode=0777,dir_mode=0777

Detta monterar katalogen, nu vill jag att den ska monteras varje gång jag startar upp min virtuella Ubuntu. Så gå in i /etc/fstab och ange något liknande i slutet:

//192.168.56.1/VirtualUbuntu /home/mittusername/VirtualWin   smbfs  auto,credentials=/root/.credentials,uid=1000,umask=000,user   0 0

Jag har även skapat en fil i /root/.credentials för att hålla mina uppgifter med följande innehåll:

username=your_smb_username
password=your_smb_password

Sätt sedan rättigheterna på den filen med:

sudo chmod 600 /root/.credentials

När du sedan startar om Ubuntu kan du enkelt montera med:

sudo mount -a

Sätt upp Git + Github

Installera Git med

sudo apt-get install git-core

Följ sedan guiden på Githubs hemsida om Linux-installationen.

Installera Ruby med RVM

För att kunna ha möjligheten att köra flera olika Ruby-versioner (väldigt behändigt!) och framförallt hålla dessa separerade så använder jag RVM – http://rvm.beginrescueend.com. Detta kan du installera genom att följa instruktionerna på http://rvm.beginrescueend.com/rvm/install/.

Några vettiga kommandon med exempel är:

  • rvm install ruby-1.9.2-p0 (installera 1.9.2 via RVM)
  • rvm list (listar Ruby-variationer, indikerar även vilken som är aktiv)
  • rvm use ruby-1.9.2-p0 (välj den specifika Ruby)
  • rvm package install zlib (mer om detta i nästa stycke)

Installera Rails

Jag valde att köra Ruby 1.9.2 via RVM och då stötte jag på patrull i form av gnäll på att jag inte hade zlib och openssl, en snabb sökning gav följande resultat:

Följer du dessa instruktioner så borde det gå bra att få in Rails.

Summan av kardemumman

Detta är skrivet som en liten “kom ihåg”-post till mig själv inför nästa gång jag ska genomföra detta, förhoppningsvis har någon annan nytta av det också! Lycka till!