<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE manualpage SYSTEM "../style/manualpage.dtd">
<?xml-stylesheet type="text/xsl" href="../style/manual.en.xsl"?>
<!-- $LastChangedRevision$ -->

<!--
 Copyright 2002-2005 The Apache Software Foundation or its licensors, as
 applicable.

 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
 You may obtain a copy of the License at

     http://www.apache.org/licenses/LICENSE-2.0

 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
-->

<manualpage metafile="netware.xml.meta">
  <parentdocument href="./">Platform Specific Notes</parentdocument>

  <title>Using Apache With Novell NetWare</title>

  <summary>

    <p>This document explains how to install, configure and run
    Apache 2.0 under Novell NetWare 6.0 and above. If you find any bugs,
    or wish to contribute in other ways, please use our
    <a href="http://httpd.apache.org/bug_report.html">bug reporting
    page.</a></p>

    <p>The bug reporting page and dev-httpd mailing list are <em>not</em>
    provided to answer questions about configuration or running Apache.
    Before you submit a bug report or request, first consult this document, the
    <a href="../faq/">Frequently Asked Questions</a> page and the other
    relevant documentation topics. If you still have a question or problem,
    post it to the <a href="news://developer-forums.novell.com/novell.devsup.webserver">
    novell.devsup.webserver</a> newsgroup, where many Apache users are more than
    willing to answer new and obscure questions about using Apache on NetWare.</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.</p>

  </summary>

  <section id="req">

    <title>Requirements</title>

    <p>Apache 2.0 is designed to run on NetWare 6.0 service pack 3 
    and above. If you are running a service pack less
    than SP3, you must install the latest 
    <a href="http://developer.novell.com/ndk/libc.htm">NetWare Libraries
    for C (LibC)</a>.</p>

    <p>NetWare service packs are available <a
    href="http://support.novell.com/misc/patlst.htm#nw">here</a>.</p>

    <p>Apache 2.0 for NetWare can also be run in a NetWare 5.1 environment
    as long as the latest service pack or the latest version
    of the <a href="http://developer.novell.com/ndk/libc.htm">NetWare Libraries
    for C (LibC)</a> has been installed .  <strong>WARNING:</strong> Apache 2.0 
    for NetWare has not been targeted for or tested in this environment.</p>

  </section>

  <section id="down">

    <title>Downloading Apache for NetWare</title>

    <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. Binary builds of the latest releases of
    Apache 2.0 for NetWare can be downloaded from 
    <a href="http://www.apache.org/dist/httpd/binaries/netware">here</a>.</p>

  </section>

  <section id="inst">

    <title>Installing Apache for NetWare</title>

    <p>There is no Apache install program for NetWare currently. If you
    are building Apache 2.0 for NetWare from source, you will need to 
    copy the files over to the server manually.</p>

    <p>Follow these steps to install Apache on NetWare from the
    binary download (assuming you will install to
    <code>sys:/apache2</code>):</p>

    <ul>
      <li>Unzip the binary download file to the root of the <code>SYS:</code>
      volume (may be installed to any volume)</li>

      <li>Edit the <code>httpd.conf</code> file setting <directive
      module="core">ServerRoot</directive> and <directive
      module="core">ServerName</directive> along with any file path values
      to reflect your correct server settings</li>

      <li>Add <code>SYS:/APACHE2</code> to the search path, for example:
        <example>SEARCH ADD SYS:\APACHE2</example>
      </li>

    </ul>

    <p>Follow these steps to install Apache on NetWare manually
    from your own build source (assuming you will install to
    <code>sys:/apache2</code>):</p>

    <ul>
      <li>Create a directory called <code>Apache2</code> on a
      NetWare volume</li>

      <li>Copy <code>APACHE2.NLM</code>, <code>APRLIB.NLM</code>
      to <code>SYS:/APACHE2</code></li>

      <li>Create a directory under <code>SYS:/APACHE2</code>
      called <code>BIN</code></li>

      <li>Copy <code>HTDIGEST.NLM</code>, <code>HTPASSWD.NLM</code>, 
      <code>HTDBM.NLM</code>, <code>LOGRES.NLM</code>, <code>ROTLOGS.NLM</code>
      to <code>SYS:/APACHE2/BIN</code></li>

      <li>Create a directory under <code>SYS:/APACHE2</code>
      called <code>CONF</code></li>

      <li>Copy the <code>HTTPD-STD.CONF</code> file to the
      <code>SYS:/APACHE2/CONF</code> directory and rename to
      <code>HTTPD.CONF</code></li>

      <li>Copy the <code>MIME.TYPES</code>, <code>CHARSET.CONV</code> and 
      <code>MAGIC</code> files to <code>SYS:/APACHE2/CONF</code> directory</li>

      <li>Copy all files and subdirectories in <code>\HTTPD-2.0\DOCS\ICONS</code>
      to <code>SYS:/APACHE2/ICONS</code></li>

      <li>Copy all files and subdirectories in <code>\HTTPD-2.0\DOCS\MANUAL</code>
      to <code>SYS:/APACHE2/MANUAL</code></li>

      <li>Copy all files and subdirectories in <code>\HTTPD-2.0\DOCS\ERROR</code>
      to <code>SYS:/APACHE2/ERROR</code></li>

      <li>Copy all files and subdirectories in <code>\HTTPD-2.0\DOCS\DOCROOT</code>
      to <code>SYS:/APACHE2/HTDOCS</code></li>

      <li>Create the directory <code>SYS:/APACHE2/LOGS</code>
      on the server</li>

      <li>Create the directory <code>SYS:/APACHE2/CGI-BIN</code>
      on the server</li>

      <li>Create the directory <code>SYS:/APACHE2/MODULES</code>
      and copy all nlm modules into the <code>modules</code> directory</li>

      <li>Edit the <code>HTTPD.CONF</code> file searching for all
      <code>@@Value@@</code> markers and replacing them with the
      appropriate setting</li>

      <li>Add <code>SYS:/APACHE2</code> to the search path, for example:
        <example>SEARCH ADD SYS:\APACHE2</example>
      </li>
    </ul>

    <p>Apache may be installed to other volumes besides the default <code>SYS</code> volume.</p>

    <p>During the build process, adding the keyword "install" to the makefile command line
    will automatically produce a complete distribution package under the subdirectory 
    <code>DIST</code>. Install Apache by simply copying the distribution that was produced 
    by the makfiles to the root of a NetWare volume (see: <a href="#comp">Compiling Apache for 
    NetWare</a> below).</p>

  </section>

  <section id="run">

    <title>Running Apache for NetWare</title>

    <p>To start Apache just type <code>apache</code> 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>

    <example>
      load address space = apache2 apache2
    </example>

    <p>This will load Apache into an address space called apache2.
    Running multiple instances of Apache concurrently on NetWare is
    possible by loading each instance into its own protected
    address space.</p>

    <p>After starting Apache, it will be listening to port 80
    (unless you changed the <directive module="mpm_common">Listen</directive>
    directive 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
    <code>error_log</code> file in the <code>logs</code>
    directory.</p>

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

    <p>To unload Apache running in the OS address space just type
    the following at the console:</p>

    <example>
      unload apache2
    </example>

    <p>or</p>

    <example>
      apache2 shutdown
    </example>

    <p>If apache is running in a protected address space specify the
    address space in the unload statement:</p>

    <example>
      unload address space = apache2 apache2
    </example>

    <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:</p>

    <ul>
      <li><code>-f</code> specifies a path to a particular
      configuration file</li>
    </ul>

    <example>
      apache2 -f "vol:/my server/conf/my.conf"
    </example>

    <example>
      apache -f test/test.conf
    </example>

    <p>In these cases, the proper <directive module="core">ServerRoot</directive>
    should be set in the configuration file.</p>

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

    <ul>
      <li>A <code>ServerRoot</code> directive via a
      <code>-C</code> switch.</li>

      <li>The <code>-d</code> switch on the command line.</li>

      <li>Current working directory</li>

      <li>The server root compiled into the server.</li>
    </ul>

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

    <p>Apache 2.0 for NetWare includes a set of command line directives that can
    be used to modify or display information about the running instance of the
    web server. These directives are only available while Apache is running. Each 
    of these directives must be preceded by the keyword <code>APACHE2</code>.</p>

    <dl>
      <dt>RESTART</dt>
      <dd>Instructs Apache to terminate all running worker
      threads as they become idle, reread the configuration file and restart each
      worker thread based on the new configuration.</dd>

      <dt>VERSION</dt>
      <dd>Displays version information about the currently
      running instance of Apache.</dd>

      <dt>MODULES</dt>
      <dd>Displays a list of loaded modules both built-in
      and external.</dd>

      <dt>DIRECTIVES</dt>
      <dd>Displays a list of all available directives.</dd>

      <dt>SETTINGS</dt>
      <dd>Enables or disables the thread status display
      on the console. When enabled, the state of each running threads is displayed 
      on the Apache console screen.</dd>

      <dt>SHUTDOWN</dt>
      <dd>Terminates the running instance of the Apache
      web server.</dd>

      <dt>HELP</dt>
      <dd>Describes each of the runtime directives.</dd>
    </dl>

    <p>By default these directives are issued against the instance of Apache running
    in the OS address space. To issue a directive against a specific instance running
    in a protected address space, include the -p parameter along with the name of the
    address space. For more information type "apache2 Help" on the command line.</p>

  </section>

  <section id="use">

    <title>Configuring Apache for NetWare</title>

    <p>Apache is configured by reading configuration files usually stored
    in the <code>conf</code> 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>

    <p>The main differences in Apache for NetWare are:</p>

    <ul>
      <li>
        <p>Because Apache for NetWare is multithreaded, it does not
        use a separate process for each request, as Apache does on some Unix
        implementations. Instead there are only threads running: a parent
        thread, and multiple child or worker threads which handle the requests.</p>

        <p>Therefore the "process"-management directives are different:</p>

        <p><directive module="mpm_common">MaxRequestsPerChild</directive> -
        Like the Unix directive, this controls how many requests
        a worker thread will serve before exiting. The recommended default,
        <code>MaxRequestsPerChild 0</code>, causes the thread to continue servicing
        request indefinitely. It is recommended on NetWare, unless there is some
        specific reason, that this directive always remain set to <code>0</code>.</p>

        <p><directive module="mpm_common">StartThreads</directive> -
        This directive tells the server how many threads it should start initially.
        The recommended default is <code>StartThreads 50</code>.</p>

        <p><directive module="mpm_common">MinSpareThreads</directive> -
        This directive instructs the server to spawn additional worker threads
        if the number of idle threads ever falls below this value. The recommended
        default is <code>MinSpareThreads 10</code>.</p>

        <p><directive module="mpm_common">MaxSpareThreads</directive> -
        This directive instructs the server to begin terminating worker threads
        if the number of idle threads ever exceeds this value. The recommended
        default is <code>MaxSpareThreads 100</code>.</p>

        <p><directive module="mpm_netware">MaxThreads</directive> -
        This directive limits the total number of work threads to a maximum
        value. The recommended default is <code>ThreadsPerChild 250</code>.</p>

        <p><directive module="mpm_common">ThreadStackSize</directive> -
        This directive tells the server what size of stack to use
        for the individual worker thread. The recommended default
        is <code>ThreadStackSize 65536</code>.</p>
      </li>

      <li>
        <p>The directives that accept filenames as arguments must use 
        NetWare filenames instead of Unix names. However, because Apache 
        uses Unix-style names internally, forward slashes must be used 
        rather than backslashes. It is recommended that all rooted file paths 
        begin with a volume name. If omitted, Apache will assume the 
        <code>SYS:</code> volume which may not be correct.</p>
      </li>

      <li>
        <p>Apache for NetWare has 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>\Apache2\modules</code> directory.
        To activate these, or other modules, the <directive
        module="mod_so">LoadModule</directive> directive
        must be used. For example, to active the status module, use
        the following:</p>

        <example>
          LoadModule status_module modules/status.nlm
        </example>

        <p>Information on <a
        href="../mod/mod_so.html#creating">creating loadable
        modules</a> is also available.</p>
      </li>
    </ul>

    <section id="use-add">

      <title>Additional NetWare specific directives:</title>

      <ul>
        <li><directive module="core">CGIMapExtension</directive> -
        This directive maps a CGI file extension to a script interpreter.</li>
      </ul>
      <ul>
        <li><directive module="mod_nw_ssl">SecureListen</directive> -
        Enables SSL encryption for a specified port.</li>
      </ul>
      <ul>
        <li><directive module="mod_nw_ssl">NWSSLTrustedCerts</directive> -
        Adds trusted certificates that are used to create secure connections to proxied servers.</li>
      </ul>
      <ul>
        <li><directive module="mod_nw_ssl">NWSSLUpgradeable</directive> -
        Allow a connection created on the specified address/port to be upgraded to an SSL connection.</li>
      </ul>

    </section>

  </section>

  <section id="comp">

    <title>Compiling Apache for NetWare</title>

    <p>Compiling Apache requires MetroWerks CodeWarrior 6.x or higher. Once 
    Apache has been built, it can be installed to the root of any NetWare 
    volume. The default is the <code>sys:/Apache2</code> directory.</p>

    <p>Before running the server you must fill out the <code>conf</code>
    directory. Copy the file <code>HTTPD-STD.CONF</code> from the distribution
    <code>conf</code> directory and rename it to <code>HTTPD.CONF</code>.
    Edit the <code>HTTPD.CONF</code> file searching for all <code>@@Value@@</code>
    markers and replacing them with the appropriate setting. Copy over
    the <code>conf/magic</code> and <code>conf/mime.types</code> files as well.
    Alternatively, a complete distribution can be built by including the keyword
    <code>install</code> when invoking the makefiles.</p>

    <section id="comp-req">

      <title>Requirements:</title>

      <p>The following development tools are required to build
      Apache 2.0 for NetWare:</p>

      <ul>
        <li>Metrowerks CodeWarrior 6.0 or higher with the
        <a href="http://developer.novell.com/ndk/cwpdk.htm">NetWare PDK 3.0</a>
        or higher.</li>

        <li><a href="http://developer.novell.com/ndk/libc.htm">NetWare Libraries
        for C (LibC)</a></li>

        <li><a href="http://developer.novell.com/ndk/cldap.htm">LDAP Libraries
        for C</a></li>

        <li><a href="http://www.gzip.org/zlib/">ZLIB Compression Library source code</a></li>

        <li>AWK utility (awk, gawk or similar). AWK can be downloaded from
        <a href="http://developer.novell.com/ndk/apache.htm">http://developer.novell.com/ndk/apache.htm</a>.
        The utility must be found in your windows path and must be named <code>awk.exe</code>.</li>

        <li>To build using the makefiles, you will need GNU make version 3.78.1 (GMake) available at
        <a href="http://developer.novell.com/ndk/apache.htm">http://developer.novell.com/ndk/apache.htm</a>.</li>
      </ul>

    </section>

    <section id="comp-make">

      <title>Building Apache using the NetWare makefiles:</title>

      <ul>
        <li>Set the environment variable <code>NOVELLLIBC</code> to the
        location of the NetWare Libraries for C SDK, for example:
        <example>Set NOVELLLIBC=c:\novell\ndk\libc</example>
        </li>

        <li>Set the environment variable <code>METROWERKS</code> to the
        location where you installed the Metrowerks CodeWarrior compiler,
        for example:
        <example>Set METROWERKS=C:\Program Files\Metrowerks\CodeWarrior</example>
        If you installed to the default location <code>C:\Program
        Files\Metrowerks\CodeWarrior</code>, you don't need to set this.</li>

        <li>Set the environment variable <code>LDAPSDK</code> to the
        location where you installed the LDAP Libraries for C, for example:
        <example>Set LDAPSDK=c:\Novell\NDK\cldapsdk\NetWare\libc</example>
        </li>

        <li>Set the environment variable <code>ZLIBSDK</code> to the
        location where you installed the source code for the ZLib Library,
        for example:
        <example>Set ZLIBSDK=D:\NOVELL\zlib</example>
        </li>
        
        <li>Set the environment variable <code>AP_WORK</code> to the full path of
        the <code>httpd</code> source code directory.
        <example>Set AP_WORK=D:\httpd-2.0.x</example>
        </li>

        <li>Set the environment variable <code>APR_WORK</code> to the full path of
        the <code>apr</code> source code directory. Typically <code>\httpd\srclib\apr</code>
        but the APR project can be outside of the httpd directory structure.
        <example>Set APR_WORK=D:\apr-1.x.x</example>
        </li>

        <li>Set the environment variable <code>APU_WORK</code> to the full path of
        the <code>apr-util</code> source code directory. Typically <code>\httpd\srclib\apr-util</code>
        but the APR-UTIL project can be outside of the httpd directory structure.
        <example>Set APU_WORK=D:\apr-util-1.x.x</example>
        </li>

        <li>Make sure that the path to the AWK utility and the GNU make utility
        (<code>gmake.exe</code>) have been included in the system's
        <code>PATH</code> environment variable.</li>

        <li>Download the source code and unzip to an appropriate directory on
        your workstation.</li>

        <li>Change directory to <code>\httpd-2.0</code> and build the prebuild utilities
        by running "<code>gmake -f nwgnumakefile prebuild</code>". This target will create
        the directory <code>\httpd-2.0\nwprebuild</code> and copy each of the utilities 
        to this location that are necessary to complete the following build steps.
        </li>

        <li>Copy the files <code>\httpd-2.0\nwprebuild\GENCHARS.nlm</code> and 
        <code>\httpd-2.0\nwprebuild\DFTABLES.nlm</code> to the <code>SYS:</code> volume of a
        NetWare server and run them using the following commands:
          <example>
            SYS:\genchars &gt; sys:\test_char.h<br />
            SYS:\dftables sys:\chartables.c<br />
          </example>
        </li>

        <li>Copy the files <code>test_char.h</code> and <code>chartables.c</code>
        to the directory <code>\httpd-2.0\os\netware</code> on the build machine.</li>

        <li>Change directory to <code>\httpd-2.0</code> and build Apache by running
        "<code>gmake -f nwgnumakefile</code>". You can create a distribution directory by
        adding an install parameter to the command, for example:
        <example>gmake -f nwgnumakefile install</example>
        </li>
      </ul>

    </section>

    <section id="comp-add">

      <title>Additional make options</title>

      <ul>
        <li><code>gmake -f nwgnumakefile</code><p>Builds release versions of all of the
        binaries and copies them to a <code>\release</code> destination directory.</p></li>

        <li><code>gmake -f nwgnumakefile DEBUG=1</code><p>Builds debug versions of all of the
        binaries and copies them to a <code>\debug</code> destination directory.</p></li>

        <li><code>gmake -f nwgnumakefile install</code><p>Creates a complete Apache
        distribution with binaries, docs and additional support files in a
        <code>\dist\Apache2</code> directory.</p></li>

        <li><code>gmake -f nwgnumakefile prebuild</code><p>Builds all of the prebuild utilities
        and copies them to the <code>\nwprebuild</code> directory.</p></li>

        <li><code>gmake -f nwgnumakefile installdev</code><p>Same as install but also creates a
        <code>\lib</code> and <code>\include</code> directory in the destination directory
        and copies headers and import files.</p></li>

        <li><code>gmake -f nwgnumakefile clean</code><p>Cleans all object files and binaries
        from the <code>\release.o</code> or <code>\debug.o</code> build areas depending on whether
        <code>DEBUG</code> has been defined.</p></li>

        <li><code>gmake -f nwgnumakefile clobber_all</code><p>Same as clean and also deletes
        the distribution directory if it exists.</p></li>
      </ul>

    </section>

    <section id="comp-add-env">

      <title>Additional environment variable options</title>

      <ul>
        <li>To build all of the experimental modules, set the environment 
        variable <code>EXPERIMENTAL</code>:
        <example>Set EXPERIMENTAL=1</example>
        </li>

        <li>To build Apache using standard BSD style sockets rather than
        Winsock, set the environment variable <code>USE_STDSOCKETS</code>:
        <example>Set USE_STDSOCKETS=1</example>
        </li>

      </ul>

    </section>

    <section id="comp-mod_ssl">

      <title>Building mod_ssl for the NetWare platform</title>

      <p>By default Apache for NetWare uses the built-in module 
      <module>mod_nw_ssl</module> to provide SSL services.  This module
      simply enables the native SSL services implemented in NetWare OS
      to handle all encryption for a given port.  Alternatively, mod_ssl
      can also be used in the same manner as on other platforms.</p>

      <p>Before mod_ssl can be built for the NetWare platform, the OpenSSL
      libraries must be provided.  This can be done through the following 
      steps:</p>

      <ul>
          <li>Download the latest NetWare patch for OpenSSL from the 
          <a href="http://www.openssl.org/contrib/">OpenSSL Contribution</a>
          page.</li>

          <li>Download the corresponding OpenSSL source code from the
          <a href="http://www.openssl.org/source/">OpenSSL Source</a>
          page.</li>

          <li>At the root of the OpenSSL source directory, apply the NetWare 
          patch using the "patch" utility, for example:
          <example>patch -p 1 -i netwarepatch-0.9.7g.diff</example></li>

          <li>Edit the file <code>NetWare/set_env.bat</code> and modify any 
          tools and utilities paths so that they correspond to your build 
          environment.</li>

          <li>From the root of the OpenSSL source directory, run the following
          scripts:
          <example>
              Netware/set_env netware-libc<br />
              Netware/build netware-libc
          </example></li>

          <li>Before building Apache, set the environment variable
          <code>OSSLSDK</code> to the full path to the root of the openssl
          source code directory.
          <example>Set OSSLSDK=d:\openssl-0.9.7x</example></li>

      </ul>

    </section>

  </section>

</manualpage>

