
  APACHE INSTALLATION OVERVIEW

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

  For complete installation documentation, see [ht]docs/manual/install.html or
  http://httpd.apache.org/docs/2.3/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).

            * Consider if you need to use the bundled APR and APR-Util
              via ./configure's --with-included-apr option, to use the
              bundled source instead of a previously installed APR and
              APR-Util (such as those provided with many OSes).  This
              is required if you don't have the compiler which the
              system APR was built with.  This can be advantageous if 
              you are a developer who will be linking your code with
              Apache or using a debugger to step through server code,
              as it removes the possibility of version or compile-option
              mismatches with APR and APR-util code.

            * If you are a developer building Apache directly from
              Subversion, you will need to run ./buildconf before running
              configure. This script bootstraps the build environment and
              requires Python as well as GNU autoconf and libtool. If you
              build Apache from a release tarball, you don't have to run
              buildconf.

            * If you want to build a threaded MPM (for instance worker)
              on  FreeBSD, be aware that threads do not work well with
              Apache on FreeBSD versions before 5.4-RELEASE. If you wish
              to try a threaded Apache on an earlier version of FreeBSD,
              use the --enable-threads parameter to ./configure in
              addition to the --with-mpm parameter.

            * If you are building directly from Subversion on Mac OS X
              (Darwin), make sure to use GNU Libtool 1.4.2 or newer. All
              recent versions of the developer tools on this platform
              include a sufficiently recent version of GNU Libtool (named
              glibtool, but buildconf knows where to find it).

  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.3
  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.3/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.3.xx-win32-x86.msi and apache-2.3.xx-win32-x86.zip.  
  Please choose the .msi package if at all possible. Note that Apache version
  2.3 is a development version and binaries may not be available. Use a 
  released version from the stable 2.2 branch instead. 

  If you have unpacked a source distribution (named httpd-2.3-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\httpd.exe -k install
    bin\httpd.exe -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.3.

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