<!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.3</H1>

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
<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
  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, 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
  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
&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, 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>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.

<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/local/apache/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/apache/httpd -f /usr/local/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
<EM>child</EM> 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.<EM>N</EM></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/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>
