<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<HTML>
<HEAD>
<TITLE>Using Apache with Microsoft Windows</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">Using Apache With Microsoft Windows</H1>

<P>This document explains how to install, configure and run
   Apache 1.3 under Microsoft Windows. Please note that at
   this time, Windows support is entirely experimental, and is
   recommended only for experienced users. The Apache Group does not
   guarantee that this software will work as documented, or even at
   all. If you find any bugs, or wish to contribute in other ways, please
   use our <A HREF="http://www.apache.org/bug_report.html">bug reporting
   page.</A></P>

<P><STRONG>Warning: Apache on NT has not yet been optimized for performance.
Apache still performs best, and is most reliable on Unix platforms.  Over
time we will improve NT performance. Folks doing comparative reviews
of webserver performance are asked to compare against Apache
on a Unix platform such as Solaris, FreeBSD, or Linux.</STRONG></P>

<P>

Most of this document assumes that you are installing Windows from a
binary distribution. If you want to compile Apache yourself (possibly
to help with development, or to track down bugs), see the section on
<A HREF="#comp">Compiling Apache for Windows</A> below.

<HR>

<UL>
  <LI><A HREF="#req">Requirements</A>
  <LI><A HREF="#down">Downloading Apache for Windows</A>
  <LI><A HREF="#inst">Installing Apache for Windows (binary install)</A>
  <LI><A HREF="#run">Running Apache for Windows</A>
  <LI><A HREF="#use">Using Apache for Windows</A>
  <LI><A HREF="#cmdline">Running Apache for Windows from the Command Line</A>
  <LI><A HREF="#service">Running Apache for Windows as a Service</A>
  <LI><A HREF="#signal">Signalling Console Apache when running</A>
  <LI><A HREF="#signalsrv">Signalling Service Apache when running</A>
  <LI><A HREF="#comp">Compiling Apache for Windows</A>
</UL>

<HR>

<H2><A NAME="req">Requirements</A></H2>

Apache 1.3 is designed to run on Windows NT 4.0. The binary installer
will only work in Intel processors. Apache may also run on Windows 95,
Windows 98 and Windows NT 3.5.1, but these have not been tested. In
all cases TCP/IP networking must be installed.

<P>

If running on Windows 95, using the "Winsock2" upgrade is recommended
but may not be necessary.  If running on NT 4.0, installing Service Pack 2
is recommended.

<P>

<STRONG>Note: "Winsock 2" is required for Apache 1.3.7 and later.</STRONG>

<P>

"Winsock 2" for Windows 95 is available <A HREF="http://www.microsoft.com/windows95/downloads/">here.</A>

<H2><A NAME="down">Downloading Apache for Windows</A></H2>

<P>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 alpha or beta-test releases,
together with details of mirror web and anonymous ftp sites.</P>

<P>

You should download the version of Apache for Windows with the
<CODE>.exe</CODE> extension. This is a single file containing Apache,
ready to install and run. There may also be a <CODE>.zip</CODE> file
containing the source code, to compile Apache yourself.  (If there is
no <SAMP>.zip</SAMP> file, the source will be available in a
<SAMP>.tar.gz</SAMP> file but this will contain Unix line endings. You
will have to convert at least the <SAMP>.mak</SAMP> and
<SAMP>.dsp</SAMP> files to have DOS line endings before MSVC will
understand them).

<H2><A NAME="inst">Installing Apache for Windows</A></H2>

Run the Apache <SAMP>.exe</SAMP> file you downloaded above. This will
ask for:

<UL>

 <LI>the directory to install Apache into (the default is 
    <CODE>\Program Files\Apache Group\Apache</CODE> although you can
    change this to any other directory)

 <LI>the start menu name (default is "Apache Web Server")

 <LI>the installation type. The "Typical" option installs
    everything except the source code. The "Minimum" option does not
    install the manuals or source code. Choose the "Custom" install if
    you want to install the source code.

</UL>

<P>

During the installation, Apache will configure the files in the
<SAMP>conf</SAMP> directory for your chosen installation
directory. However if any of the files in this directory already exist
they will <STRONG>not</STRONG> be overwritten. Instead the new copy of
the corresponding file will be left with the extension
<SAMP>.default</SAMP>. So, for example, if
<SAMP>conf\httpd.conf</SAMP> already exists it will not be altered,
but the version which would have been installed will be left in
<SAMP>conf\httpd.conf.default</SAMP>. After the installation has
finished you should manually check to see what in new in the
<SAMP>.default</SAMP> file, and if necessary update your existing
configuration files.

<P>

Also, if you already have a file called <SAMP>htdocs\index.html</SAMP>
then it will not be overwritten (no <SAMP>index.html.default</SAMP>
file will be installed either). This should mean it a safe to install
Apache over an existing installation (but you will have to stop the
existing server running before doing the installation, then start the
new one after the installation is finished).

<P>

After installing Apache, you should edit the configuration files in
the <SAMP>conf</SAMP> directory as required. These files will be
configured during the install ready for Apache to be run from the
directory where it was installed, with the documents served from the
subdirectory <SAMP>htdocs</SAMP>. There are lots of other options
which should be set before you start really using Apache. However to
get started quickly the files should work as installed.

<H2><A NAME="run">Running Apache for Windows</A></H2>

There are two ways you can run Apache:

<UL>
 <LI>As a <A HREF="#service">"service"</A> (available on NT only). This is the best option if
    you want Apache to automatically start when you machine boots, and to
    keep Apache running when you log-off.

 <LI>From a <A HREF="#cmdline">console window</A>. This is the only option
    available for
    Windows 95 users.
</UL>

To start Apache as a service, you first need to install it as a
service. Multiple Apache services can be installed, each with a
different name and configuration.  To install the default Apache
service named "Apache", run the "Install Apache as Service (NT only)"
option from the Start menu. Once this is done you can start the "Apache"
service by opening the Services window (in the Control Panel), selecting Apache,
then clicking on Start. Apache will now be running in the background. You
can later stop Apache by clicking on Stop. As an alternative to using
the Services window, you can start and stop the "Apache" service from the control
line with

<PRE>
  NET START APACHE
  NET STOP APACHE
</PRE>

See <A HREF="#signalsrv">Signalling Service Apache when Running</A>
for more information on installing and controlling Apache services.

<P>

To run Apache from a console window, select the "Start Apache as
console app" option from the Start menu (in Apache 1.3.4 and earlier,
this option was called "Apache Server"). This will open a console
window and start Apache running inside it. The window will remain
active until you stop Apache. To stop Apache running, either select
the "Shutdown Apache console app" icon option from the Start menu
(this is not available in Apache 1.3.4 or earlier), or see <A
HREF="#signal">Signalling Console Apache when Running</A> for how
to control Apache from the command line.

<P>

After starting Apache running (either in a console window or as a
service) if will be listening to port 80 (unless you changed the
<SAMP>Port</SAMP>, <SAMP>Listen</SAMP> or <SAMP>BindAddress</SAMP>
directives in the configuration files). To connect to the server and
access the default page, launch a browser and enter this URL:

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

This should respond with a welcome page, and a link to the Apache
manual. If nothing happens or you get an error, look in the
<SAMP>error_log</SAMP> file in the <SAMP>logs</SAMP> directory.
If your host isn't connected to the net, you may have to use
this URL:

<PRE>
  http://127.0.0.1/
</PRE>

<P>

Once your basic installation is working, you should configure it
properly by editing the files in the <SAMP>conf</SAMP> directory.

<H2><A NAME="use">Configuring Apache for Windows</A></H2>

Apache is configured by files in the <SAMP>conf</SAMP>
directory. These are the same as files used to configure the Unix
version, but there are a few different directives for Apache on
Windows. See the <A HREF="./">Apache documentation</A> for all the
available directives.

<P>

The main differences in Apache for Windows are:

<UL>
  <LI><P>Because Apache for Windows is multithreaded, it does not use a
      separate process for each request, as Apache does with
      Unix. Instead there are usually only two Apache processes running:
      a parent process, and a child which handles the requests. Within
      the child each request is handled by a separate thread.
      <P>

      So the "process"-management directives are different:
      <P><A
         HREF="mod/core.html#maxrequestsperchild">MaxRequestsPerChild</A>
         - Like the Unix directive, this controls how many requests a
           process will serve before exiting. However, unlike Unix, a
           process serves all the requests at once, not just one, so if
           this is set, it is recommended that a very high number is
           used. The recommended default, <CODE>MaxRequestsPerChild
           0</CODE>, does not cause the process to ever exit.
      <P><A HREF="mod/core.html#threadsperchild">ThreadsPerChild</A> -
         This directive is new, and tells the server how many threads it
         should use. This is the maximum number of connections the server
         can handle at once; be sure and set this number high enough for
         your site if you get a lot of hits. The recommended default is
         <CODE>ThreadsPerChild 50</CODE>.</P>
  <LI><P>The directives that accept filenames as arguments now must use
      Windows filenames instead of Unix ones. However, because Apache
      uses Unix-style names internally, you must use forward slashes, not
      backslashes. Drive letters can be used; if omitted, the drive with
      the Apache executable will be assumed.</P>
  <LI><P>Apache for Windows contains the ability to load modules at runtime,
      without recompiling the server. If Apache is compiled normally, it
      will install a number of optional modules in the
      <CODE>\Apache\modules</CODE> directory. To activate these, or other
      modules, the new <A HREF="mod/mod_so.html#loadmodule">LoadModule</A>
      directive must be used. For example, to active the status module,
      use the following (in addition to the status-activating directives
      in <CODE>access.conf</CODE>):</P>
<PRE>
    LoadModule status_module modules/ApacheModuleStatus.dll
</PRE>
      <P>Information on <A HREF="mod/mod_so.html#creating">creating loadable
         modules</A> is also available.</P>
  <LI><P>Apache can also load ISAPI Extensions (<EM>i.e.</EM>, Internet Server
         Applications), such as those used by Microsoft's IIS, and other
         Windows servers. <A HREF="mod/mod_isapi.html">More information
         is available.</A>
</UL>

<H2><A NAME="service">Running Apache for Windows as a Service</A></H2>
 <STRONG>Note: The -n option to specify a service name is only available
 with Apache 1.3.7 and later.  Earlier versions of Apache only support
 the default service name 'Apache'.</STRONG>

<P>

You can install Apache as a Windows NT service as follows:

<PRE>
    apache -i -n "service name"
</PRE>

To install a service to use a particular configuration, specify the
configuration file when the service is installed:

<PRE>
    apache -i -n "service name" -f "\my server\conf\my.conf"
</PRE>

To remove an Apache service, use

<PRE>
    apache -u -n "service name"
</PRE>

The default "service name", if one is not specified, is "Apache".

<P>

Once a service is installed, you can use the <SAMP>-n</SAMP> option, in conjunction
with other options, to refer to a service's configuration file.  For example:<br>

To test a service's configuration file:
<PRE>
    apache -n "service name" -t
</PRE>

To start a console Apache using a service's configuration file:
<PRE>
    apache -n "service name"
</PRE>

<H2><A NAME="cmdline">Running Apache for Windows from the Command Line</A></H2>

The Start menu icons and the NT Service manager can provide a simple
interface for administering Apache. But in some cases it is easier to
work from the command line.

<P>
When working with Apache it is important to know how it will find the
configuration files.  You can specify a configuration file on the command line
in two ways:

<UL>
<LI>-f specifies a path to a particular configuration file
</UL>
<PRE>    apache -f "c:\my server\conf\my.conf"</PRE>
<PRE>    apache -f test\test.conf</PRE>
<UL>
<LI>-n specifies the configuration file of an installed Apache service (Apache 1.3.7 and later)
</UL>
<PRE>    apache -n "service name"</PRE>

In these cases, the proper ServerRoot should be set in the configuration file.

<P>

If you don't specify a configuration file name with -f or -n, Apache will
use the file name compiled into the server, usually "conf/httpd.conf".  Invoking
Apache with the -V switch will display this value labeled as SERVER_CONFIG_FILE.
Apache will then determine its ServerRoot by trying the following, in this order:

<UL>
<LI>A ServerRoot directive via a -C switch.
<LI>The -d switch on the command line.
<LI>Current working directory
<LI>A registry entry, created if you did a binary install.
<LI>The server root compiled into the server.
</UL>

<P>
The server root compiled into the server is usually "/apache".
invoking apache with the -V switch will display this value
labeled as HTTPD_ROOT.

<P>
When invoked from the start menu, Apache is usually passed no arguments,
so using the registry entry is the preferred technique for console Apache.

<P>
During a binary installation, a registry key will have
been installed, for example:
<PRE>
  HKEY_LOCAL_MACHINE\Software\Apache Group\Apache\1.3.4\ServerRoot
</PRE>

<P>
This key is compiled into the server and can enable you to test 
new versions without affecting the current version.  Of course
you must take care not to install the new version on top of the
old version in the file system.

<P>
If you did not do a binary install then Apache will in some
scenarios complain that about the missing registry key.  This
warning can be ignored if it otherwise was able to find its
configuration files.

<P>
The value of this key is the "ServerRoot" directory, containing the
<SAMP>conf</SAMP> directory. When Apache starts it will read the
<SAMP>httpd.conf</SAMP> file from this directory. If this file
contains a <SAMP>ServerRoot</SAMP> directive which is different from
the directory obtained from the registry key above, Apache will forget
the registry key and use the directory from the configuration file.
If you copy the Apache directory or configuration files to a new
location it is vital that you update the <SAMP>ServerRoot</SAMP>
directory in the <SAMP>httpd.conf</SAMP> file to the new location.

<P>
To run Apache from the command line as a console application, use the
following command:

<PRE>
    apache 
</PRE>

Apache will execute, and will remain running until it is stopped by pressing
control-C.

<H2><A NAME="signalsrv">Signalling Service Apache when running</A></H2>

On Windows NT, multiple instances of Apache can be run as services.
Signal an Apache service to start, restart, or shutdown as follows:

<PRE>
    apache -n "service name" -k start
    apache -n "service name" -k restart
    apache -n "service name" -k shutdown
</PRE>

In addition, you can use the native NT NET command to
start and stop Apache services as follows:

<PRE>
    NET START "service name"
    NET STOP "service name"
</PRE>

<H2><A NAME="signal">Signalling Console Apache when running</A></H2>

On Windows 95, Apache runs as a console application. You can tell a
running Apache to stop by opening another console window and running

<PRE>
    apache -k shutdown
</PRE>
<BLOCKQUOTE>
 <STRONG>Note: This option is only available with Apache 1.3.3 and
 later.  For earlier versions, you need to use Control-C in the
 Apache console window to shut down the server.</STRONG>
</BLOCKQUOTE>

<P>
This should be used instead of pressing Control-C in the running
Apache console window, because it lets Apache end any current
transactions and cleanup gracefully.

<P>

You can also tell Apache to restart. This makes it re-read the
configuration files. Any transactions in progress are allowed to
complete without interruption. To restart Apache, run

<PRE>
    apache -k restart
</PRE>
<BLOCKQUOTE>
 <STRONG>Note: This option is only available with Apache 1.3.3 and
 later.  For earlier versions, you need to use Control-C in the
 Apache console window to shut down the server.</STRONG>
</BLOCKQUOTE>

<P>
Note for people familiar with the Unix version of Apache: these
commands provide a Windows equivalent to <CODE>kill -TERM
<EM>pid</EM></CODE> and <CODE>kill -USR1 <EM>pid</EM></CODE>. The command
line option used, <CODE>-k</CODE>, was chosen as a reminder of the
"kill" command used on Unix.

<H2><A NAME="comp">Compiling Apache for Windows</A></H2>

<P>Compiling Apache requires Microsoft Visual C++ 5.0 to be properly
   installed. It is easiest to compile with the command-line tools
   (nmake, <EM>etc.</EM>..). Consult the VC++ manual to determine how to install
   them.</P>

<P>First, unpack the Apache distribution into an appropriate
   directory. Open a command-line prompt, and change to the
   <CODE>src</CODE> subdirectory of the Apache distribution.</P>

<P>The master Apache makefile instructions are contained in the
   <CODE>Makefile.nt</CODE> file. To compile Apache on Windows NT, simply
   use one of the following commands:
<UL>
<LI><CODE>nmake /f Makefile.nt _apacher</CODE> (release build)
<LI><CODE>nmake /f Makefile.nt _apached</CODE> (debug build)
</UL>

<P><em>(1.3.4 and later)</em> To compile Apache on Windows 95, use one of
<UL>
<LI><CODE>nmake /f Makefile_win32.txt</CODE> (release build)
<LI><CODE>nmake /f Makefile_win32_debug.txt</CODE> (debug build)
</UL>

<P>These will both compile Apache. The latter will include debugging
   information in the resulting files, making it easier to find bugs and
   track down problems.</P>

<P>Apache can also be compiled using VC++'s Visual Studio development
   environment. Although compiling Apache in this manner is not as
   simple, it makes it possible to easily modify the Apache source, or
   to compile Apache if the command-line tools are not installed.
   Project files (<CODE>.DSP</CODE>) are included for each of the
   portions of Apache. To build Apache from the these projects files
   you will need to build the following projects <EM>in this order</EM>:

 <OL>
   <LI><CODE>os\win32\ApacheOS.dsp</CODE>
   <LI><CODE>regex\regex.dsp</CODE>
   <LI><CODE>ap\ap.dsp</CODE>
   <LI><CODE>main\gen_uri_delims.dsp</CODE>
   <LI><CODE>main\gen_test_char.dsp</CODE>
   <LI><CODE>ApacheCore.dsp</CODE>
   <LI><CODE>Apache.dsp</CODE>
 </OL>

   In addition, the <CODE>src\os\win32</CODE> subdirectory contains
   project files for the optional modules (see below).</P>

<P>Once Apache has been compiled, it needs to be installed in its server
   root directory. The default is the <CODE>\Apache</CODE>
   directory, on the current hard drive. </P>

<P>To install the files into the <CODE>\Apache</CODE> directory
   automatically, use one the following nmake commands (see above):</P>
<UL>
<LI><CODE>nmake /f Makefile.nt installr INSTDIR=<EM>dir</EM></CODE>
 (for release build)
<LI><CODE>nmake /f Makefile.nt installd INSTDIR=<EM>dir</EM></CODE>
 (for debug build)
</UL>
or, for Windows 95 (1.3.4 and later), use one of:
<UL>
<LI><CODE>nmake /f Makefile_win32.txt install INSTDIR=<EM>dir</EM></CODE>
 (for release build)
<LI><CODE>nmake /f Makefile_win32_debug.txt install INSTDIR=<EM>dir</EM></CODE>
 (for debug build)
</UL>

The dir argument to INSTDIR gives the installation directory; it can
be omitted if Apache is to be installed into <SAMP>\Apache</SAMP>.

<P>This will install the following:</P>

<UL>
  <LI><CODE><EM>dir</EM>\Apache.exe</CODE> - Apache executable
  <LI><CODE><EM>dir</EM>\ApacheCore.dll</CODE> - Main Apache shared library
  <LI><CODE><EM>dir</EM>\modules\ApacheModule*.dll</CODE> - Optional Apache
      modules (7 files)
  <LI><CODE><EM>dir</EM>\conf</CODE> - Empty configuration directory
  <LI><CODE><EM>dir</EM>\logs</CODE> - Empty logging directory
</UL>

<P>If you do not have nmake, or wish to install in a different directory,
   be sure to use a similar naming scheme.</P>

<P>
Before running the server you must fill out the conf directory.
Copy the *.conf-dist-win from the distribution conf directory
and rename *.conf.  Edit the @@ServerRoot@@ entries to your
actual server root (for example "C:\apache").  Copy over
the conf/magic and conf/mime.types files as well.

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

