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

<!--
 Licensed to the Apache Software Foundation (ASF) under one or more
 contributor license agreements.  See the NOTICE file distributed with
 this work for additional information regarding copyright ownership.
 The ASF licenses this file to You 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="http://wiki.apache.org/httpd/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="../mod/">Apache module
    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">MaxConnectionsPerChild</directive> -
        Like the Unix directive, this controls how many connections
        a worker thread will serve before exiting. The recommended default,
        <code>MaxConnectionsPerChild 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>PCRESDK</code> to the location
        where you installed the source code for the PCRE Library, for example:
        <example>Set PCRESDK=D:\NOVELL\pcre</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 recent OpenSSL 0.9.8 release source code from the
          <a href="http://www.openssl.org/source/">OpenSSL Source</a>
          page (older 0.9.7 versions need to be patched and are therefore not
          recommended).</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>
          For performance reasons you should enable to build with ASM code.
          Download NASM from the <a href="http://nasm.sourceforge.net/">SF site</a>.
          Then configure OpenSSL to use ASM code:
          <example>
              Netware\build netware-libc nw-nasm enable-mdc2 enable-md5
          </example>
          Warning: dont use the CodeWarrior Assembler - it produces broken code!
          </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, and set WITH_MOD_SSL to 1.
          <example>
              Set OSSLSDK=d:\openssl-0.9.8x<br />
              Set WITH_MOD_SSL=1
          </example></li>

      </ul>

    </section>

  </section>

</manualpage>

