Sunday, May 1, 2011

How to Set Up a Multisite Drupal Installation?

Multisite 10 minute Install:
  • Server: LAMP
  • SSH (telnet) Client: ssh (PuTTY if you are using Windows to access your LAMP host)
  • Must have root access to your server.
If website in question is an addon domain, i.e.,, then substitute "addon" for "www" in steps below.
For list of Linux commands visit: or
Here we go:
[login via ssh / PuTTY]

Debian (Ubuntu)

Debian and offshoot distributions (e.g. Ubuntu) make installation and configuration very easy. This was done on a Debian distribution, Ubuntu should work identically.


Assumption: apache2 and mysql are already installed. If not, use apt-get install to install and configure them.
# apt-get install drupal6
Answer the questions. This will install everything necessary to run drupal and do the basic configuration, including creating an empty database for drupal.
  • Configure database for drupal6 with dbconfig-common? [YES]
  • Database type to be used by drupal6: [mysql]
  • Password of your database's administrative user: [enter mysql root password]
  • MySQL application password for drupal6: [create a password for your drupal6 db]
  • (enter the password again for verification)
You now have a basic unconfigured Drupal6 installation using the database drupal6 and accessible at Do not use it. This is the "prototype" installation that we will use to create the sites we really want to use.


Create Site Databases

The easiest way to create databases for your sites is to use dpkg-reconfigure and answer the questions.
# dpkg-reconfigure drupal6
  • Re-install database for drupal6? [YES]
  • Database type to be used by drupal6: [mysql]
  • Connection method for MySQL database of drupal6: [unix socket]
  • Name of your database's administrative user: [root]
  • Password of your database's administrative user: [enter mysql root password]
  • username for drupal6: [ENTER YOUR DB SITE *USERNAME* HERE (e.g. mysite)]
  • database name for drupal6: [ENTER YOUR DB *SITE* NAME HERE (e.g. mysite)]
  1. Repeat the above for each site you want to support.
  2. I used the same name for the database and the site. KISS.
  3. Don't use periods (e.g. is a bad choice). If you want to spell out the whole name, use underscores instead of periods (e.g. mysite_com).
  4. The above method ends up using the same site database password for all the sites you create. Advice: use mysql-admin (or mysql) to use different passwords for each site. 

    Configure Apache2 for Sites

    Before you jump to configure your virtual hosts do not forget to add host names in /etc/hosts file.

    Apache2 needs to be configured to support vhost access to your new sites.
    Create vhost site configuration files in /etc/apache2/sites-available/
    # Virtual hosting configuration for Drupal

    ServerAdmin [your email address]

    DocumentRoot /usr/share/drupal6/
    ServerName [your vhost#1 name]
    ServerAlias [if you want to support and]
    RewriteEngine On
    RewriteOptions inherit

    ServerAdmin [your email address]

    DocumentRoot /usr/share/drupal6/
    ServerName [your vhost#2 name]
    ServerAlias [if you want to support and]
    RewriteEngine On
    RewriteOptions inherit

    [...repeat for all your vhosts]
    • Modify the above items that are in [square brackets].
    • You likely will want to support port 443 (https) as well. See Apache documentation for detailed instructions.
    • I've chosen to put all the vhosts in one file named drupal. You may want to use one file per vhost.
    Sym-link the drupal file in the sites-enabled directory to enable it in your site:
    # cd /etc/apache2/sites-enabled
    # ln -s ../sites-available/drupal .

    ...and reload Apache2 to pick up your configuration changes...
    # /etc/init.d/apache2 reload

    Create Drupal Site Configurations

    We need to create Drupal configurations for each site by copying the default configuration to the Drupal site subdirectory.
    # cd /etc/drupal/6/sites/
    # cp -a default []
    # cp -a default []

    ...and edit the configurations to use the right database, MySQL user name, and password...
    # vi
    # vi
    • Modify the above items that are in [square brackets].


    Run Drupal and Configure Your Sites

    Browse to your sites, running install.php (e.g. to configure them.



    Get to location where Drupal core will be located:
    [/]# cd /var/www
    Upload Drupal core:
    "x.x" should be replaced with the version of Drupal you're installing, e.g. "5.2"
    [/var/www]# wget
    Unpack Drupal core:
    [/var/www]# tar -zxvf drupal-5.2.tar.gz
    Move contents of Drupal core (including .htaccess) to html:
    [/var/www]# mv drupal-x.x/* drupal-x.x/.htaccess /var/www/html
    [/var/www]# rm drupal-x.x.tar.gz

    [/var/www]# rm drupal-5.2
    Create the files directory per Drupal instructions and change permissions (will change permission again after install):
    [/var/www]# cd html

    [/var/www/html]# mkdir files

    [/var/www/html]# chmod 777 files
    Make directories that will hold custom and contributes modules and themes:
    [/var/www/html]# cd sites/all

    [/var/www/html/sites/all]# mkdir modules

    [/var/www/html/sites/all]# mkdir themes

    [/var/www/html/sites/all]# cd modules

    [/var/www/html/sites/all/modules]# mkdir custom

    [/var/www/html/sites/all/modules]# mkdir contrib

    [/var/www/html/sites/all/modules]# cd ../

    [/var/www/html/sites/all]# cd themes

    [/var/www/html/sites/all/themes]# mkdir custom

    [/var/www/html/sites/all/themes]# mkdir contrib
    Create directory "":
    [/var/www/html/sites/all/themes]# cd ../

    [/var/www/html/sites/all]# cd ../

    [/var/www/html/sites]# mkdir
    Change permission of "settings.php" per Drupal instructions and copy "settings.php" in default to
    [/var/www/html/sites]# cd default

    [/var/www/html/sites/default]# chmod 777 settings.php

    [/var/www/html/sites/default]# cd ../

    [/var/www/html/sites]# cp -a default
    Create database and user with permissions:
    [/var/www/html/sites]# mysql

    mysql> CREATE DATABASE wwwexamplecom_drupal;

    mysql> GRANT ALL PRIVILEGES ON wwwwexamplecom_drupal_drupal.* TO 'wwwexamplecom_drupal_myusername'@'localhost' IDENTIFIED BY 'mypassword';
    mysql> \q
    Go back to PuTTY to chmod on settings.php in
    [/var/www/html/sites]# cd

    [/var/www/html/sites/]# chmod 755 settings.php

    [/var/www/html/sites/]# logout
    What next?:
    • Make changes to "settings.php" in I've read that it's not necessary to make changes to setting.php.
    • Make changes to "httpd.conf" in /usr/local/apache/conf?
    I've been using WHM to create accounts, putting Drupal in public_html and having no problems. But when it comes to parting from the WHM abstraction and getting multisite set-up correctly this is the end of the proverbial road for me.
    Could use help...:
    1. Help making improvements to steps articulated above
    2. Help with next steps so that I/we can get on to grander things, like creating modules, custom themes, profiles, (and maybe - just maybe - spend some time working on business strategy :-)

    Now that we have successfully setup both our multisite installations (1 & 2), we can proceed to test our installation to see how this will benefit us in the future for accomplishing tasks much quicker between sites that rely on the same code base or share similar modules & themes.
    1. Download the latest version of your favorite drupal 6 module. Here we will be using "Views".
    2. Place the "Views" module inside of your main sites drupal modules folder: multisite-main/sites/all/modules/views, this module will now be shared across all multisite installations. Same goes for any themes you setup in the /sites/all/themes folder. You may now enable it for individual sites by visiting your sites "admin/build/modules" page. (ie. http://multisite-1/multisite-main/admin/build/modules).
    3. Likewise, if you do not want to share modules/themes across sites you would create a "modules" or "themes" folder inside of your multisite-1 or multisite-2 folder, and place your site specific modules inside of them.

      1 comment: