<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<HTML>
<HEAD>
<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" -->

<blockquote><strong>Warning:</strong>
This document has not been updated to take into account changes
made in the 2.0 version of the Apache HTTP Server.  Some of the
information may still be relevant, but please use it
with care.
</blockquote>

<H1 ALIGN="CENTER">Compiling and Installing Apache 1.3</H1>

This document covers compilation and installation of Apache on Unix
systems only. For compiling and installation on Windows, see <A
HREF="platform/windows.html">Using Apache with Microsoft Windows</A> and for
TPF see <A HREF="platform/install-tpf.html">Installing the Apache 1.3 HTTP
Server on TPF</A>.

<P>

UnixWare users will want to consult <A HREF="platform/unixware.html">build notes</A>
for various UnixWare versions before compiling.

<H2>Downloading Apache</H2>

Information on the latest version of Apache can be found on the Apache
web server at <A
HREF="http://www.apache.org/">http://www.apache.org/</A>.  This will
list the current release, any more recent beta-test release, together
with details of mirror web and anonymous ftp sites.

<P>

If you downloaded a binary distribution, skip to <A
HREF="#install">Installing Apache</A>. Otherwise read the next section
for how to compile the server.

<H2>Compiling Apache</H2>

Compiling Apache consists of three steps: Firstly select which Apache
<STRONG>modules</STRONG> you want to include into the server. Secondly create a
configuration for your operating system. Thirdly compile the
executable.
<P>

All configuration of Apache is performed in the <CODE>src</CODE>
directory of the Apache distribution. Change into this directory.

<OL>
 <LI>
  Select modules to compile into Apache in the
  <CODE>Configuration</CODE> file. Uncomment lines corresponding to
  those optional modules you wish to include (among the AddModule lines
  at the bottom of the file), or add new lines corresponding to
  additional modules you have downloaded or written. (See <A
  HREF="misc/API.html">API.html</A> for preliminary docs on how to
  write Apache modules).  Advanced users can comment out some of the
  default modules if they are sure they will not need them (be careful
  though, since many of the default modules are vital for the correct
  operation and security of the server).
  <P>

  You should also read the instructions in the <CODE>Configuration</CODE>
  file to see if you need to set any of the <CODE>Rule</CODE> lines.


 <LI>
  Configure Apache for your operating system. Normally you can just
  run the <CODE>Configure</CODE> script as given below. However
  if this fails or you have any special requirements (<EM>e.g.</EM>, to include
  an additional library required by an optional module) you might need
  to edit one or more of the following options in the
  <CODE>Configuration</CODE> file:
    <CODE>EXTRA_CFLAGS, LIBS, LDFLAGS, INCLUDES</CODE>.
  <P>

  Run the <CODE>Configure</CODE> script:
  <BLOCKQUOTE>
   <PRE>
    % Configure
    Using 'Configuration' as config file
     + configured for &lt;whatever&gt; platform
     + setting C compiler to &lt;whatever&gt; *
     + setting C compiler optimization-level to &lt;whatever&gt; *
     + Adding selected modules
     + doing sanity check on compiler and options
    Creating Makefile in support
    Creating Makefile in main
    Creating Makefile in os/unix
    Creating Makefile in modules/standard
   </PRE>
  </BLOCKQUOTE>

  (*: Depending on Configuration and your system, Configure
  might not print these lines. That's OK).<P>

  This generates a Makefile for use in stage 3. It also creates a
  Makefile in the support directory, for compilation of the optional
  support programs.
  <P>

  (If you want to maintain multiple configurations, you can give an
  option to <CODE>Configure</CODE> to tell it to read an alternative
  Configuration file, such as <CODE>Configure -file
  Configuration.ai</CODE>).
  <P>

 <LI>
  Type <CODE>make</CODE>.
</OL>

The modules we place in the Apache distribution are the ones we have
tested and are used regularly by various members of the Apache
development group.  Additional modules contributed by members or third
parties with specific needs or functions are available at
&lt;<A HREF="http://www.apache.org/dist/contrib/modules/"
    >http://www.apache.org/dist/contrib/modules/</A>&gt;.
There are instructions on that page for linking these modules into the
core Apache code.

<H2><A NAME="install">Installing Apache</A></H2>

You will have a binary file called <CODE>httpd</CODE> in the
<CODE>src</CODE> directory.  A binary distribution of Apache will
supply this file.  <P>

The next step is to install the program and configure it. Apache is
designed to be configured and run from the same set of directories
where it is compiled. If you want to run it from somewhere else, make
a directory and copy the <CODE>conf</CODE>, <CODE>logs</CODE> and
<CODE>icons</CODE> directories into it.  In either case you should
read the <A HREF="misc/security_tips.html#serverroot">security tips</A>
describing how to set the permissions on the server root directory.<P>

The next step is to edit the configuration files for the server. This
consists of setting up various <STRONG>directives</STRONG> in up to three
central configuration files. By default, these files are located in
the <CODE>conf</CODE> directory and are called <CODE>srm.conf</CODE>,
<CODE>access.conf</CODE> and <CODE>httpd.conf</CODE>.  To help you get
started there are same files in the <CODE>conf</CODE> directory of the
distribution, called <CODE>srm.conf-dist</CODE>,
<CODE>access.conf-dist</CODE> and <CODE>httpd.conf-dist</CODE>. Copy
or rename these files to the names without the <CODE>-dist</CODE>.
Then edit each of the files. Read the comments in each file carefully.
Failure to setup these files correctly could lead to your server not
working or being insecure. You should also have an additional file in
the <CODE>conf</CODE> directory called <CODE>mime.types</CODE>. This
file usually does not need editing.

<P>

First edit <CODE>httpd.conf</CODE>.  This sets up general attributes
about the server: the port number, the user it runs as, <EM>etc.</EM>  Next
edit the <CODE>srm.conf</CODE> file; this sets up the root of the
document tree, special functions like server-parsed HTML or internal
imagemap parsing, <EM>etc.</EM>  Finally, edit the <CODE>access.conf</CODE>
file to at least set the base cases of access.

<P>

In addition to these three files, the server behavior can be configured
on a directory-by-directory basis by using <CODE>.htaccess</CODE>
files in directories accessed by the server.

<H3>Set your system time properly!</H3>

Proper operation of a public web server requires accurate time
keeping, since elements of the HTTP protocol are expressed as the time
of day.  So, it's time to investigate setting up NTP or some other
time synchronization system on your Unix box, or whatever the
equivalent on NT would be.

<H2>Compiling Support Programs</H2>

In addition to the main <CODE>httpd</CODE> server which is compiled
and configured as above, Apache includes a number of support programs.
These are not compiled by default. The support programs are in the
<CODE>support</CODE> directory of the distribution. To compile
the support programs, change into this directory and type
<PRE>
    make
</PRE>

<!--#include virtual="footer.html" -->
</BODY>
</HTML>
