<!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" -->

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

<P>If you wish to download and install an earlier version of Apache please
read <A HREF="install_1_1.html">Compiling and Installing Apache 1.1</A>.</P>

UnixWare users will want to consult <A HREF="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
<b>modules</b> 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 Module 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
  type run the <CODE>Configure</CODE> script as given below. However
  if this fails or you have any special requirements (e.g. 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, LFLAGS, 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; *
    %
   </PRE>
  </BLOCKQUOTE>

  (*: Depending on Configuration and your system, Configure
  make 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 a
  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 <A
HREF="http://www.apache.org/dist/contrib/modules/">&lt;URL:http://www.apache.org/dist/contrib/modules/&gt;</a>.
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.  <P>

The next step is to edit the configuration files for the server. This
consists of setting up various <B>directives</B> 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, etc.  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, etc.  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>Starting and Stopping the Server</H3>

To start the server, simply run <CODE>httpd</CODE>. This will look for
<CODE>httpd.conf</CODE> in the location compiled into the code (by
default <CODE>/usr/locale/etc/httpd/conf/httpd.conf</CODE>). If
this file is somewhere else, you can give the real
location with the -f argument. For example:

<PRE>
    /usr/local/etc/apache/src/httpd -f /usr/local/etc/apache/conf/httpd.conf
</PRE>

If all goes well this will return to the command prompt almost
immediately.  This indicates that the server is now up and running. If
anything goes wrong during the initialization of the server you will
see an error message on the screen. 

If the server started ok, you can now use your browser to
connect to the server and read the documentation. If you are running
the browser on the same machine as the server and using the default
port of 80, a suitable URL to enter into your browser is

<PRE>
    http://localhost/
</PRE>

<P>

Note that when the server starts it will create a number of
<i>child</i> processes to handle the requests. If you started Apache
as the root user, the parent process will continue to run as root
while the children will change to the user as given in the httpd.conf
file. 

<P>

If when you run <CODE>httpd</CODE> it complained about being unable to
"bind" to an address, then either some other process is already using
the port you have configured Apache to use, or you are running httpd
as a normal user but trying to use port below 1024 (such as the
default port 80).

<P>

If the server is not running, read the error message displayed
when you run httpd. You should also check the server
error_log for additional information (with the default configuration,
this will be located in the file <CODE>error_log</CODE> in the
<CODE>logs</CODE> directory).

<P>

If you want your server to continue running after a system reboot, you
should add a call to <CODE>httpd</CODE> to your system startup files
(typically <CODE>rc.local</CODE> or a file in an
<CODE>rc.<I>N</I></CODE> directory). This will start Apache as root.
Before doing this ensure that your server is properly configured
for security and access restrictions.

<P>

To stop Apache send the parent process a TERM signal. The PID of this
process is written to the file <CODE>httpd.pid</CODE> in the
<CODE>logs</CODE> directory (unless configured otherwise).  Do not
attempt to kill the child processes because they will be renewed by
the parent.  A typical command to stop the server is:

<PRE>
    kill -TERM `cat /usr/local/etc/apache/logs/httpd.pid`
</PRE>

<P>

For more information about Apache command line options, configuration
and log files, see <A HREF="invoking.html">Starting Apache</A>. For a
reference guide to all Apache directives supported by the distributed
modules, see the <A HREF="mod/directives.html">Apache directives</A>.

<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>
