<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta name="generator" content="HTML Tidy, see www.w3.org" />

    <title>Compiling and Installing Apache</title>
  </head>
  <!-- Background white, links blue (unvisited), navy (visited), red (active) -->

  <body bgcolor="#FFFFFF" text="#000000" link="#0000FF"
  vlink="#000080" alink="#FF0000">
    <!--#include virtual="header.html" -->

    <h1 align="CENTER">Compiling and Installing</h1>

    <p>This document covers compilation and installation of Apache
    on Unix and Unix-like systems only. For compiling and
    installation on Windows, see <a
    href="platform/windows.html">Using Apache with Microsoft
    Windows</a>. For other platforms, see the <a
    href="platform/">platform</a> documentation.</p>

    <p>Apache 2.0's configuration and installation environment has
    changed completely from Apache 1.3. Apache 1.3 used a custom
    set of scripts to achieve easy installation. Apache 2.0 now
    uses libtool and autoconf to create an environment that looks
    like many other Open Source projects.</p>

    <ul>
      <li><a href="#overview">Overview for the impatient</a></li>

      <li><a href="#requirements">Requirements</a></li>

      <li><a href="#download">Download</a></li>

      <li><a href="#extract">Extract</a></li>

      <li>
        <a href="#configure">Configuring the source tree</a> 

        <ul>
          <li><a href="#environment">Environment Variables</a></li>

          <li><a href="#output">autoconf Output Options</a></li>

          <li><a href="#pathnames">Pathnames</a></li>

          <li><a href="#modules">Modules</a></li>

          <li><a href="#suexec">Suexec</a></li>
        </ul>
      </li>

      <li><a href="#compile">Build</a></li>

      <li><a href="#install">Install</a></li>

      <li><a href="#customize">Customize</a></li>

      <li><a href="#test">Test</a></li>
    </ul>
    <hr />

    <h3><a id="overview" name="overview">Overview for the
    impatient</a></h3>

    <table>
      <tr>
        <td><a href="#download">Download</a></td>

        <td><code>$ lynx
        http://www.apache.org/dist/httpd/httpd-2_0_<em>NN</em>.tar.gz</code>
        </td>
      </tr>

      <tr>
        <td><a href="#extract">Extract</a></td>

        <td><code>$ gzip -d httpd-2_0_<em>NN</em>.tar.gz<br />
         $ tar xvf httpd-2_0_<em>NN</em>.tar</code> </td>
      </tr>

      <tr>
        <td><a href="#configure">Configure</a></td>

        <td><code>$ ./configure --prefix=<em>PREFIX</em></code>
        </td>
      </tr>

      <tr>
        <td><a href="#compile">Compile</a></td>

        <td><code>$ make</code> </td>
      </tr>

      <tr>
        <td><a href="#install">Install</a></td>

        <td><code>$ make install</code> </td>
      </tr>

      <tr>
        <td><a href="#customize">Customize</a></td>

        <td><code>$ vi <em>PREFIX</em>/conf/httpd.conf</code> </td>
      </tr>

      <tr>
        <td><a href="#test">Test</a></td>

        <td><code>$ <em>PREFIX</em>/bin/apachectl start</code>
        </td>
      </tr>
    </table>

    <p><em>NN</em> must be replaced with the current minor version
    number, and <em>PREFIX</em> must be replaced with the
    filesystem path under which the server should be installed. If
    <em>PREFIX</em> is not specified, it defaults to
    <code>/usr/local/apache2</code>.</p>

    <p>Each section of the compilation and installation process is
    described in more detail below, beginning with the requirements
    for compiling and installing Apache HTTPD.</p>

    <h3><a id="requirements"
    name="requirements">Requirements</a></h3>

    <p>The following requirements exist for building Apache:</p>

    <ul>
      <li>Disk Space<br />
      <br />
       Make sure you have at least 50 MB of temporary free disk
      space available. After installation Apache occupies
      approximately 10 MB of disk space. The actual disk space
      requirements will vary considerably based on your chosen
      configuration options and any third-party modules.<br />
      <br />
      </li>

      <li>ANSI-C Compiler and Build System<br />
      <br />
       Make sure you have an ANSI-C compiler installed. The <a
      href="http://www.gnu.org/software/gcc/gcc.html">GNU C
      compiler (GCC)</a> from the <a
      href="http://www.gnu.org/">Free Software Foundation (FSF)</a>
      is recommended (version 2.7.2 is fine). If you don't have GCC
      then at least make sure your vendor's compiler is ANSI
      compliant. In addition, your <code>PATH</code> must contain
      basic build tools such as <code>make</code>.<br />
      <br />
      </li>

      <li>Accurate time keeping<br />
      <br />
       Elements of the HTTP protocol are expressed as the time of
      day. So, it's time to investigate setting some time
      synchronization facility on your system. Usually the ntpdate
      or xntpd programs are used for this purpose which are based
      on the Network Time Protocol (NTP). See the Usenet newsgroup
      <a
      href="news:comp.protocols.time.ntp">comp.protocols.time.ntp</a>
      and the <a href="http://www.eecis.udel.edu/~ntp/">NTP
      homepage</a> for more details about NTP software and public
      time servers.<br />
      <br />
      </li>

      <li><a href="http://www.perl.org/">Perl 5</a>
      [OPTIONAL]<br />
      <br />
       For some of the support scripts like <a
      href="programs/apxs.html">apxs</a> or <a
      href="programs/dbmmanage.html">dbmmanage</a> (which are
      written in Perl) the Perl 5 interpreter is required (versions
      5.003 and 5.004 are fine). If no such interpreter is found by
      the `configure' script there is no harm. Of course, you still
      can build and install Apache 2.0. Only those support scripts
      cannot be used. If you have multiple Perl interpreters
      installed (perhaps a Perl 4 from the vendor and a Perl 5 from
      your own), then it is recommended to use the --with-perl
      option (see below) to make sure the correct one is selected
      by ./configure.<br />
      <br />
      </li>
    </ul>

    <h3><a id="download" name="download">Download</a></h3>

    <p>Apache can be downloaded from the <a
    href="http://www.apache.org/dist/httpd/">Apache Software
    Foundation download site</a> or from a <a
    href="http://www.apache.org/dyn/closer.cgi/httpd/">nearby
    mirror</a>.</p>

    <p>Version numbers that end in <code>alpha</code> indicate
    early pre-test versions which may or may not work. Version
    numbers ending in <code>beta</code> indicate more reliable
    releases that still require further testing or bug fixing. If
    you wish to download the best available production release of
    the Apache HTTP Server, you should choose the latest version
    with neither <code>alpha</code> nor <code>beta</code> in its
    filename.</p>

    <p>After downloading, especially if a mirror site is used, it
    is important to verify that you have a complete and unmodified
    version of the Apache HTTP Server. This can be accomplished by
    testing the downloaded tarball against the PGP signature. This,
    in turn, is a two step procedure. First, you must obtain the
    <code>KEYS</code> file from the <a
    href="http://www.apache.org/dist/httpd/">Apache distribution
    site</a>. (To assure that the <code>KEYS</code> file itself has
    not been modified, it may be a good idea to use a file from a
    previous distribution of Apache or import the keys from a
    public key server.) The keys are imported into your personal
    key ring using one of the following commands (depending on your
    pgp version):</p>

    <blockquote>
      <code>$ pgp &lt; KEYS</code>
    </blockquote>
    or 

    <blockquote>
      <code>$ gpg --import KEYS</code>
    </blockquote>

    <p>The next step is to test the tarball against the PGP
    signature, which should always be obtained from the <a
    href="http://www.apache.org/dist/httpd/">main Apache
    website</a>. The signature file has a filename identical to the
    source tarball with the addition of <code>.asc</code>. Then you
    can check the distribution with one of the following commands
    (again, depending on your pgp version):</p>

    <blockquote>
      <code>$ pgp httpd-2_0_<em>NN</em>.tar.gz.asc</code>
    </blockquote>
    or 

    <blockquote>
      <code>$ gpg --verify httpd-2_0_<em>NN</em>.tar.gz.asc</code>
    </blockquote>
    You should receive a message like<br />
     <br />
     

    <blockquote>
      <code>Good signature from user "Martin Kraemer
      &lt;martin@apache.org&gt;".</code>
    </blockquote>

    <p>Depending on the trust relationships contained in your key
    ring, you may also receive a message saying that the
    relationship between the key and the signer of the key cannot
    be verified. This is not a problem if you trust the
    authenticity of the <code>KEYS</code> file.</p>

    <h3><a id="extract" name="extract">Extract</a></h3>

    <p>Extracting the source from the Apache HTTPD tarball is a
    simple matter of uncompressing, and then untarring:</p>

    <blockquote>
      <code>$ gzip -d httpd-2_0_<em>NN</em>.tar.gz<br />
       $ tar xvf httpd-2_0_<em>NN</em>.tar</code>
    </blockquote>

    <p>This will create a new directory under the current directory
    containing the source code for the distribution. You should
    <code>cd</code> into that directory before proceeding with
    compiling the server.</p>

    <h3><a id="configure" name="configure">Configuring the source
    tree</a></h3>

    <p>The next step is to configure the Apache source tree for
    your particular platform and personal requirements. This is
    done using the script <code>configure</code> included in the
    root directory of the distribution. (Developers downloading the
    CVS version of the Apache source tree will need to have
    <code>autoconf</code> and <code>libtool</code> installed and
    will need to run <code>buildconf</code> before proceeding with
    the next steps. This is not necessary for official
    releases.)</p>

    <p>To configure the source tree using all the default options,
    simply type <code>./configure</code>. To change the default
    options, <code>configure</code> accepts a variety of variables
    and command line options. Environment variables are generally
    placed before the <code>./configure</code> command, while other
    options are placed after. The most important option here is the
    location prefix where Apache is to be installed later, because
    Apache has to be configured for this location to work
    correctly. But there are a lot of other options available for
    your pleasure.</p>

    <p>For a short impression of what possibilities you have, here
    is a typical example which compiles Apache for the installation
    tree /sw/pkg/apache with a particular compiler and flags plus
    the two additional modules mod_rewrite and mod_speling for
    later loading through the DSO mechanism:</p>

    <blockquote>
      <code>$ CC="pgcc" CFLAGS="-O2" \<br />
       ./configure --prefix=/sw/pkg/apache \<br />
       --enable-rewrite=shared \<br />
       --enable-speling=shared</code>
    </blockquote>

    <p>When configure is run it will take several minutes to test
    for the availability of features on your system and build
    Makefiles which will later be used to compile the server.</p>

    <p>The easiest way to find all of the configuration flags for
    Apache is to run ./configure --help. What follows is a brief
    description of most of the arguments and environment
    variables.</p>

    <h4><a id="environment" name="environment">Environment
    Variables</a></h4>

    <p>The autoconf build process uses several environment
    variables to configure the build environment. In general, these
    variables change the method used to build Apache, but not the
    eventual features of the server. These variables can be placed
    in the environment before invoking <code>configure</code>, but
    it is usually easier to specify them on the
    <code>configure</code> command line as demonstrated in the
    example above.</p>

    <dl>
      <dt><code>CC=...</code></dt>

      <dd>The name of the C compiler command.</dd>

      <dt><code>CPPFLAGS=...</code></dt>

      <dd>Miscellaneous C preprocessor and compiler options.</dd>

      <dt><code>CFLAGS=...</code></dt>

      <dd>Debugging and optimization options for the C
      compiler.</dd>

      <dt><code>LDFLAGS=...</code></dt>

      <dd>Miscellaneous options to be passed to the linker.</dd>

      <dt><code>LIBS=...</code></dt>

      <dd>Library location information ("-L" and "-l" options) to
      pass to the linker.</dd>

      <dt><code>INCLUDES=...</code></dt>

      <dd>Header file search directories ("-I<em>dir</em>").</dd>

      <dt><code>TARGET=...</code> [Default: apache]</dt>

      <dd>Name of the executable which will be built.</dd>

      <dt><code>NOTEST_CPPFLAGS=...</code></dt>

      <dt><code>NOTEST_CFLAGS=...</code></dt>

      <dt><code>NOTEST_LDFLAGS=...</code></dt>

      <dt><code>NOTEST_LIBS=...</code></dt>

      <dd>These variables share the same function as their
      non-NOTEST namesakes. However, the variables are applied to
      the build process only after autoconf has performed its
      feature testing. This allows the inclusion of flags which
      will cause problems during feature testing, but must be used
      for the final compilation.</dd>

      <dt><code>SHLIB_PATH=...</code></dt>

      <dd>Options which specify shared library paths for the
      compiler and linker.</dd>
    </dl>

    <h4><a id="output" name="output">autoconf Output
    Options</a></h4>

    <dl>
      <dt><code>--help</code></dt>

      <dd>Prints the usage message including all available options,
      but does not actually configure anything.</dd>

      <dt><code>--quiet</code></dt>

      <dd>Prevents the printing of the usual "checking..."
      messages.</dd>

      <dt><code>--verbose</code></dt>

      <dd>Prints much more information during the configuration
      process, including the names of all the files examined.</dd>
    </dl>

    <h4><a id="pathnames" name="pathnames">Pathnames</a></h4>

    <p>There are currently two ways to configure the pathnames
    under which Apache will install its files. First, you can
    specify a directory and have Apache install itself under that
    directory in its default locations.</p>

    <dl>
      <dt><code>--prefix=<em>PREFIX</em></code> [Default:
      /usr/local/apache2]</dt>

      <dd>Specifies the directory under which the Apache files will
      be installed.</dd>
    </dl>

    <p>It is possible to specify that architecture-dependent files
    should be placed under a different directory.</p>

    <dl>
      <dt><code>--exec-prefix=<em>EPREFIX</em></code> [Default:
      <em>PREFIX</em>]</dt>

      <dd>Specifies the directory under which
      architecture-dependent files will be placed.</dd>
    </dl>

    <p>The second, and more flexible way to configure the install
    path locations for Apache is using the
    <code>config.layout</code> file. Using this method, it is
    possible to separately specify the location for each type of
    file within the Apache installation. The
    <code>config.layout</code> file contains several example
    configurations, and you can also create your own custom
    configuration following the examples. The different layouts in
    this file are grouped into <code>&lt;Layout
    FOO&gt;...&lt;/Layout&gt;</code> sections and referred to by
    name as in <code>FOO</code>.</p>

    <dl>
      <dt><code>--enable-layout=<em>LAYOUT</em></code></dt>

      <dd>Use the named layout in the <code>config.layout</code>
      file to specify the installation paths.</dd>
    </dl>

    <p>Presently it is not possible to mix the
    <code>--enable-layout</code> and <code>--prefix</code> options.
    Nor is it possible to individually specify detailed pathnames
    on the <code>configure</code> command line. If you want just a
    basic install, you can simply use the <code>--prefix</code>
    option on its own. If you want to customize your install, you
    should edit the <code>config.layout</code> file and use the
    <code>--enable-layout</code> option.</p>

    <h4><a id="modules" name="modules">Modules</a></h4>

    <p>Apache is a modular server. Only the most basic
    functionality is included in the core server. Extended features
    are available in various modules. During the configuration
    process, you must select which modules to compile for use with
    your server. You can view a <a
    href="mod/index.html">list of modules</a> included in
    the documentation. Those modules with a <a
    href="mod/module-dict.html#Status">status</a> of "Base" are
    included by default and must be specifically disabled if you do
    not want them. Modules with any other status must be
    specifically enabled if you wish to use them.</p>

    <p>There are two ways for a module to be compiled and used with
    Apache. Modules may be <em>statically compiled</em>, which
    means that they are permanently included in the Apache binary.
    Alternatively, if your operating system supports Dynamic Shared
    Objects (DSOs) and autoconf can detect that support, then
    modules may be <em>dynamically compiled</em>. DSO modules are
    stored separately from the Apache binary, and may be included
    or excluded from the server using the run-time configuration
    directives provided by <a href="mod/mod_so.html">mod_so</a>.
    The mod_so is automatically included in the server if any
    dynamic modules are included in the compilation. If you would
    like to make your server capable of loading DSOs without
    actually compiling any dynamic modules, you can explicitly
    <code>--enable-so</code>.</p>

    <dl>
      <dt><code>--enable-<em>MODULE</em>[=shared]</code></dt>

      <dd>Compile and include the module <em>MODULE</em>. The
      identifier <em>MODULE</em> is the <a
      href="mod/module-dict.html#ModuleIdentifier">Module
      Identifier</a> from the module documentation without the
      "_module" string. To compile the module as a DSO, add the
      option <code>=shared</code>.</dd>

      <dt><code>--disable-<em>MODULE</em></code></dt>

      <dd>Remove the module <em>MODULE</em> which would otherwise
      be compiled and included.</dd>

      <dt><code>--enable-modules=<em>MODULE-LIST</em></code></dt>

      <dd>Compile and include the modules listed in the
      space-separated <em>MODULE-LIST</em>.</dd>

      <dt>
      <code>--enable-mods-shared=<em>MODULE-LIST</em></code></dt>

      <dd>Compile and include the modules in the space-separated
      <em>MODULE-LIST</em> as dynamically loadable (DSO)
      modules.</dd>
    </dl>

    <p>The <em>MODULE-LIST</em> in the
    <code>--enable-modules</code> and
    <code>--enable-mods-shared</code> options is usually a
    space-separated list of module identifiers. For example, to
    enable mod_dav and mod_info, you can either use</p>

    <blockquote>
      <code>./configure --enable-dav --enable-info</code>
    </blockquote>

    <p>or, equivalently,</p>

    <blockquote>
      <code>./configure --enable-modules="dav info"</code>
    </blockquote>

    <p>In addition, the special keywords <code>all</code> or
    <code>most</code> can be used to add all or most of the modules
    in one step. You can then remove any modules that you do not
    want with the <code>--disable-<em>MODULE</em></code> option.
    For example, to include all modules as DSOs with the exception
    of mod_info, you can use</p>

    <blockquote>
      <code>./configure --enable-mods-shared=all
      --disable-info</code>
    </blockquote>

    <p>In addition to the standard set of modules, Apache 2.0 also
    includes a choice of <a href="mpm.html">Multi-Processing
    Modules</a> (MPMs). One, and only one MPM must be included in
    the compilation process. The default MPMs for each platform are
    listed on the <a href="mpm.html">MPM documentation page</a>,
    but can be overridden on the <code>configure</code> command
    line.</p>

    <dl>
      <dt><code>--with-mpm=<em>NAME</em></code></dt>

      <dd>Choose the mpm <em>NAME</em>.</dd>
    </dl>

    <h4><a id="suexec" name="suexec">Suexec</a></h4>

    <p>Apache includes a support program called <a
    href="suexec.html">suexec</a> which can be used to isolate user
    CGI programs. However, if suexec is improperly configured, it
    can cause serious security problems. Therefore, you should
    carefully read and consider the <a href="suexec.html">suexec
    documentation</a> before implementing this feature.</p>

    <h3><a id="compile" name="compile">Build</a></h3>

    <p>Now you can build the various parts which form the Apache
    package by simply running the command:</p>

    <blockquote>
      <code>$ make</code>
    </blockquote>

    <p>Please be patient here, since a base configuration takes
    approximately 3 minutes to compile under a Pentium III/Linux
    2.2 system, but this will vary widely depending on your
    hardware and the number of modules which you have enabled.</p>

    <h3><a id="install" name="install">Install</a></h3>

    <p>Now its time to install the package under the configured
    installation <em>PREFIX</em> (see <code>--prefix</code> option
    above) by running:</p>

    <blockquote>
      <code>$ make install</code>
    </blockquote>

    <p>If you are upgrading, the installation will not overwrite
    your configuration files or documents.</p>

    <h3><a id="customize" name="customize">Customize</a></h3>

    <p>Next, you can customize your Apache HTTP server by editing
    the <a href="configuring.html">configuration files</a> under
    <em>PREFIX</em>/conf/.</p>

    <blockquote>
      <code>$ vi <em>PREFIX</em>/conf/httpd.conf</code>
    </blockquote>

    <p>Have a look at the Apache manual under <a
    href="./">docs/manual/</a> or <a
    href="http://httpd.apache.org/docs/">http://httpd.apache.org/docs/</a>
    for a complete reference of available <a
    href="mod/directives.html">configuration directives</a>.</p>

    <h3><a id="test" name="test">Test</a></h3>

    <p>Now you can <a href="invoking.html">start</a> your Apache
    HTTP server by immediately running:</p>

    <blockquote>
      <code>$ <em>PREFIX</em>/bin/apachectl start</code>
    </blockquote>

    <p>and then you should be able to request your first document
    via URL http://localhost/. The web page you see is located
    under the <a href="mod/core.html#documentroot">DocumentRoot</a>
    which will usually be <code><em>PREFIX</em>/htdocs/</code>.
    Then <a href="stopping.html">stop</a> the server again by
    running:</p>

    <blockquote>
      <code>$ <em>PREFIX</em>/bin/apachectl stop</code>
    </blockquote>
    <!--#include virtual="footer.html" -->
  </body>
</html>

