
  APACHE INSTALLATION OVERVIEW

  Quick Start - Unix
  ------------------

  For complete installation documentation, see [ht]docs/manual/install.html or
  http://httpd.apache.org/docs-2.0/install.html

     $ ./configure --prefix=PREFIX
     $ make
     $ make install
     $ PREFIX/bin/apachectl start

     NOTES: * Replace PREFIX with the filesystem path under which 
              Apache should be installed.  A typical installation
              might use "/usr/local/apache2" for PREFIX (without the
              quotes).

            * If you are building on FreeBSD, be aware that threads will
              be disabled and the prefork MPM will be used by default,
              as threads do not work well with Apache on FreeBSD.  If
              you wish to try a threaded Apache on FreeBSD anyway, use
              "./configure --enable-threads".

            * If you are building on Mac OS X (Darwin), make sure to
              use libtool 1.4.2 or newer.

            * If you are a developer building Apache directly from CVS,
              you will need to run ./buildconf before running configure.

  For a short impression of what possibilities you have, here is a
  typical example which configures 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:

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

  The easiest way to find all of the configuration flags for Apache 2.0
  is to run ./configure --help.


  Quick Start - Windows
  ---------------------

  For complete documentation, see [ht]docs/manual/platform/windows.html or
  http://httpd.apache.org/docs-2.0/platform/windows.html.

  The Apache/Win32 binaries are primarily distributed as a Windows Installer 
  package (.msi), and may be available as a .zip file as well.  These packages 
  are named apache-2.0.xx-win32-x86.msi and apache-2.0.xx-win32-x86.zip.  
  Please choose the .msi package if at all possible.

  If you have unpacked a source distribution (named httpd-2.0-xx.zip, without
  any -win32-x86 notation) you must compile the package yourself, see the links
  mentioned above.  Unless you intended to do this, please look again for the 
  binary package from http://www.apache.org/dist/httpd/binaries/win32/ and
  install that .msi (or .zip package, if you must.)

  If you have unpacked this binary distribution from the .zip package, you 
  _must_ edit the conf/httpd.conf file (with notepad or another text editor) 
  to reflect the correct ServerName, Domain, and directory paths.  Search for 
  the text "@@" to discover what you must edit.  To install and start the 
  service after you have corrected the httpd.conf file, use the command

    bin\Apache -k install
    bin\Apache -k start

  The .msi package configures the httpd.conf file, and installs and starts 
  the Apache2 service for you.  It also installs plenty of useful shortcuts
  and the taskbar ApacheMonitor.  We strongly encourage you to use it.


  Postscript
  ----------

  The Apache HTTP Server group cannot field user's installation questions.
  There are many valuable forums to help you get started.  Please refer your
  questions to the appropriate forum, such as the Users Mailing List at
  http://httpd.apache.org/userslist.html or the usenet newsgroups
  comp.infosystems.www.servers.unix or
  comp.infosystems.www.servers.ms-windows.

  Thanks for using the Apache HTTP Server, version 2.0.

                                     The Apache Software Foundation
                                     http://www.apache.org/
