Installation and configuration

Here is a guide for installing and configuring a Drupal site. This guide includes extensive How-to's for using all core modules and installing themes. It also includes a guide for end users, the people who visit a Drupal site.

Note: Feel free to add handbook pages relevant to this section.

System requirements

  1. A Web Server that can execute PHP scripts
  2. Recommended: Apache.

    • Drupal will work on Apache 1.3 or Apache 2.x hosted on Unices or Windows. The majority of Drupal development is done using Apache so there is more community experience and testing performed. Optional: You can use the Apache extension mod_rewrite to allow for clean urls.

    Optional: IIS

    • Drupal core will work using IIS5 or IIS6 if PHP is configured correctly. You will need to use a third party solution to achieve Clean URLs. In view of Microsoft's support life cycle it is suggested you use IIS6.
    • To achieve clean_url's you will need to use a third party product.

    Drupal is being developed to be web server independent but we have limited or no reports of successful use on web servers not listed here.

  3. PHP
  4. Drupal 4.7 and above require PHP version 4.3.3 or higher. PHP 5.2 is a special case; only Drupal 4.7.5 (and greater) and 5.0 (and greater) run on PHP 5.2, older Drupal versions do not. We recommend using the latest version of PHP 4.x. or 5.x for security and future compatibility.

    • PHP memory of approximately 8MB for a Drupal core installation. In reality you will probably need to use a higher setting depending on your site and contributed modules you are using. A good starting point is 16-24 MB.
    • PHP XML extension (for blogapi, drupal, and ping modules). This extension is enabled by default in a standard PHP installation; the windows version of PHP has built-in support for this extension.
    • PHP needs the following configuration directives for Drupal to work (only directives that differ from the default php.ini-dist / php.ini-recommended):
    • Some of these settings are contained in the default .htaccess file that ships with Drupal, so you shouldn't need to set them explicitly. Note, however, that setting PHP configuration options from .htaccess only works:
      • with Apache (or a compatible web server),
      • if the .htaccess file is actually read, i.e. AllowOverride is not None,
      • if PHP is installed as an Apache module.
    • See the PHP manual for how to change configuration settings for other interfaces to PHP.
  5. A PHP-supported Database Server
  6. Recommended: MySQL 4.1 or MySQL 5.0.

    • Drupal will work on v3.23.17 and 4.0 but it is strongly suggested you use 4.1 or 5.0 for future compatibility with Drupal 6 which will drop support for older versions of MySQL.
    • NOTE: Drupal makes use of some features not available on some inexpensive hosting plans so please check that your host allows database accounts with the following rights:

      SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES

    • Note: If your system/host is running MySQL 4.1 or newer and you receive the error "Client does not support authentication protocol requested by server", address the problem by following the instructions provided by MySQL AB. There is a minor OS issue with some MySQL 5+ installations primarily on Windows but affecting some Unices as well.

    PostgreSQL, version 7.3 or newer.

    • Note, some of the contributed modules are not as abstracted from MySQL specific code as everyone would like. If you are familiar with PostgreSQL please file issues with those contributed modules as you find them.

    Currently MS SQL and Oracle are not supported but various efforts are underway to supply schemas. Please see discussions in the Enterprise Group if you are interested in working on this.

Client System Requirements

Drupal aims to conform with internet standards and deviate where necessary to comply with popular clients that are not standards compliant.

Javascript

For the Javascript, we currently test for all required API features (DOM APIs) and based on that, enabled or disable all JS functionality. That way, we don't care about particular browsers, only what they support.

CSS

For CSS, the situation is quite similar to Javascript. The only difference is that here there is a strong difference between the standard compliant browsers and Internet Explorer. We can use CSS2 where needed and provide IE6 workarounds if necessary.

RSS

Drupal RSS feeds should work with any RSS feed reader. (note: could use more information).

Browser Specifics

In practice, this means that IE6, FF1.0/1.5, Opera 8-9 and Safari 1.x/2.0 get the whole experience. Konqueror should work if it's the latest version.

Browser Popularity

The general net usage is 85% IE, 10% Ffox, 3% Safari, 2% Opera or so. For Drupal.org, it is 50% Ffox/Moz, 30% IE, 20% other.

Known Problems

IE5 and IE5.5 will experience some layout issues. IE5.0 will not do any Javascript. We can assume that for Firefox and Opera, the users have a high chance of running the latest version.

IE4 and NS4, we no longer care about because they are no longer maintained and they are not in widespread use.

Validation

Drupal HTML and RSS should validate using the W3C Markup Validation Service.

Caveats

These guidelines are the guide for Drupal core, modules, and themes but are not always completely accurate. In practice, Drupal Core is expected to follow these standards more closely than various contributed pieces of code. If you find a problem with client compatability that deviates from the above client support guidelines, please try to find the root of the problem and submit an issue ideally including a patch to fix the problem.

HOWTO: Server requirement recommendations for your consulting clients

When thinking about the server hardware for a Drupal site, there are two important questions to ask:

1. Which modules are you going to use? Certain modules require more server power than others, but generally speaking more modules means more server requirements.

2. How many users will you have and what will they be doing? More users means more of a demand on the server, but especially if these users login and make comments or nodes you will need a more powerful server.

You need to consider these two answers together. For example, you could have a highly complex site with very few users and be able to use a shared hosting environment. You could also use very few modules, only have one editor, use the cache, and have reasonable traffic on a shared environment.

If your project is a more interactive environment with more users logging in and posting to the site you will need to consider more powerful hardware. As you move out of a shared environment there are other options available to you like using the methods described in the handbook to Tune Your Server for optimal Drupal performance. Tuning the server may allow you to continue using the same hardware and not upgrade, but it comes at the cost of time which can be more expensive than simply buying new hardware.

When deciding which parts of your server to upgrade, remember that "Apache is bandwidth limited, PHP is CPU limited, and MySQL is memory limited and disk I/O bound".

Message to the Client

It's probably best to give the message to the client of a "recommended" installation and a level below that in case their budget is limited and a level above that to provide for future growth with purchasing new hardware and services.

If you are rolling out a new service (as opposed to installing Drupal in place of an existing solution) keep an eye towards a solid upgrade path. You can purchase a single server with the intent of upgrading as your site grows. For example, start with the web server and database on one server that is optimized for web serving. As the site grows in popularity and you need to handle more users you can then move the database to it's own server separate from the web server. If your site grows beyond a two server "web server" and "database server" configuration then you can consider using a single web server and multiple database servers in a cluster.

Benchmark

One benchmark of a server is MBR.org which required serious intervention for optimisation at roughly the 2m pages per month mark, on a server running Apache1.3 and MySQL 4.1 with 1GB of memory. MySQL indexing, database memory use tweaks and abandoning MyISAM for InnoDB brought it under control - the jury's out on using persistent connections.

There is a need for more case studies like this to be documented on this handbook page

What Drupal.org runs on

As of April 2007 (and for a long time before that) Drupal.org has been running on a group of 3 servers. For details on those servers see Dries post about the "future" drupal.org hardware as it was being delivered.

Requirements - older versions

  1. A Web Server that can execute PHP scripts
    • Recommended: Apache. Development is done with version 1.3.x. Successfully tested with version 2.0.x.
    • Optional: IIS. Drupal is being developed with IIS compatibility in mind, and IIS5 and IIS6 work with a correctly configured PHP setup.
  2. PHP
    • As of Drupal 4.6, the CMS requires PHP version 4.3.3+ (PHP 5 is supported for the 4.6 release). Drupal 4.2 to 4.5.2 inclusive require PHP version 4.1+. Older versions of Drupal will run on PHP 4.0.6+. We recommend using the latest version of PHP 4.x.
    • PHP XML extension (for blogapi, drupal, and ping modules). This extension is enabled by default in a standard PHP installation; the windows version of PHP has built-in support for this extension.
    • PHP memory of 8MB for a Drupal core install. If you install additional contributed modules you may need to raise your php allowed memory. Prepackaged Drupal distributions such as CivicSpace may have higher PHP memory requirements then a Drupal core install.
  • PHP needs the following configuration directives for drupal to work:
  • These settings are contained in the default .htaccess file that ships with Drupal, so you shouldn't need to set them explicitly. Note, however, that setting PHP configuration options from .htaccess only works:
    • with Apache (or a compatible web server),
    • if the .htaccess file is actually read, i.e. AllowOverride is not None,
    • if PHP is installed as an Apache module.
  • See here for how to change configuration settings for other interfaces to PHP.
  • Using a PEAR-supported Database (see below) requires (of course) PEAR to be installed.
  • A PHP-supported Database Server
    • Recommended: MySQL, v3.23.17 or newer (for our use of INNER JOIN's with join_condition's). MySQL 4 is fine.
    • Drupal makes use of features not available on some inexpensive hosting plans, like LOCK TABLE
    • Working well since 4.7: PostgreSQL, version 7.3 or newer (7.2 will probably work too, but you'll get some errors when updating from 4.6). Experiences with other databases are greatly welcome.

    Note: If your system/host is running MySQL 4.1 or newer, a link in the troubleshooting section (http://drupal.org/node/35226) points to this page, which has some helpful info on addressing this problem with PHP 4.x and PHP5. There is a minor OS issue with some MySQL 5+ installations primarily on Windows but affecting some *nix installs as well.

    Also, xTemplate (the default theme engine for Drupal 4.6.x and previous) is reported to have issues with PHP 5.0.5 and 5.1. Converting your themes to the phpTemplate engine (default in 4.7) will work around this issue.

Installing Drupal, modules and themes

Installing Drupal, new modules and themes uses roughly the same process so once you are familiar with it you can repeat as needed.

After you successfully install Drupal, you will want to perform some basic site configuration starting with the settings menu.

Installing and configuring your site is only part of your responsibilities. You must remember to backup, test and maintain it as well. Please stop by the Best Practices section for some important tips on this and sign up for the security newsletter

Installing Drupal

This page is autogenerated from the current development text in CVS. See the various other provided instructions linked in the menu on the left for additional environments.
// $Id: INSTALL.txt,v 1.39 2007/01/08 11:59:16 dries Exp $

CONTENTS OF THIS FILE
---------------------

* Changes
* Requirements
* Optional requirements
* Installation
* Drupal administration
* Customizing your theme(s)
* Multisite Configuration
* More Information

CHANGES
-------

As of Drupal 5.0 installation has been automated by an install script. It is no
longer necessary to manually edit the "settings.php" file, and database tables
are created automatically.

REQUIREMENTS
------------

Drupal requires a web server, PHP4 (4.3.3 or greater) or PHP5
(http://www.php.net/) and either MySQL (http://www.mysql.com/) or PostgreSQL
(http://www.postgresql.org/). The Apache web server and MySQL database are
recommended; other web server and database combinations such as IIS and
PostgreSQL have been tested to a lesser extent. When using MySQL, version 4.1
or greater is recommended to assure you can safely transfer the database.

For more detailed information about Drupal requirements, see "Requirements"
(http://drupal.org/requirements) in the Drupal Handbook.

Guidelines for setting up a server environment with a variety of operating
systems and in special cases are available in the Drupal handbook
(http://drupal.org/node/260)

OPTIONAL REQUIREMENTS
---------------------

- To use XML-based services such as the Blogger API, Jabber, and RSS
syndication, you will need PHP's XML extension. This extension is enabled by
default.

- If you want support for clean URLs, you'll need mod_rewrite and the ability
to use local .htaccess files.

INSTALLATION
------------

1. DOWNLOAD DRUPAL

   You can obtain the latest Drupal release from http://drupal.org/. The files
   are in .tar.gz format and can be extracted using most compression tools. On a
   typical Unix command line, use:

     wget http://drupal.org/files/projects/drupal-x.x.tar.gz
     tar -zxvf drupal-x.x.tar.gz

   This will create a new directory drupal-x.x/ containing all Drupal files
   and directories. Move the contents of that directory into a directory within
   your web server's document root or your public HTML directory:

     mv drupal-x.x/* drupal-x.x/.htaccess /var/www/html

2. CREATE THE DRUPAL DATABASE

   Drupal requires access to a database in order to be installed. Your database
   user will need sufficient privileges to run Drupal. Additional information
   about privileges, and instructions to create a database using the command
   line are available in INSTALL.mysql.txt (for MySQL) or INSTALL.pgsql.txt
   (for PostgreSQL).

   To create a database using PHPMyAdmin or a web-based control panel consult
   the documentation or ask your webhost service provider.

   Take note of the username, password, database name and hostname as you
   create the database. You will enter these items in the install script.

3. RUN THE INSTALL SCRIPT

   The install script will set the base URL, connect Drupal to the database, and
   create tables in the database.

   To run the install script point your browser to the base url of your website
   (i.e. http://www.example.com). You will be presented with the "Database
   Configuration" page.

   The install script will attempt to write-protect the settings.php after
   updating it with the information you provide in the installation routine.
   If you make manual changes to that file later, be sure to protect it again
   after making your modifications. Failure to remove write permissions to
   that file is a security risk. The default location for the settings.php
   file is at sites/default/settings.php, but it may be in another location
   if you use the multi-site setup, as explained below.

4. CONFIGURE DRUPAL

   When the install script succeeds, you will be directed to the "Welcome" page.
   In "step one" click "create the first account" which will become the main
   administrator account with total control. Login as the administrator and
   complete the initial configuration steps on the "Welcome" page.

   Consider creating a "files" subdirectory in your Drupal installation
   directory. This subdirectory stores files such as custom logos, user avatars,
   and other media associated with your new site. The sub-directory requires
   "read and write" permission by the Drupal server process. You can change
   the name of this subdirectory at "administer > site configuration > file
   system".

5. CRON TASKS

   Many Drupal modules (such as the search functionality) have periodic tasks
   that must be triggered by a cron job. To activate these tasks, call the cron
   page by visiting http://www.example.com/cron.php --this will pass control to
   the modules and the modules will decide if and what they must do.

   Most systems support the crontab utility for scheduling tasks like this. The
   following example crontab line will activate the cron tasks automatically on
   the hour:

   0   *   *   *   *   wget -O - -q http://www.example.com/cron.php
   More information about the cron scripts are available in the admin help pages
   and in the Drupal handbook at drupal.org. Example scripts can be found in the
   scripts/ directory.

DRUPAL ADMINISTRATION
---------------------

A new installation of Drupal defaults to a very basic configuration with only a
few active modules and minimal user access rights.

Use your administration panel to enable and configure services. For example:

General Settings       administer > site configuration > site information
Enable Modules         administer > site configuration > modules
Set User Permissions   administer > users management > access control
Configure Themes       administer > site building > themes

For more information on configuration options, read the instructions which
accompany the different configuration settings and consult the various help
pages available in the administration panel.

Community-contributed modules and themes are available at http://drupal.org/.
CUSTOMIZING
YOUR THEME(S)
-------------------------

Now that your installation is running, you will want to customize the look of
your site. Several sample themes are included and more can be downloaded from
drupal.org.

Simple customization of your theme can be done using only CSS. Further changes
require understanding the phptemplate engine that is now part of Drupal. See
http://drupal.org/handbook/customization to find out more.

MULTISITE CONFIGURATION
-----------------------

A single Drupal installation can host several Drupal-powered sites, each with
its own individual configuration.

Additional site configurations are created in subdirectories within the 'sites'
directory. Each subdirectory must have a 'settings.php' file which specifies the
configuration settings. The easiest way to create additional sites is to copy
the 'default' directory and modify the 'settings.php' file as appropriate. The
new directory name is constructed from the site's URL. The configuration for
www.example.com could be in 'sites/example.com/settings.php' (note that 'www.'
should be omitted if users can access your site at http://example.com/).

Sites do not have to have a different domain. You can also use subdomains and
subdirectories for Drupal sites. For example, example.com, sub.example.com,
and sub.example.com/site3 can all be defined as independent Drupal sites. The
setup for a configuration such as this would look like the following:

  sites/default/settings.php
  sites/example.com/settings.php
  sites/sub.example.com/settings.php
  sites/sub.example.com.site3/settings.php

When searching for a site configuration (for example www.sub.example.com/site3),
Drupal will search for configuration files in the following order, using the
first configuration it finds:

  sites/www.sub.example.com.site3/settings.php
  sites/sub.example.com.site3/settings.php
  sites/example.com.site3/settings.php
  sites/www.sub.example.com/settings.php
  sites/sub.example.com/settings.php
  sites/example.com/settings.php
  sites/default/settings.php

If you are installing on a non-standard port, the port number is treated as the
deepest subdomain. For example: http://www.example.com:8080/ could be loaded
from sites/8080.www.example.com/. The port number will be removed according to
the pattern above if no port-specific configuration is found, just like a real
subdomain.

Each site configuration can have its own site-specific modules and themes in
addition to those installed in the standard 'modules'and 'themes' directories.
To use site-specific modules or themes, simply create a 'modules' or 'themes'
directory within the site configuration directory. For example, if
sub.example.com has a custom theme and a custom module that should not be
accessible to other sites, the setup would look like this:

  sites/sub.example.com/:
  settings.php
  themes/custom_theme
  modules/custom_module

NOTE: for more information about multiple virtual hosts or the configuration
settings, consult the Drupal handbook at drupal.org.

MORE INFORMATION
----------------

For platform specific configuration issues and other installation and
administration assistance, please consult the Drupal handbook at
http://drupal.org/handbook. You can view the wide range of other support options
available at http://drupal.org/support.

Formatted Drupal 5.x Installation instructions for better readability

Installation

// $Id: INSTALL.txt,v 1.39 2007/01/08 11:59:16 dries Exp $

Table of Contents

  1. Changes
  2. Requirements
  3. Optional requirements
  4. Installation
  5. Drupal administration
  6. Customizing your theme(s)
  7. Multisite Configuration
  8. More Information
Changes

As of Drupal 5.0 installation has been automated by an install script. It is no longer necessary to manually edit the "settings.php" file, and database tables are created automatically.

Requirements

Drupal requires a web server, PHP4 (4.3.3 or greater) or PHP5 (http://www.php.net/) and either MySQL (http://www.mysql.com/) or PostgreSQL (http://www.postgresql.org/). The Apache web server and MySQL database are recommended; other web server and database combinations such as IIS and PostgreSQL have been tested to a lesser extent. When using MySQL, version 4.1 or greater is recommended to assure you can safely transfer the database.

For more detailed information about Drupal requirements, see "Requirements" (http://drupal.org/requirements) in the Drupal Handbook.

Guidelines for setting up a server environment with a variety of operating systems and in special cases are available in the Drupal handbook (http://drupal.org/node/260)

Optional Requirements

- To use XML-based services such as the Blogger API, Jabber, and RSS syndication, you will need PHP's XML extension. This extension is enabled by default.

- If you want support for clean URLs, you'll need mod_rewrite and the ability to use local .htaccess files.

Installation

1. Download Drupal

You can obtain the latest Drupal release from http://drupal.org/. The files are in .tar.gz format and can be extracted using most compression tools. On a typical Unix command line, use:

     wget http://drupal.org/files/projects/drupal-x.x.tar.gz
     tar -zxvf drupal-x.x.tar.gz

This will create a new directory drupal-x.x/ containing all Drupal files and directories. Move the contents of that directory into a directory within your web server's document root or your public HTML directory:

     mv drupal-x.x/* drupal-x.x/.htaccess /var/www/html 

2. Create the Drupal database

Drupal requires access to a database in order to be installed. Your database user will need sufficient privileges to run Drupal. Additional information about privileges, and instructions to create a database using the command line are available in INSTALL.mysql.txt (for MySQL) or INSTALL.pgsql.txt (for PostgreSQL).

To create a database using PHPMyAdmin or a web-based control panel consult the documentation or ask your webhost service provider.

Take note of the username, password, database name and hostname as you create the database. You will enter these items in the install script.

3. Run the install script

The install script will set the base URL, connect Drupal to the database, and create tables in the database.

To run the install script point your browser to the base url of your website (i.e. http://www.example.com). You will be presented with the "Database Configuration" page.

The install script will attempt to write-protect the settings.php after updating it with the information you provide in the installation routine. If you make manual changes to that file later, be sure to protect it again after making your modifications. Failure to remove write permissions to that file is a security risk. The default location for the settings.php file is at sites/default/settings.php, but it may be in another location if you use the multi-site setup, as explained below.

4. Configure Drupal

When the install script succeeds, you will be directed to the "Welcome" page. In "step one" click "create the first account" which will become the main administrator account with total control. Login as the administrator and complete the initial configuration steps on the "Welcome" page.

Consider creating a "files" subdirectory in your Drupal installation directory. This subdirectory stores files such as custom logos, user avatars, and other media associated with your new site. The sub-directory requires "read and write" permission by the Drupal server process. You can change the name of this subdirectory at "administer > site configuration > file system".

5. Cron Tasks

Many Drupal modules (such as the search functionality) have periodic tasks that must be triggered by a cron job. To activate these tasks, call the cron page by visiting http://www.example.com/cron.php --this will pass control to the modules and the modules will decide if and what they must do.

Most systems support the crontab utility for scheduling tasks like this. The following example crontab line will activate the cron tasks automatically on the hour:

   0   *   *   *   *   wget -O - -q http://www.example.com/cron.php 

More information about the cron scripts are available in the admin help pages and in the Drupal handbook at drupal.org. Example scripts can be found in the scripts/ directory.

Drupal Administration

A new installation of Drupal defaults to a very basic configuration with only aw active modules and minimal user access rights.

Use your administration panel to enable and configure services. For example:

General Settings     administer > site configuration > site information
Enable Modules     administer > site configuration > modules
Set User Permissions     administer > users management > access control
Configure Themes     administer > site building > themes

For more information on configuration options, read the instructions which accompany the different configuration settings and consult the various help pages available in the administration panel.

Community-contributed modules and themes are available at http://drupal.org/.

Customizing your theme(s)

Now that your installation is running, you will want to customize the look of your site. Several sample themes are included and more can be downloaded from drupal.org.

Simple customization of your theme can be done using only CSS. Further changes require understanding the phptemplate engine that is now part of Drupal. See http://drupal.org/handbook/customization to find out more.

Multi-site configuration

A single Drupal installation can host several Drupal-powered sites, each with its own individual configuration.

Additional site configurations are created in subdirectories within the 'sites' directory. Each subdirectory must have a 'settings.php' file which specifies the configuration settings. The easiest way to create additional sites is to copy the 'default' directory and modify the 'settings.php' file as appropriate. The new directory name is constructed from the site's URL. The configuration for www.example.com could be in 'sites/example.com/settings.php' (note that 'www.' should be omitted if users can access your site at http://example.com/).

Sites do not have to have a different domain. You can also use subdomains and subdirectories for Drupal sites. For example, example.com, sub.example.com, and sub.example.com/site3 can all be defined as independent Drupal sites. The setup for a configuration such as this would look like the following:

sites/default/settings.php
sites/example.com/settings.php
sites/sub.example.com/settings.php
sites/sub.example.com.site3/settings.php

When searching for a site configuration (for example www.sub.example.com/site3), Drupal will search for configuration files in the following order, using the first configuration it finds:

sites/www.sub.example.com.site3/settings.php
sites/sub.example.com.site3/settings.php
sites/example.com.site3/settings.php
sites/www.sub.example.com/settings.php
sites/sub.example.com/settings.php
sites/example.com/settings.php
sites/default/settings.php

If you are installing on a non-standard port, the port number is treated as the deepest subdomain. For example: http://www.example.com:8080/ could be loaded from sites/8080.www.example.com/. The port number will be removed according to the pattern above if no port-specific configuration is found, just like a real subdomain.

Each site configuration can have its own site-specific modules and themes in addition to those installed in the standard 'modules'and 'themes' directories. To use site-specific modules or themes, simply create a 'modules' or 'themes' directory within the site configuration directory. For example, if sub.example.com has a custom theme and a custom module that should not be accessible to other sites, the setup would look like this:

sites/sub.example.com/:
settings.php
themes/custom_theme
modules/custom_module

NOTE: for more information about multiple virtual hosts or the configuration settings, consult the Drupal handbook at drupal.org.

More Information

For platform specific configuration issues and other installation and administration assistance, please consult the Drupal handbook at http://drupal.org/handbook. You can view the wide range of other support options available at http://drupal.org/support.

Formatted Drupal 4.7.x Installation instructions for better readability

Installation

// $Id: INSTALL.txt,v 1.6 2004/11/27 11:28:55 dries Exp $

This document outlines the standard installation process.

  1. REQUIREMENTS
  2. SERVER CONFIGURATION
  3. OPTIONAL COMPONENTS
  4. INSTALLATION
  5. DRUPAL ADMINISTRATION
  6. CUSTOMIZING YOUR THEME(S)
  7. UPGRADING
  8. MORE INFORMATION

REQUIREMENTS

  1. Drupal requires a web server, PHP4 (http://www.php.net/) and either
    MySQL, PostgreSQL or a database server supported by the PHP PEAR API
    (http://pear.php.net/).
  2. To Install you will need an FTP program to upload files to the server, or shell access if you wish to install using the commands listed below; access to run database scripts directly or a tool such as PHPMyAdmin to manage a database; knowledge of how to use either FTP programs or shell access to set permissions on directories, and how to run database scripts.
  3. NOTE: The Apache web server and MySQL database are strongly recommended;
    other web server and database combinations such as IIS and PostgreSQL
    are possible but tested to a lesser extent.

SERVER CONFIGURATION

Your PHP must have the following settings:

session.save_handler     user

In addition, we recommend the following settings:

session.cache_limiter    none

These values are set in php.ini and can be overwritten in a .htaccess
file; you can print out your local PHP settings with PHP's phpinfo()
function.

OPTIONAL COMPONENTS

  • To use XML-based services such as the Blogger API, Jabber, RSS
    syndication, you will need PHP's XML extension. This extension is
    enabled by default in standard PHP4 installations.
  • If you want support for clean URLs, you'll need mod_rewrite and
    the ability to use local .htaccess files. (More information can
    be found in the Drupal handbook on drupal.org.)

INSTALLATION

1. DOWNLOAD DRUPAL

You can obtain the latest Drupal release from http://drupal.org/.
Download the current tar.gz format and extract the files:

$ wget http://drupal.org/files/project/drupal-x.x.x.tgz
     $ tar -zxvf drupal-x.x.x.tgz

This will create a new directory drupal-x.x.x/ containing all
Drupal files and directories. Move the contents of that directory
into a directory within your web server's document root or your
public HTML directory:

$ mv drupal-x.x.x/* drupal-x.x.x/.htaccess /var/www/html

2. CREATE THE DRUPAL DATABASE

These instructions are for MySQL. If you are using another database,
check the database documentation. In the following examples,
"dba_user" is an example MySQL user which has the CREATE and GRANT
privileges. You will need to use the appropriate user name for your
system.

First, you must create a new database for your Drupal site:

$ mysqladmin -u dba_user -p create drupal

MySQL will prompt for the dba_user database password and then create
the initial database files. Next you must login and set the access
database rights:

$ mysql -u dba_user -p

Again, you will be asked for the dba_user database password. At the
MySQL prompt, enter following command:

GRANT ALL PRIVILEGES ON drupal.*
        TO nobody@localhost IDENTIFIED BY 'password';

where

  • 'drupal' is the name of your database
  • 'nobody@localhost' is the userid of your webserver MySQL account
  • 'password' is the password required to log in as the MySQL user

If successful, MySQL will reply with

Query OK, 0 rows affected

to activate the new permissions you must enter the command

flush privileges;

and then enter '\q' to exit MySQL.

3. LOAD THE DRUPAL DATABASE SCHEME

Once you have a database, you must load the required tables:

$ mysql -u nobody -p drupal < database/database.mysql

4. CONNECTING DRUPAL

The default configuration can be found in the
'sites/default/settings.php' file within your Drupal installation.
Before you can run Drupal, you must set the database URL and the
base URL to the web site. Open the configuration file and edit the
$db_url line to match the database defined in the previous steps:

$db_url = "mysql://username:password@localhost/drupal";

Set $base_url to match the address to your web site:

$base_url = "http://www.example.com";

In addition, a single Drupal installation can host several
Drupal-powered sites, each with its own individual configuration.
If you don't need to run multiple Drupal sites, you can skip to the
next section.

Additional site configurations are created in subdirectories within
the 'sites' directory. Each site subdirectory must have a
'settings.php' file which specifies the configuration settings. The
easiest way to create additional sites is to copy the 'default'
directory and modify the 'settings.php' file as appropriate. The new
directory name is constructed from the site's URL. The
configuration for www.example.com could be in
'sites/example.com/settings.php' (note that 'www.' should be omitted
if users can access your site at http://example.com/).

Sites do not each have to have a different domain. You can use
subdomains and subdirectories for Drupal sites also. For example,
example.com, sub.example.com, and sub.example.com/site3 can all be
defined as independent Drupal sites. The setup for a configuration
such as this would look like the following:

     sites/default/settings.php
     sites/example.com/settings.php
     sites/sub.example.com/settings.php
     sites/sub.example.com.site3/settings.php

When searching for a site configuration (for example
www.sub.example.com/site3), Drupal will search for configuration
files in the following order, using the first configuration file it
finds:
     sites/www.sub.example.com.site3/settings.php
     sites/sub.example.com.site3/settings.php
     sites/example.com.site3/settings.php
     sites/www.sub.example.com/settings.php
     sites/sub.example.com/settings.php
     sites/example.com/settings.php
     sites/default/settings.php

Each site configuration can have its own site-specific modules and
themes that will be made available in addition to those installed
in the standard 'modules' and 'themes' directories. To use
site-specific modules or themes, simply create a 'modules' or
'themes' directory within the site configuration directory. For
example, if sub.example.dom has a custom theme and a custom module
that should not be accessible to other sites, the setup would look
like this:

     sites/sub.example.com/:
       settings.php
       themes/:
         custom_theme
       modules/:
         custom_module

NOTE: for more information about multiple virtual hosts or the
configuration settings, consult the Drupal handbook at drupal.org.

5. CONFIGURE DRUPAL

You can now launch your browser and point it to your Drupal site.

Create an account and login. The first account will automatically
become the main administrator account.

6. CRON TASKS

Many Drupal modules have periodic tasks that must be triggered by a
cron job. To activate these tasks, you must call the cron page;
this will pass control to the modules and the modules will decide
if and what they must do.

The following example crontab line will activate the cron script
on the hour:

0    *   *   *   *   wget -O - -q http://HOSTNAME/cron.php

More information about the cron scripts are available in the admin
help pages and in the Drupal handbook at drupal.org. Example
scripts can be found in the scripts/ directory.

DRUPAL ADMINISTRATION

Upon a new installation, your Drupal website defaults to a very basic
configuration with only a few active modules, one theme, and no user
access rights.

Use your administration panel to enable and configure services. For
example, set some general settings for your site with "Administration -
configuration". Enable modules via "Administration - configuration -
modules". User permissions can be set with "Administration - accounts
- permissions".

For more information on configuration options, read through the
instructions which accompany the different configuration settings and
consult the various help pages available in the administration panel.

Note that additional community-contributed modules and themes are
available at http://drupal.org/.

CUSTOMIZING YOUR THEME(S)

Now that your server is running, you will want to customize the look
of your site. Several sample themes are included in the Drupal
installation and more can be downloaded from drupal.org.

Customizing each theme depends on the theme. In general, each theme
contains a PHP file themename.theme which defines a function header()
that can be changed to reference your own logos.

Most themes also contain stylesheets or PHP configuration files to
tune the colors and layouts; check the themes/ directory for README
files describing each alternate theme.

UPGRADING

  1. Backup your database and Drupal directory - especially your
    configuration file (www.example.com.conf or includes/conf.php).
  2. Log on as the user with user ID 1.
  3. Remove all the old Drupal files then unpack the new Drupal files
    into the directory that you run Drupal from.
  4. Modify the new configuration file to make sure it has the
    correct information.
  5. Run update.php by visiting http://www.example.com/update.php.

MORE INFORMATION

For platform specific configuration issues and other installation and
administration assistance, please consult the Drupal handbook at
http://drupal.org/. You can also find support at the Drupal support forum or through the Drupal mailing lists.

10 minute install using PuTTY SSH/Telnet client

I've been developing best practices for my development company and wanted to share/collaborate on some of them.

Development environment:

Server: LAMP
SSH/Telenet Client: PuTTY
Server Interface: WHM
Must have root access.

10 minute Install:

[login root via PuTTY]

# cd /home/youraccountname

# wget http://ftp.osuosl.org/pub/drupal/files/projects/drupal-x.x.tar.gz

[Note: the "x.x" should be replaced with the version of drupal you're installing, e.g. "5.1"]

# tar -zxvf drupal-5.1.tar.gz

# mv drupal-x.x/* drupal-x.x/.htaccess /home/youraccountname/public_html

[Note: See the note above regarding "x.x"]

# rm drupal-x.x.tar.gz

# cd public_html

# mkdir files

# chmod 777 files

# cd sites/all

# mkdir modules

# mkdir themes

# cd modules

# mkdir custom

# mkdir drupal-contrib

# cd ../

# cd themes

# mkdir custom

# mkdir drupal-contrib

# cd ../

# cd ../

# cd default

# chmod 777 settings.php

# mysql

mysql> CREATE DATABASE youraccountname_drupal;

mysql> GRANT ALL PRIVILEGES ON youraccountname_drupal.* TO 'your accountname_yourusername'@'localhost' IDENTIFIED BY 'yourpassword';

mysql> \q

[open your browser. enter your site's URL, and enter database information]

[go back to PuTTY to chmod on "settings.php"]

# chmod 755 settings.php

# logout

[back to browser, refresh browser, and then "visit new site" (or whatever the link says to new website), create first "superuser" account, etc.]

How I installed Drupal: The Eightfold Way

Try this for a supereasy install.

This installation is for a test site.

The aim is to have a test site: \http://drupal.yoursite.com\

When the test site is functioning, the drupal subdomain prefix will be deleted. Therefore the domain name in the root will be mysite.com The DNS servers will automatically point to this (hopefully!). This is what worked for me:

1) Downloaded Drupal 5.0
2) Created a subdomain ("drupal") via my webhost's control panel
3) Created a database ("dbname") via my webhost's control panel (note the user name and password). Noted the hostname, e.g., testsite.yoursite.com
4) Using browser, pointed to URL \http://drupal.yoursite.com\
5) The install.php script automatically installed Drupal
6) Entered information. Database name ("dbname"), username, password
7) Clicked "Advanced options"
8) Entered hostname (e.g., testsite.yoursite.com). Went to testsite.yoursite.com in browser.

Installing virtual hosts for Drupal sites and subsites

The purpose of this guide is to concisely summarize how to implement apache vhost settings for each site or subsite.

All steps for this tutorial were implemented with Debian using Apache version 2.0.54.

  1. Gain entrance into your shell system, and su to root or another user that can edit apache2 configuration files.
  2. Go to your apache configuration files:
    cd /etc/apache2/sites-available
  3. Create a configuration file for your new site. For an example site, www.example.com, we make the site as such:
    nano example.com
<VirtualHost *:80>
    ServerAdmin me@myserver
    DocumentRoot /home/web/drupal/
    ServerName www.example.com
    ServerAlias example.com *.example.com
    RewriteEngine On
    RewriteOptions inherit
    CustomLog /var/log/apache2/example.com.log combined
</VirtualHost>
<VirtualHost *:443>
    ServerAdmin me@myserver
    DocumentRoot /home/web/drupal/
    ServerName www.example.com
    ServerAlias example.com *.example.com
    RewriteEngine On
    RewriteOptions inherit
    CustomLog /var/log/apache2/example.com.log combined
    # SSL Specific options
    SSLEngine on
    SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
    SSLCertificateFile /etc/ssl/apache/CA.crt
    SSLCertificateKeyFile /etc/ssl/apache/CA.key
    SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown
</VirtualHost>
  • Activate the site's configuration:
    a2ensite www.example.com
  • Reload Apache's configuration:
    /etc/init.d/apache2 force-reload
  • Done!

    Please post any changes or concerns,

    Tarek : )

Mac OS X-specific guidelines

Install and configure Mysql and PHP, if necessary. Server Logistics provides nice pre-compiled packages and instructions. PHP is also available from Marc Liyanage. PHP may already be installed on your system, so check first.

The stock version of Apache should be fine (typically 1.33).

Turn on "personal web sharing" in the sharing panel of System Preferences to start Apache. Now comes the more involved part- changing the webserver configuration.

To make changes to the Apache configuration you should NOT edit /etc/httpd/httpd.conf but instead edit files in /private/etc/httpd/users/. Any file in the directory /private/etc/httpd/users/ ending with “.conf” will effectively be appended to /etc/httpd/httpd.conf. So any changes you want to make should be made in one or more configuration files of your own construction. System updates will leave these files untouched. You can create a file /private/etc/httpd/users/drupal.conf for all your Drupal-specific changes (even if you have no user named Drupal) and they will be loaded when Apache starts up.

Note: for Mac OS X Server 10.4 (Tiger Server) and most likely previous versions as well, do not make changes to /etc/httpd/httpd.conf expecting the AllowOverride All directive to work. The correct file to add the AllowOverride All directive is in the directory /etc/httpd/sites/. In that directory are the virtual host configuration files. Each virtual server has a configuration file in that directory so it is in those files that you must enable AllowOverride All. If you only have one web server on your server configured, then the file you want to modify is /etc/httpd/sites/0000_any_80_.conf.

To enable clean URLs you will need the following code in your conf file. You'll need to be root (or sudo) to do this. Don't forget to restart apache after modifying httpd.conf (turn personal web sharing off, then back on again, or use /usr/sbin/apachectl restart).


# This controls which options the .htaccess files in directories can
# override. Can also be "All", or any combination of "Options", "FileInfo",
# "AuthConfig", and "Limit"
#    
#    AllowOverride None
        AllowOverride All

You may also need to edit this file to enable the PHP module for Apache. You have to uncomment two lines. First in this section:

#
# Dynamic Shared Object (DSO) Support
#

Uncomment this line (around line 235) by removing the #:

#LoadModule php4_module        libexec/httpd/libphp4.so

Then go below to this section:

#  Reconstruction of the complete module list from all available modules
#  (static and shared ones) to achieve correct module execution order.

and uncomment this line (around line 278) by removing the #:

#AddModule mod_php4.c

Drupal goes into /Library/WebServer/Documents/, or ~/Sites. If you use ~/Sites, you may also have to edit the .conf file in /etc/httpd/users that corresponds to your user account. You must AllowOverride in this file for your ~/Sites for clean URLs to work there.

After any edits to your .conf files, be sure to restart Apache (as described above).

MacZeaolots has a good tutorial on installing Drupal on Mac OS X 10.4. The same tutorial applies to 10.3 as well. While the tutorial talks about Drupal 4.6, the setup of the server environment is the same for any version of Drupal.

Important notes for MySQL install:

The version of PHP that Apple included with Mac OS X 10.4.4 has mysql.default_socket set to "/var/mysql/mysql.sock", while the binary version of MySQL from mysql.com uses "/tmp/mysql.sock". This will cause PHP to fail to connect to mysql with a message in Drupal like

can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)

Make PHP look for "/tmp/mysql.sock" by setting this in /etc/php.ini:

; Default socket name for local MySQL connects.  If empty, uses the built-in
; MySQL defaults.
mysql.default_socket = /tmp/mysql.sock

You can instead set this in /etc/my.cnf.

#Name of the socket file to use.
socket=/var/mysql/mysql.sock

Both work, but the second one may make the MySQL preference pane stop working.

You may also need to restart apache to have this take effect.

Restart from the terminal:

$ sudo apachectl restart

or restart by disabling and re-enabling personal web sharing.

HOWTO: Create a local server environment for drupal using MAMP

MAMP creates a local server environment on Mac OS X by installing PHP, MySQL, and Apache all at once. This will hopefully make Drupal much easier to install because the components don't have to be installed separately. This page is to be used in conjunction with the installation instructions for Drupal on Mac OS X.

1. Download MAMP
(This will install Apache, MySQL, and PHP in one step.)
Find the latest version here: http://www.mamp.info/
Download and drag to Applications folder to install. Open MAMP and click "start servers," then "Open start page."

2. Download Drupal
Find the latest Drupal release here: http://drupal.org/.

Move the directory containing the Drupal files into the MAMP htdocs directory:

mv drupal-x.x.x/* drupal-x.x.x/.htaccess /Applications/MAMP/htdocs/

3. Create the Drupal database

Go to the MAMP start page and click "phpMyAdmin." Create a new database and follow the instructions in INSTALL.mysql.txt to upload the required files from your Drupal installation.

4. Connect Drupal
Set the database URL in the 'sites/default/settings.php' file in your Drupal installation using the information provided on the MAMP start page and the name you used for the database you created in step 3.

$db_url = "mysql://username:password@localhost/databasename";

5. Start configuring Drupal!
Go to http://localhost:8888/drupal-x.x.x/ and create the first account.
Continue with instructions in INSTALL.txt.

HOWTO: Installing PostgreSQL and MySQL on the same Mac OS X machine

If you're interested in helping to ensure that Drupal and its contributed modules are compatible with both MySQL and PostgreSQL (also known as "pgsql"), you should consider setting up local test sites using both database back ends on the same machine. You can even configure both sites to point to the same Drupal installation, using symbolic links.

Unfortunately, the version of PHP that ships with Mac OS by default is not compatible with PostgreSQL, so to do this, you will need to compile both pgsql and php from source. While you're at it, you might want to upgrade to a newer version of MySQL, as well.

  1. Make a directory where you can build all of these programs. For example:
    mkdir /usr/local/src
    cd /usr/local/src
  • Download the latest copies of everything you need:
  • Unpackage all of these inside /usr/local/src
  • Configure and build MySQL. Good instructions can be found on this page: MySQL on Mac OS X. The important thing is that when you run
  • configure you use a reasonable value for the --prefix flag. For example: ./configure --prefix=/usr/local/mysql
  • Configure and build PostgreSQL. Once again, useful installation docs can be found here: PostgreSQL on Mac OS X, though the section about "Postgres and PHP" isn't what you want to read. Again, be sure you use a reasonable value for the--prefix flag. For example: ./configure --prefix=/usr/local/pgsql
  • Configure and build PHP. After some trial and error, getting PHP working properly with both MySQL and PostgreSQL required a carefully crafted configure line:
    ./configure --with-pgsql=/usr/local/pgsql --with-mysql=/usr/local/mysql --with-apxs --with-kerberos=/usr --with-zlib-dir=/usr --enable-cli --enable-trans-sid --with-xml --enable-exif --enable-ftp --enable-mbstring --enable-mbregex --enable-dbx --enable-sockets --with-iodbc=/usr --with-curl=/usr --with-config-file-path=/etc --sysconfdir=/private/etc --with-mysql-sock=/var/mysql/mysql.sock

    Some noteworthy things about this command:
    • This matches the flags used for the default PHP installed on Mac OS X as closely as possible, while also enabling PostgreSQL support.
    • The path you use for --with-pgsql must match whatever you specified for --prefix when building PostgreSQL.
    • The path you use for --with-mysql must match whatever you specified for --prefix when building MySQL.
    • The path you use for --with-mysql-sock should match whatever you specified for --with-unix-socket-path when building MySQL.

    Additional information about building PHP on Mac OS X machines can be found on the developer.apple.com site: PHP on Mac OS X

Installing Drupal on Mac OS X 10.4 Tiger

Mac OS X 10.4 Tiger comes with PHP (though it's disabled by default) and without MySQL. Here's how to get Drupal up and running from a stock Tiger installation.

Installing and Configuring MySQL

Downloaded the latest MySQL installer from dev.mysql.com. I chose the Mac OS X Installer Package for 10.3.

I double-clicked the file that I downloaded (mysql-standard-4.1.11-apple-darwin7.8.0-powerpc.dmg), then double-clicked the mysql-standard-4.1.11-apple-darwin7.8.0-powerpc.pkg icon to run the installer and install MySQL.

Next, I installed the MySQLStartupItem.pkg because I want MySQL to start up when I start my Mac.

Then, I copied the MySQL.prefPane into the PreferencePanes folder in my Library folder at the root level of my hard drive. Tiger asked me to authenticate when I did this. Upon opening my System Preferences, I can indeed see a pretty MySQL icon.

I wanted to test to see if MySQL would really start up, so I restarted. Sure enough, MySQL was running.

Next, it was time to set initial passwords for MySQL. To do that, I opened the Terminal (in the Utilities folder). Then I typed in the following:

export PATH="$PATH:/usr/local/mysql/bin"

This tells your computer that when it interprets commands, it should also look in the freshly created MySQL installation for MySQL commands. If you want it added permanently instead of just for this terminal session, you could edit the third line of /etc/profile to read

PATH="/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/mysql/bin"

and then start a new Terminal window.

Next, we want to make MySQL secure by setting a MySQL root password. Fortunately a handy utility is provided to make that easy. I typed in:

mysql_secure_installation

Interacting with the script looked like this (note that at the first prompt I just pressed enter since no root password has been set yet:

Enter current password for root (enter for none):
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MySQL
root user without the proper authorisation.

Set root password? [Y/n] Y
New password: zoinks
Re-enter new password: zoinks
Password updated successfully!
Reloading privilege tables..
... Success!


By default, a MySQL installation has an anonymous user, allowing anyone
to log into MySQL without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] Y
... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] Y
... Success!

By default, MySQL comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] Y
- Dropping test database...
... Success!
- Removing privileges on test database...
... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] Y
... Success!

Cleaning up...



All done!  If you've completed all of the above steps, your MySQL
installation should now be secure.

Thanks for using MySQL!

I verified that MySQL was running:

$ mysqladmin -u root -p status
Enter password: zoinks
Uptime: 938  Threads: 1  Questions: 16  Slow queries: 0  Opens: 21 
Flush tables: 1  Open tables: 0  Queries per second avg: 0.017

It was running fine. Now on to the task of setting up MySQL for Drupal.

Sending mail

Current versions of OS X use Postfix as the mail server but you have to enable it.

For a detailed how-to, see:
http://www.stepwise.com/Articles/Workbench/eart.index.html

Or save yourself lots of frustration and time and spend $10 for Postfix Enabler and get running in a couple of minutes.
http://cutedgesystems.com/software/PostfixEnabler/

Creating the Drupal Database and Database User

Now that MySQL is installed and we have a root password established for it, it's time to create the database that Drupal will use:

$ mysqladmin -u root -p create drupal
Enter password: zoinks

The database was created. Time to create the user. The user in this example will be called drupaldbuser and the password for that user will be fuffy.

$ mysql -u root -p
Enter password: zoinks
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 15 to server version: 4.1.11-standard

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> GRANT ALL PRIVILEGES ON drupal.* TO drupaldbuser@localhost IDENTIFIED BY 'fuffy';
Query OK, 0 rows affected (0.04 sec)

If you are using MySQL 4.1 or later, the following command is necessary because Tiger comes with PHP 4, and the MySQL libraries for PHP 4 use a different authentication protocol.

mysql> SET PASSWORD FOR 'drupaldbuser'@'localhost' = OLD_PASSWORD('fuffy');
Query OK, 0 rows affected (0.00 sec)

Now we apply the new settings:

mysql> flush privileges;
Query OK, 0 rows affected (0.19 sec)
mysql> \q
Bye

Now I paused to rejoice. MySQL was installed and ready for Drupal. Now it was time to install Drupal itself.

Installing using CVS repository

Development of the Drupal codebase is fairly quick, with a new release every six months or so. So I decided to use the CVS repository to download Drupal. That way I can use the "cvs update" command to keep my Drupal installation current with bug fixes and improvements.

I have the cvs option available to me because I installed the developer tools that were included on the OS 10.4 DVD. If you don't have them installed, or don't want to install them, you could always download Drupal directly and place the resulting directory inside

/Library/WebServer/Documents

First, I navigated to where I want my Drupal installation. Just to be consistent with Mac OS 10.4, I used /Library/WebServer/Documents:

cd /Library/WebServer/Documents

And now I pulled down the latest version of the Drupal 4.6 release:

cvs -z9 -d:pserver:anonymous:anonymous@cvs.drupal.org:/cvs/drupal checkout -r DRUPAL-4-6 drupal

This created a directory called drupal that contains the latest code for version 4.6. If, next week, I hear that a bugfix has been issued for 4.6, all I have to do is

cd /Library/WebServer/Documents
cvs update

By default, Apache on the Mac runs as user 'www' with group 'www', so you probably need to do the following in order to allow drupal to create directories and files:

chown -R www drupal
chgrp -R www drupal

Now it was time to create all the database tables that Drupal needs:

$ mysql -u drupaldbuser -p drupal < /Library/WebServer/Documents/drupal/database/database.mysql
Enter password: fuffy

Now I had MySQL running, and had a Drupal database populated by Drupal's fields. It was time to tell Drupal how to find that database.

In the Finder, I went to /Library/WebServer/Documents/Drupal/sites and duplicated the folder called default, and renamed it localhost. Then inside the new localhost directory I edited the settings.php file, changing line 81 to read:

$db_url = 'mysql://drupaldbuser:fuffy@localhost/drupal';

and changing line 90 to read:

$base_url = 'http://localhost/drupal';

The reason I duplicated the "default" settings folder was to avoid conflicts when I update CVS in the future, since CVS would have seen the changed settings.php file and tried to merge it with the original one. By keeping my settings file separate, I avoid this. As long as I access my Drupal installation through the URL http://localhost/drupal it will use the settings in the localhost folder.

PHP is not enabled by default on OS 10.4. So I enabled it by editing Apache's configuration file. I used BBEdit, but you can use any text editor you want. For example, you could choose Go To Folder from the Finder's Go menu and type in /etc/httpd, then double-click on httpd.conf and OS 10.4 will prompt you for an application to edit the file with. Here's me opening the file for editing in BBEdit:

sudo bbedit /etc/httpd/httpd.conf

Then I removed the # from in front of line 240:

#LoadModule php4_module        libexec/httpd/libphp4.so

and line 284:

#AddModule mod_php4.c

and line 406:

    AllowOverride All

After changing the configuration file, I stopped, then started the Personal Web Sharing service in the Sharing pane of System Preferences. This forces Apache to reread the configuration file and apply the changes. So now PHP was enabled.

Now, with my hands shaking from excitement, I entered http://localhost/drupal into my web browser. I was greeted with Drupal's welcome page:

I clicked on the link entitled "create the first account", and saw:

Since this was the first account I created on Drupal, I knew it would have special privileges, so I named it admin and typed in my e-mail address. (Warning: naming your administrative account "admin" is bad security! Don't do this!) Then I clicked on the "Create new account" button. Drupal responded with a randomly generated password and an opportunity to log in immediately:

I took the opportunity to log in immediately by clicking the "Log in" button. On the resulting screen I changed my password to something I could remember and clicked Submit.

Now I've got Drupal running on Mac OS 10.4. Time to celebrate with a swig of flavinoid-laden grape juice.

Prefixed database.mysql for search and replace

Use a texteditor with search & replace functionality to replace 'prefix' with your own eg. site1, site2.
This is database.mysql from 4.6.5. Contributed by Shane Birley.

-- MySQL dump 8.22
--
-- Host: localhost Database: drupal_devel
-- Server version 3.23.52-nt
--
-- Table structure for table 'access'
--
CREATE TABLE prefix_access (
  aid tinyint(10) NOT NULL auto_increment,
  mask varchar(255) NOT NULL default '',
  type varchar(255) NOT NULL default '',
  status tinyint(2) NOT NULL default '0',
  PRIMARY KEY (aid)
) TYPE=MyISAM;
--
-- Table structure for table 'accesslog'
--
CREATE TABLE prefix_accesslog (
  aid int(10) NOT NULL auto_increment,
  title varchar(255) default NULL,
  path varchar(255) default NULL,
  url varchar(255) default NULL,
  hostname varchar(128) default NULL,
  uid int(10) unsigned default '0',
  timestamp int(11) unsigned NOT NULL default '0',
  KEY accesslog_timestamp (timestamp),
  PRIMARY KEY (aid)
) TYPE=MyISAM;
--
-- Table structure for table 'aggregator_category'
--
CREATE TABLE prefix_aggregator_category (
  cid int(10) NOT NULL auto_increment,
  title varchar(255) NOT NULL default '',
  description longtext NOT NULL,
  block tinyint(2) NOT NULL default '0',
  PRIMARY KEY (cid),
  UNIQUE KEY title (title)
) TYPE=MyISAM;
--
-- Table structure for table 'aggregator_category_feed'
--
CREATE TABLE prefix_aggregator_category_feed (
  fid int(10) NOT NULL default '0',
  cid int(10) NOT NULL default '0',
  PRIMARY KEY (fid,cid)
) TYPE=MyISAM;
--
-- Table structure for table 'aggregator_category_item'
--
CREATE TABLE prefix_aggregator_category_item (
  iid int(10) NOT NULL default '0',
  cid int(10) NOT NULL default '0',
  PRIMARY KEY (iid,cid)
) TYPE=MyISAM;
--
-- Table structure for table 'aggregator_feed'
--
CREATE TABLE prefix_aggregator_feed (
  fid int(10) NOT NULL auto_increment,
  title varchar(255) NOT NULL default '',
  url varchar(255) NOT NULL default '',
  refresh int(10) NOT NULL default '0',
  checked int(10) NOT NULL default '0',
  link varchar(255) NOT NULL default '',
  description longtext NOT NULL,
  image longtext NOT NULL,
  etag varchar(255) NOT NULL default '',
  modified int(10) NOT NULL default '0',
  block tinyint(2) NOT NULL default '0',
  PRIMARY KEY (fid),
  UNIQUE KEY link (url),
  UNIQUE KEY title (title)
) TYPE=MyISAM;
--
-- Table structure for table 'aggregator_item'
--
CREATE TABLE prefix_aggregator_item (
  iid int(10) NOT NULL auto_increment,
  fid int(10) NOT NULL default '0',
  title varchar(255) NOT NULL default '',
  link varchar(255) NOT NULL default '',
  author varchar(255) NOT NULL default '',
  description longtext NOT NULL,
  timestamp int(11) default NULL,
  PRIMARY KEY (iid)
) TYPE=MyISAM;
--
-- Table structure for table 'authmap'
--
CREATE TABLE prefix_authmap (
  aid int(10) unsigned NOT NULL auto_increment,
  uid int(10) NOT NULL default '0',
  authname varchar(128) NOT NULL default '',
  module varchar(128) NOT NULL default '',
  PRIMARY KEY (aid),
  UNIQUE KEY authname (authname)
) TYPE=MyISAM;
--
-- Table structure for table 'blocks'
--
CREATE TABLE prefix_blocks (
  module varchar(64) DEFAULT '' NOT NULL,
  delta varchar(32) NOT NULL default '0',
  status tinyint(2) DEFAULT '0' NOT NULL,
  weight tinyint(1) DEFAULT '0' NOT NULL,
  region tinyint(1) DEFAULT '0' NOT NULL,
  custom tinyint(2) DEFAULT '0' NOT NULL,
  throttle tinyint(1) DEFAULT '0' NOT NULL,
  visibility tinyint(1) DEFAULT '0' NOT NULL,
  pages text NOT NULL,
  types text NOT NULL
) TYPE=MyISAM;
--
-- Table structure for table 'book'
--
CREATE TABLE prefix_book (
  nid int(10) unsigned NOT NULL default '0',
  parent int(10) NOT NULL default '0',
  weight tinyint(3) NOT NULL default '0',
  log longtext,
  PRIMARY KEY (nid),
  KEY parent (parent)
) TYPE=MyISAM;
--
-- Table structure for table 'boxes'
--
CREATE TABLE prefix_boxes (
  bid tinyint(4) NOT NULL auto_increment,
  title varchar(64) NOT NULL default '',
  body longtext,
  info varchar(128) NOT NULL default '',
  format int(4) NOT NULL default '0',
  PRIMARY KEY (bid),
  UNIQUE KEY title (title),
  UNIQUE KEY info (info)
) TYPE=MyISAM;
--
-- Table structure for table 'cache'
--
CREATE TABLE prefix_cache (
  cid varchar(255) NOT NULL default '',
  data longtext,
  expire int(11) NOT NULL default '0',
  created int(11) NOT NULL default '0',
  headers text,
  PRIMARY KEY (cid),
  INDEX expire (expire)
) TYPE=MyISAM;
--
-- Table structure for table 'comments'
--
CREATE TABLE prefix_comments (
  cid int(10) NOT NULL auto_increment,
  pid int(10) NOT NULL default '0',
  nid int(10) NOT NULL default '0',
  uid int(10) NOT NULL default '0',
  subject varchar(64) NOT NULL default '',
  comment longtext NOT NULL,
  hostname varchar(128) NOT NULL default '',
  timestamp int(11) NOT NULL default '0',
  score mediumint(9) NOT NULL default '0',
  status tinyint(3) unsigned NOT NULL default '0',
  format int(4) NOT NULL default '0',
  thread varchar(255) NOT NULL,
  users longtext,
  name varchar(60) default NULL,
  mail varchar(64) default NULL,
  homepage varchar(255) default NULL,
  PRIMARY KEY (cid),
  KEY lid (nid)
) TYPE=MyISAM;
--
-- Table structre for table 'node_last_comment'
--
CREATE TABLE prefix_node_comment_statistics (
  nid int(10) unsigned NOT NULL auto_increment,
  last_comment_timestamp int(11) NOT NULL default '0',
  last_comment_name varchar(60) default NULL,
  last_comment_uid int(10) NOT NULL default '0',
  comment_count int(10) unsigned NOT NULL default '0',
  PRIMARY KEY (nid),
  KEY node_comment_timestamp (last_comment_timestamp)
) TYPE=MyISAM;
--
-- Table structure for table 'directory'
--
CREATE TABLE prefix_directory (
  link varchar(255) NOT NULL default '',
  name varchar(128) NOT NULL default '',
  mail varchar(128) NOT NULL default '',
  slogan longtext NOT NULL,
  mission longtext NOT NULL,
  timestamp int(11) NOT NULL default '0',
  PRIMARY KEY (link)
) TYPE=MyISAM;
--
-- Table structure for table 'files'
--
CREATE TABLE prefix_files (
  fid int(10) unsigned NOT NULL default '0',
  nid int(10) unsigned NOT NULL default '0',
  filename varchar(255) NOT NULL default '',
  filepath varchar(255) NOT NULL default '',
  filemime varchar(255) NOT NULL default '',
  filesize int(10) unsigned NOT NULL default '0',
  list tinyint(1) unsigned NOT NULL default '0',
  PRIMARY KEY (fid)
) TYPE=MyISAM;
--
-- Table structure for table 'filter_formats'
--
CREATE TABLE prefix_filter_formats (
  format int(4) NOT NULL auto_increment,
  name varchar(255) NOT NULL default '',
  roles varchar(255) NOT NULL default '',
  cache tinyint(2) NOT NULL default '0',
  PRIMARY KEY (format)
) TYPE=MyISAM;
--
-- Table structure for table 'filters'
--
CREATE TABLE prefix_filters (
  format int(4) NOT NULL default '0',
  module varchar(64) NOT NULL default '',
  delta tinyint(2) DEFAULT '0' NOT NULL,
  weight tinyint(2) DEFAULT '0' NOT NULL,
  INDEX (weight)
) TYPE=MyISAM;
--
-- Table structure for table 'flood'
--
CREATE TABLE prefix_flood (
  event varchar(64) NOT NULL default '',
  hostname varchar(128) NOT NULL default '',
  timestamp int(11) NOT NULL default '0'
) TYPE=MyISAM;
--
-- Table structure for table 'forum'
--
CREATE TABLE prefix_forum (
  nid int(10) unsigned NOT NULL default '0',
  tid int(10) unsigned NOT NULL default '0',
  PRIMARY KEY (nid),
  KEY tid (tid)
) TYPE=MyISAM;
--
-- Table structure for table 'history'
--
CREATE TABLE prefix_history (
  uid int(10) NOT NULL default '0',
  nid int(10) NOT NULL default '0',
  timestamp int(11) NOT NULL default '0',
  PRIMARY KEY (uid,nid)
) TYPE=MyISAM;
--
-- Table structure for table 'locales_meta'
--
CREATE TABLE prefix_locales_meta (
  locale varchar(12) NOT NULL default '',
  name varchar(64) NOT NULL default '',
  enabled int(2) NOT NULL default '0',
  isdefault int(2) NOT NULL default '0',
  plurals int(1) NOT NULL default '0',
  formula varchar(128) NOT NULL default '',
  PRIMARY KEY (locale)
) TYPE=MyISAM;
--
-- Table structure for table 'locales_source'
--
CREATE TABLE prefix_locales_source (
  lid int(11) NOT NULL auto_increment,
  location varchar(255) NOT NULL default '',
  source blob NOT NULL,
  PRIMARY KEY (lid)
) TYPE=MyISAM;
--
-- Table structure for table 'locales_target'
--
CREATE TABLE prefix_locales_target (
  lid int(11) NOT NULL default '0',
  translation blob NOT NULL,
  locale varchar(12) NOT NULL default '',
  plid int(11) NOT NULL default '0',
  plural int(1) NOT NULL default '0',
  KEY lid (lid),
  KEY lang (locale),
  KEY plid (plid),
  KEY plural (plural)
) TYPE=MyISAM;
--
-- Table structure for table 'menu'
--
CREATE TABLE prefix_menu (
  mid int(10) unsigned NOT NULL default '0',
  pid int(10) unsigned NOT NULL default '0',
  path varchar(255) NOT NULL default '',
  title varchar(255) NOT NULL default '',
  description varchar(255) NOT NULL default '',
  weight tinyint(4) NOT NULL default '0',
  type int(2) unsigned NOT NULL default '0',
  PRIMARY KEY (mid)
) TYPE=MyISAM;
--
-- Table structure for table 'moderation_filters'
--
CREATE TABLE prefix_moderation_filters (
  fid int(10) unsigned NOT NULL auto_increment,
  filter varchar(255) NOT NULL default '',
  minimum smallint(6) NOT NULL default '0',
  PRIMARY KEY (fid)
) TYPE=MyISAM;
--
-- Table structure for table 'moderation_roles'
--
CREATE TABLE prefix_moderation_roles (
  rid int(10) unsigned NOT NULL default '0',
  mid int(10) unsigned NOT NULL default '0',
  value tinyint(4) NOT NULL default '0',
  KEY idx_rid (rid),
  KEY idx_mid (mid)
) TYPE=MyISAM;
--
-- Table structure for table 'moderation_votes'
--
CREATE TABLE prefix_moderation_votes (
  mid int(10) unsigned NOT NULL auto_increment,
  vote varchar(255) default NULL,
  weight tinyint(4) NOT NULL default '0',
  PRIMARY KEY (mid)
) TYPE=MyISAM;
--
-- Table structure for table 'node'
--
CREATE TABLE prefix_node (
  nid int(10) unsigned NOT NULL auto_increment,
  type varchar(16) NOT NULL default '',
  title varchar(128) NOT NULL default '',
  uid int(10) NOT NULL default '0',
  status int(4) NOT NULL default '1',
  created int(11) NOT NULL default '0',
  changed int(11) NOT NULL default '0',
  comment int(2) NOT NULL default '0',
  promote int(2) NOT NULL default '0',
  moderate int(2) NOT NULL default '0',
  teaser longtext NOT NULL,
  body longtext NOT NULL,
  revisions longtext NOT NULL,
  sticky int(2) NOT NULL default '0',
  format int(4) NOT NULL default '0',
  PRIMARY KEY (nid),
  KEY node_type (type(4)),
  KEY node_title_type (title,type(4)),
  KEY status (status),
  KEY uid (uid),
  KEY node_moderate (moderate),
  KEY node_promote_status (promote, status),
  KEY node_created (created),
  KEY node_changed (changed),
  KEY node_status_type (status, type, nid)
) TYPE=MyISAM;
--
-- Table structure for table `node_access`
--
CREATE TABLE prefix_node_access (
  nid int(10) unsigned NOT NULL default '0',
  gid int(10) unsigned NOT NULL default '0',
  realm varchar(255) NOT NULL default '',
  grant_view tinyint(1) unsigned NOT NULL default '0',
  grant_update tinyint(1) unsigned NOT NULL default '0',
  grant_delete tinyint(1) unsigned NOT NULL default '0',
  PRIMARY KEY (nid,gid,realm)
) TYPE=MyISAM;
--
-- Table structure for table 'profile_fields'
--
CREATE TABLE prefix_profile_fields (
  fid int(10) NOT NULL auto_increment,
  title varchar(255) default NULL,
  name varchar(128) default NULL,
  explanation TEXT default NULL,
  category varchar(255) default NULL,
  page varchar(255) default NULL,
  type varchar(128) default NULL,
  weight tinyint(1) DEFAULT '0' NOT NULL,
  required tinyint(1) DEFAULT '0' NOT NULL,
  register tinyint(1) DEFAULT '0' NOT NULL,
  visibility tinyint(1) DEFAULT '0' NOT NULL,
  options text,
  KEY category (category),
  UNIQUE KEY name (name),
  PRIMARY KEY (fid)
);
--
-- Table structure for table 'profile_values'
--
CREATE TABLE prefix_profile_values (
  fid int(10) unsigned default '0',
  uid int(10) unsigned default '0',
  value text,
  KEY uid (uid),
  KEY fid (fid)
);
--
-- Table structure for table 'url_alias'
--
CREATE TABLE prefix_url_alias (
  pid int(10) unsigned NOT NULL auto_increment,
  src varchar(128) NOT NULL default '',
  dst varchar(128) NOT NULL default '',
  PRIMARY KEY (pid),
  UNIQUE KEY dst (dst)
) TYPE=MyISAM;
--
-- Table structure for table 'permission'
--
CREATE TABLE prefix_permission (
  rid int(10) unsigned NOT NULL default '0',
  perm longtext,
  tid int(10) unsigned NOT NULL default '0',
  KEY rid (rid)
) TYPE=MyISAM;
--
-- Table structure for table 'poll'
--
CREATE TABLE prefix_poll (
  nid int(10) unsigned NOT NULL default '0',
  runtime int(10) NOT NULL default '0',
  polled longtext NOT NULL,
  active int(2) unsigned NOT NULL default '0',
  PRIMARY KEY (nid)
) TYPE=MyISAM;
--
-- Table structure for table 'poll_choices'
--
CREATE TABLE prefix_poll_choices (
  chid int(10) unsigned NOT NULL auto_increment,
  nid int(10) unsigned NOT NULL default '0',
  chtext varchar(128) NOT NULL default '',
  chvotes int(6) NOT NULL default '0',
  chorder int(2) NOT NULL default '0',
  PRIMARY KEY (chid),
  KEY nid (nid)
) TYPE=MyISAM;
--
-- Table structure for table 'queue'
--
CREATE TABLE prefix_queue (
  nid int(10) unsigned NOT NULL,
  uid int(10) unsigned NOT NULL,
  vote int(3) NOT NULL default '0',
  PRIMARY KEY (nid, uid)
) TYPE=MyISAM;
--
-- Table structure for table 'role'
--
CREATE TABLE prefix_role (
  rid int(10) unsigned NOT NULL auto_increment,
  name varchar(32) NOT NULL default '',
  PRIMARY KEY (rid),
  UNIQUE KEY name (name)
) TYPE=MyISAM;
--
-- Table structure for table 'search_index'
--
CREATE TABLE prefix_search_index (
  word varchar(50) NOT NULL default '',
  sid int(10) unsigned NOT NULL default '0',
  type varchar(16) default NULL,
  fromsid int(10) unsigned NOT NULL default '0',
  fromtype varchar(16) default NULL,
  score int(10) unsigned default NULL,
  KEY sid (sid),
  KEY fromsid (fromsid),
  KEY word (word)
) TYPE=MyISAM;
--
-- Table structure for table 'search_total'
--
CREATE TABLE prefix_search_total (
  word varchar(50) NOT NULL default '',
  count int(10) unsigned default NULL,
  PRIMARY KEY word (word)
) TYPE=MyISAM;
--
-- Table structure for table 'sessions'
--
CREATE TABLE prefix_sessions (
  uid int(10) unsigned NOT NULL,
  sid varchar(32) NOT NULL default '',
  hostname varchar(128) NOT NULL default '',
  timestamp int(11) NOT NULL default '0',
  session longtext,
  KEY uid (uid),
  PRIMARY KEY (sid),
  KEY timestamp (timestamp)
) TYPE=MyISAM;
--
-- Table structure for table 'sequences'
--
CREATE TABLE prefix_sequences (
  name varchar(255) NOT NULL default '',
  id int(10) unsigned NOT NULL default '0',
  PRIMARY KEY (name)
) TYPE=MyISAM;
--
-- Table structure for table 'node_counter'
--
CREATE TABLE prefix_node_counter (
  nid int(11) NOT NULL default '0',
  totalcount bigint(20) unsigned NOT NULL default '0',
  daycount mediumint(8) unsigned NOT NULL default '0',
  timestamp int(11) unsigned NOT NULL default '0',
  PRIMARY KEY (nid),
  KEY totalcount (totalcount),
  KEY daycount (daycount),
  KEY timestamp (timestamp)
) TYPE=MyISAM;
--
-- Table structure for table 'system'
--
CREATE TABLE prefix_system (
  filename varchar(255) NOT NULL default '',
  name varchar(255) NOT NULL default '',
  type varchar(255) NOT NULL default '',
  description varchar(255) NOT NULL default '',
  status int(2) NOT NULL default '0',
  throttle tinyint(1) DEFAULT '0' NOT NULL,
  bootstrap int(2) NOT NULL default '0',
  PRIMARY KEY (filename)
) TYPE=MyISAM;
--
-- Table structure for table 'term_data'
--
CREATE TABLE prefix_term_data (
  tid int(10) unsigned NOT NULL auto_increment,
  vid int(10) unsigned NOT NULL default '0',
  name varchar(255) NOT NULL default '',
  description longtext,
  weight tinyint(4) NOT NULL default '0',
  PRIMARY KEY (tid),
  KEY vid (vid)
) TYPE=MyISAM;
--
-- Table structure for table 'term_hierarchy'
--
CREATE TABLE prefix_term_hierarchy (
  tid int(10) unsigned NOT NULL default '0',
  parent int(10) unsigned NOT NULL default '0',
  KEY tid (tid),
  KEY parent (parent)
) TYPE=MyISAM;
--
-- Table structure for table 'term_node'
--
CREATE TABLE prefix_term_node (
  nid int(10) unsigned NOT NULL default '0',
  tid int(10) unsigned NOT NULL default '0',
  KEY nid (nid),
  KEY tid (tid),
  PRIMARY KEY (tid,nid)
) TYPE=MyISAM;
--
-- Table structure for table 'term_relation'
--
CREATE TABLE prefix_term_relation (
  tid1 int(10) unsigned NOT NULL default '0',
  tid2 int(10) unsigned NOT NULL default '0',
  KEY tid1 (tid1),
  KEY tid2 (tid2)
) TYPE=MyISAM;
--
-- Table structure for table 'term_synonym'
--
CREATE TABLE prefix_term_synonym (
  tid int(10) unsigned NOT NULL default '0',
  name varchar(255) NOT NULL default '',
  KEY tid (tid),
  KEY name (name(3))
) TYPE=MyISAM;
--
-- Table structure for table 'users'
--
CREATE TABLE prefix_users (
  uid int(10) unsigned NOT NULL default '0',
  name varchar(60) NOT NULL default '',
  pass varchar(32) NOT NULL default '',
  mail varchar(64) default '',
  mode tinyint(1) NOT NULL default '0',
  sort tinyint(1) default '0',
  threshold tinyint(1) default '0',
  theme varchar(255) NOT NULL default '',
  signature varchar(255) NOT NULL default '',
  created int(11) NOT NULL default '0',
  changed int(11) NOT NULL default '0',
  status tinyint(4) NOT NULL default '0',
  timezone varchar(8) default NULL,
  language varchar(12) NOT NULL default '',
  picture varchar(255) NOT NULL DEFAULT '',
  init varchar(64) default '',
  data longtext,
  PRIMARY KEY (uid),
  UNIQUE KEY name (name),
  KEY changed (changed)
) TYPE=MyISAM;
--
-- Table structure for table 'users_roles'
--
CREATE TABLE prefix_users_roles (
  uid int(10) unsigned NOT NULL default '0',
  rid int(10) unsigned NOT NULL default '0',
  PRIMARY KEY (uid, rid)
) TYPE=MyISAM;
--
-- Table structure for table 'variable'
--
CREATE TABLE prefix_variable (
  name varchar(48) NOT NULL default '',
  value longtext NOT NULL,
  PRIMARY KEY (name)
) TYPE=MyISAM;
--
-- Table structure for table 'vocabulary'
--
CREATE TABLE prefix_vocabulary (
  vid int(10) unsigned NOT NULL auto_increment,
  name varchar(255) NOT NULL default '',
  description longtext,
  help varchar(255) NOT NULL default '',