Kategori Programmering

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.

WP Multi-Site: Aktivering av tillägg

Inledning

Stötte för någon vecka på ett nytt problem för min del. Det handlade om att jag skulle skapa ett plugin som används i multi-site. Jag har jobbat relativt lite med Multi-Sites och problemet var att tabellerna inte skapades för alla ”siterna” som fanns i nätverket.

Källkod

register_activation_hook(__FILE__, 'hass_vote_activate');
 
function hass_vote_activate() {
	global $wpdb;
 
	if (function_exists('is_multisite') && is_multisite()) {
		if (isset($_GET['networkwide']) && ($_GET['networkwide'] == 1)) {
			$old_blog = $wpdb->blogid;
 
			$blogids = $wpdb->get_col($wpdb->prepare("SELECT blog_id FROM $wpdb->blogs"));
			foreach ($blogids as $blog_id) {
				switch_to_blog($blog_id);
				_hass_vote_activate();
			}
			switch_to_blog($old_blog);
 
			return;
		}	
	} 
	_hass_vote_activate();		
}
 
function _hass_vote_activate() {
	global $wpdb;
 
	$table_name = $wpdb->prefix . 'yourtable';
 
	if ($wpdb->get_var("SHOW TABLES LIKE '$table_name'") != $table_name) {
		$sql = "CREATE TABLE " . $table_name . " (
			id mediumint(9) NOT NULL AUTO_INCREMENT,
     			dateadded bigint(11) DEFAULT '0' NOT NULL,
     			subject VARCHAR(255) NOT NULL,
	  		UNIQUE KEY id (id)
	  	);";
 
		require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
  		dbDelta($sql);
	}
}

Ovanstående kod vandrar igenom alla dina siter som är uppsatta i nätverket och kör aktiveringsfunktionen för dessa.

Koden ovan raderar inte tabellerna vid inaktivering, det skapar heller inte tabellerna för nya siter som aktiveras i nätverket. Du får i sådana fall använda följande actions:

add_action( 'wpmu_new_blog', 'your_function_activation_on_new_blog'); 		// For new site
register_deactivation_hook( __FILE__, 'your_deactivation_function' );		// For deactivation

Citerus Hackers Night 2011: Crazy Snake

Citerus anordnade i tisdags (3/5) ett event i Stockholm där uppdraget var att programmera en ormhjärna. Din ormhjärna skulle sedan tävla mot andra ormar som andra lag programmerat.

Jag, Oskar Wirén och Jim Sagevid var ett lag, vi hade inte tittat så mycket på API:t innan så vi hade ganska dålig koll på det. Tävlingen gick ganska dåligt för oss, vi slarvade alldeles för mycket och vi blev väldigt stressade. Istället så fick vi ihop en fungerande version på vägen hem på tåget på ca. 4-5 minuter…

Det lutar åt att några av de andra lagen hade lite förberett kod, då det var ganska stressigt med tid att få klar en första prototyp (~1h), eller så var de helt enkelt grymt snabba! Hade vi haft lite framförhållning så hade det nog varit en ganska smart idé, men det är alltid lätt att vara efterklok. Det var i alla fall en väldigt trevlig kväll och ett riktigt kul arrangemang!

Demonstration

Här kör vi mot ett annat lag som också kommer ifrån Uppsala, vi heter ”Team Borm” (den kör v2) och de är ”Sneaky Brian”. Vi märker tydligt att det är en del problem när båda två är väldigt nära samma frukt.

Källkod

Finns samlat på Github.

Den första versionen finns här (v1, som vi inte hann slutföra på tävlingen) och den som vi fortsatte lite på finns här (v2).

Själva path-hanteraren finns här.

Mer läsning

Lag Paxport vann Crazy Snake
Ladda Clojure-kod med java.util.ServiceLoader

© Copyright 2002 - 2012 Anders Hassis

Byggt på Notes Blog Core