Multisite-Features unter Drupal 7.x

Rudimente für ein Drupal-Deployment mit

  • Lokaler Entwicklungumgebung
  • Stage-Umgebung
  • Live / Produktionsumgebung

unter Verwendung, der in Drupal-7 neu eingeführten Multisite-Features in der Datei sites.php, Drush-Aliases
und einer speziellen settings.php,
die in diesem Fall versioniert wird.

sites.php -- Verzeichnis Aliase in Drupal 7.x

Die in Drupal 7.x neu eingeführte Datei sites.php stellt erstmalig Verzeichnis-Aliase für Drupal-Multisites zur Verfügung.

So ist es jetzt möglich mit verschiedenen Domains bzw. VirtualHosts ein bestimmtes Verzeichnis innerhalb von sites anzusprechen,
ohne über z.B. Symbolische Links zu gehen, was in vorgigen Drupal-Versionen zur Folge haben konnte, daß Datei- oder Modulpfade beim "umbiegen" von der Dev-Site example.mydomain.de auf die Live-Site example.com divergent sind.

// sites/sites.php

// (LOCAL) DEV SITE
$sites['example.localhost'] = 'example.com';

// STAGE SITES
$sites['stage-example.mydomain.de'] = 'example.com';
$sites['stage.example.com'] = 'example.com';

// LIVE SITE
$sites['example.com'] = 'example.com';

@see /path/to/drupal7/sites/example.sites.php

settings.php für DEV, STAGE und LIVE

Im folgenden Ausschnitt der settings.php werden für

  • DEV SITE
  • STAGE SITE
  • LIVE SITE

unterschiedliche Datenbanken und Vorbelegungen von Variablen definiert.

Die verschiedenen Umgebungen sind von einem Switch auf $_SERVER['HTTP_HOST'] eingeschlossen,
und es werden über den Host-Header des aktuellen Requests die entsprechenden Einstellungen genommen.

Die Verwendung des Contributed-Modules "Environment Indicator" weist optisch zusätzlich darauf hin, auf welcher Umgebung man sich gerade befindet, hierzu hat mich besonders Dirk Rüdigers Artikel zu Drush site-alias motiviert(s.u.).

// sites/default/settings.php

switch ($_SERVER['HTTP_HOST']) {
  case 'stage.example.com':
  case 'stage-example.mydomain,de':

    $conf['environment_indicator_text'] = 'STAGE SITE';
    $conf['environment_indicator_color'] = 'salmon';

    $databases = array (
      'default' =>
      array (
        'default' =>
        array (
          'database' => 'stage_db',
          'username' => 'stage_db_user',
          'password' => 'stage_db_passwd',
          'host' => 'localhost',
          'port' => '',
          'driver' => 'mysql',
          'prefix' => '',
        ),
      ),
    );
    break;

  case 'example.com':

    $conf['environment_indicator_text'] = 'LIVE SITE';
    $conf['environment_indicator_color'] = 'red';

    $databases = array (
      'default' =>
      array (
        'default' =>
        array (
          'database' => 'live_db',
          'username' => 'live_db_user',
          'password' => 'live_db_passwd',
          'host' => 'localhost',
          'port' => '',
          'driver' => 'mysql',
          'prefix' => '',
        ),
      ),
    );
    break;

  default:
    $conf['environment_indicator_text'] = 'LOCAL DEV SITE';
    $conf['environment_indicator_color'] = 'green';

    $databases = array (
      'default' =>
      array (
        'default' =>
        array (
          'database' => 'local_dev',
          'username' => 'local_dev_user',
          'password' => 'local_dev_passwd',
          'host' => 'localhost',
          'port' => '',
          'driver' => 'mysql',
          'prefix' => '',
        ),
      ),
    );
}

@see /path/to/drupal7/sites/default/default.settings.php

Drush-Aliases

In drush V. 3. wurden Site-Aliase eingeführt, dies ermöglicht, ähnlich wie bei Aliasen auf der Shell eine kurze Schreibweise für eine längere Befehlangabe.

Um explizit eine Drupal-Site und deren spezifische Einstellungen in einer Drupal-Multisite-Umgebung anzusprechen,
sind die Angabe der Drupal-Wurzel (--root=/path/to/drupal)
und der Name der Site bzw. dem Namen des Verzeichnisse in dem die jeweilige Site liegt (--uri=example.com) nötig.

Durch das folgende Snippet lassen sich die Instanzen über die Aliase

  • @dev
  • @stage
  • @stage2
  • @live

ansprechen und die Optionen --uri=example.com bzw. der kurzen Schreibweise -l example.com werden $_SERVER['HTTP_HOST'] durch drush gesetzt.

// /etc/drush/aliases.drushrc.php

$aliases['dev'] = array(
  'uri' => 'example.localhost',
  'root' => '/multi/drupal/7.x',
);

$aliases['stage'] = array(
  'uri' => 'stage-example.mydomain.de',
  'root' => '/multi/drupal/7.x',
);

$aliases['stage2'] = array(
  'parent' => '@stage',
  'uri' => 'stage.example.com',
);

$aliases['live'] = array(
  'uri' => 'example.com',
  'root' => '/multi/drupal/7.x',
);

Analog zum Host-Header des aktuellen Requests einer Web-Anfrage
wird in der obigen settings.php nun hierüber verzweigt.

@see /path/to/drush/examples/example.aliases.drushrc.php

Weiterführendes