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

<P>This document explains how to install, configure and run
   Apache 1.3 under Novell NetWare 5. Please note that at
   this time, NetWare 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 NetWare has not yet been optimized for performance.
Apache still performs best, and is most reliable on Unix platforms.  Over
time we will improve NetWare 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 Apache 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 NetWare</A> below.

<HR>

<UL>
  <LI><A HREF="#req">Requirements</A>
  <LI><A HREF="#down">Downloading Apache for NetWare</A>
  <LI><A HREF="#inst">Installing Apache for NetWare</A>
  <LI><A HREF="#run">Running Apache for NetWare</A>
  <LI><A HREF="#use">Using Apache for NetWare</A>
  <LI><A HREF="#comp">Compiling Apache for NetWare</A>
</UL>

<HR>

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

Apache 1.3 is designed to run on NetWare 5.0 and 5.1.
<P>

<STRONG>If running on NetWare 5.0 you must install Service Pack 4.</STRONG>

<P>
<P>

Service pack 4 is available <A HREF="http://support.novell.com/misc/patlst.htm#nw">here.</A>

<H2><A NAME="down">Downloading Apache for NetWare 5</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>
<H2><A NAME="inst">Installing Apache for NetWare</A></H2>

There is no Apache install program for NetWare currently.  You will need
to compile apache and copy the files over to the server manually.  An
install program will be posted at a later date.
<P>
Follow these steps to install Apache on NetWare (assuming you will install to sys:/apache):

<UL>
  <LI>Create a directory called <CODE>Apache</CODE> on a NetWare volume
  <LI>Copy Apache.nlm, Apachec.nlm, htdigest.nlm, and htpasswd.nlm to sys:/apache
  <LI>Create a directory under <CODE>sys:/Apache</CODE> called <CODE>conf</CODE>
  <LI>Copy all the *.conf-dist-nw files to the <CODE>sys:/apache/conf</CODE> directory
      and rename them all as *.conf files
  <LI>Copy the mime.types and magic files to sys:/apache/conf directory
  <LI>Copy all files and subdirectories of \apache-1.3\htdocs to sys:/apache/htdocs and
      rename the proper index file (index.html.en) to index.html
  <LI>Copy all files and subdirectories in \apache-1.3\icons to sys:/apache/icons
  <LI>Create the directory sys:/apache/logs on the server
  <LI>Create the directory sys:/apache/cgi-bin on the server
  <LI>Create the directory sys:/apache/modules and copy all nlm modules built into the
      modules directory
  <LI>Edit the httpd.conf file setting ServerRoot and ServerName to reflect your correct
      server settings
  <LI>Add <CODE>sys:/apache</CODE> to the search path.  EXAMPLE: search add sys:\apache
</UL>

<P>Apache may be installed to other volumes besides the default <CODE>sys</CODE> volume.

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

To start Apache just type <STRONG>apache</STRONG> at the console.  This
will load apache in the OS address space.  If you prefer to load
Apache in a protected address space you may specify the address space
with the load statement as follows:
<P>
<PRE>
    load address space = apache apache
</PRE>
<P>
This will load Apache into an address space called apache. Running multiple instances
of Apache concurrently on NetWare is possible by loading each instance into its own
protected address space.

<P>
After starting Apache it 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 the server's name or address.

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.

<P>

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

<P>
To unload Apache running in the OS address space just type the
following at the console:
<PRE>
    unload apache
</PRE>
If apache is running in a protected address space specify the 
address space in the unload statement:
<PRE>
    unload address space = apache apache
</PRE>

<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 "vol:/my server/conf/my.conf"</PRE>
<PRE>    apache -f test/test.conf</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, 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>The server root compiled into the server.
</UL>

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

<H2><A NAME="use">Configuring Apache for NetWare</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
NetWare. See the <A HREF="./">Apache documentation</A> for all the
available directives.

<P>

The main differences in Apache for NetWare are:

<UL>
  <LI><P>Because Apache for NetWare is multithreaded, it does not use a
      separate process for each request, as Apache does with
      Unix. Instead there are only threads running: a parent thread, 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><A HREF="mod/core.html#threadstacksize">ThreadStackSize</A> -
         This directive tells the server what size of stack to use for
         the individual threads.  The recommended default is
         <CODE>ThreadStackSize 65536</CODE>.
      <P>
  <LI><P>The directives that accept filenames as arguments now must use
      NetWare filenames instead of Unix ones. However, because Apache
      uses Unix-style names internally, you must use forward slashes, not
      backslashes. Volumes can be used; if omitted, the drive with the
      Apache executable will be assumed.</P>
  <LI><P>Apache for NetWare 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/status
</PRE>
      <P>Information on <A HREF="mod/mod_so.html#creating">creating loadable
         modules</A> is also available.</P>
</UL>

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

<P>Compiling Apache requires MetroWerks CodeWarrior 5 to be properly
   installed. 
   
<P>First, unpack the Apache distribution into an appropriate
   directory.  Then go to the <CODE>src</CODE> subdirectory of the Apache
   distribution and unzip <CODE>ApacheNW.mcp.gz</CODE>. You may use a
   recent version of WinZip to accomplish this or gzip for Windows. The main
   Metrowerks project file for Apache <CODE>(ApacheNW.mcp)</CODE> is now ready
   to use. Just double click on it from within explorer and it should
   automatically launch MetroWerks CodeWarrior.
</P>

<P>All major pieces of Apache may be built using the ApacheNW.mcp project
   file. This includes modules such as status, info, and proxy. In addition,
   the following project files have been provided as well:
<PRE>   
       /apache-1.3/src/support/htpasswd.mcp.gz
       /apache-1.3/src/support/htdigest.mcp.gz
</PRE>

</P>
<CODE>htpasswd.mcp.gz</CODE> and <CODE>htdigest.mcp.gz</CODE> will also need
to be unzipped before they can be used with MetroWerks CodeWarrior.

<P>Once Apache has been compiled, it needs to be installed in its server
   root directory. The default is the <CODE>sys:/Apache</CODE>
   directory. </P>
<P>
Before running the server you must fill out the conf directory.
Copy the *.conf-dist-nw from the distribution conf directory
and rename *.conf.  Edit the ServerRoot entries to your
actual server root (for example "sys:/apache").  Copy over
the conf/magic and conf/mime.types files as well.

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

