<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"><head>
<meta content="text/html; charset=ISO-8859-1" http-equiv="Content-Type" />
<!--
        XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
              This file is generated from xml source: DO NOT EDIT
        XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
      -->
<title>Using Apache With Novell NetWare - Apache HTTP Server Version 2.5</title>
<link href="../style/css/manual.css" rel="stylesheet" media="all" type="text/css" title="Main stylesheet" />
<link href="../style/css/manual-loose-100pc.css" rel="alternate stylesheet" media="all" type="text/css" title="No Sidebar - Default font size" />
<link href="../style/css/manual-print.css" rel="stylesheet" media="print" type="text/css" /><link rel="stylesheet" type="text/css" href="../style/css/prettify.css" />
<script src="../style/scripts/prettify.min.js" type="text/javascript">
</script>

<link href="../images/favicon.ico" rel="shortcut icon" /></head>
<body id="manual-page"><div id="page-header">
<p class="menu"><a href="../mod/">Modules</a> | <a href="../mod/quickreference.html">Directives</a> | <a href="http://wiki.apache.org/httpd/FAQ">FAQ</a> | <a href="../glossary.html">Glossary</a> | <a href="../sitemap.html">Sitemap</a></p>
<p class="apache">Apache HTTP Server Version 2.5</p>
<img alt="" src="../images/feather.png" /></div>
<div class="up"><a href="./"><img title="&lt;-" alt="&lt;-" src="../images/left.gif" /></a></div>
<div id="path">
<a href="http://www.apache.org/">Apache</a> &gt; <a href="http://httpd.apache.org/">HTTP Server</a> &gt; <a href="http://httpd.apache.org/docs/">Documentation</a> &gt; <a href="../">Version 2.5</a> &gt; <a href="./">Platform Specific Notes</a></div><div id="page-content"><div id="preamble"><h1>Using Apache With Novell NetWare</h1>
<div class="toplang">
<p><span>Available Languages: </span><a href="../en/platform/netware.html" title="English">&nbsp;en&nbsp;</a> |
<a href="../ko/platform/netware.html" hreflang="ko" rel="alternate" title="Korean">&nbsp;ko&nbsp;</a></p>
</div>


    <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>

  </div>
<div id="quickview"><ul id="toc"><li><img alt="" src="../images/down.gif" /> <a href="#req">Requirements</a></li>
<li><img alt="" src="../images/down.gif" /> <a href="#down">Downloading Apache for NetWare</a></li>
<li><img alt="" src="../images/down.gif" /> <a href="#inst">Installing Apache for NetWare</a></li>
<li><img alt="" src="../images/down.gif" /> <a href="#run">Running Apache for NetWare</a></li>
<li><img alt="" src="../images/down.gif" /> <a href="#use">Configuring Apache for NetWare</a></li>
<li><img alt="" src="../images/down.gif" /> <a href="#comp">Compiling Apache for NetWare</a></li>
</ul><h3>See also</h3><ul class="seealso"><li><a href="#comments_section">Comments</a></li></ul></div>
<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
<h2><a name="req" id="req">Requirements</a></h2>

    

    <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>

  </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
<h2><a name="down" id="down">Downloading Apache for NetWare</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. 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>

  </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
<h2><a name="inst" id="inst">Installing Apache for NetWare</a></h2>

    

    <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 <code class="directive"><a href="../mod/core.html#serverroot">ServerRoot</a></code> and <code class="directive"><a href="../mod/core.html#servername">ServerName</a></code> 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:
        <div class="example"><p><code>SEARCH ADD SYS:\APACHE2</code></p></div>
      </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:
        <div class="example"><p><code>SEARCH ADD SYS:\APACHE2</code></p></div>
      </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>

  </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
<h2><a name="run" id="run">Running Apache for NetWare</a></h2>

    

    <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>

    <div class="example"><p><code>
      load address space = apache2 apache2
    </code></p></div>

    <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 <code class="directive"><a href="../mod/mpm_common.html#listen">Listen</a></code>
    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>

    <div class="example"><p><code>
      unload apache2
    </code></p></div>

    <p>or</p>

    <div class="example"><p><code>
      apache2 shutdown
    </code></p></div>

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

    <div class="example"><p><code>
      unload address space = apache2 apache2
    </code></p></div>

    <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>

    <div class="example"><p><code>
      apache2 -f "vol:/my server/conf/my.conf"
    </code></p></div>

    <div class="example"><p><code>
      apache -f test/test.conf
    </code></p></div>

    <p>In these cases, the proper <code class="directive"><a href="../mod/core.html#serverroot">ServerRoot</a></code>
    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 <code class="directive"><a href="../mod/core.html#serverroot">ServerRoot</a></code>
    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>

  </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
<h2><a name="use" id="use">Configuring Apache for NetWare</a></h2>

    

    <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><code class="directive"><a href="../mod/mpm_common.html#maxconnectionsperchild">MaxConnectionsPerChild</a></code> -
        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><code class="directive"><a href="../mod/mpm_common.html#startthreads">StartThreads</a></code> -
        This directive tells the server how many threads it should start initially.
        The recommended default is <code>StartThreads 50</code>.</p>

        <p><code class="directive"><a href="../mod/mpm_common.html#minsparethreads">MinSpareThreads</a></code> -
        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><code class="directive"><a href="../mod/mpm_common.html#maxsparethreads">MaxSpareThreads</a></code> -
        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><code class="directive"><a href="../mod/mpm_netware.html#maxthreads">MaxThreads</a></code> -
        This directive limits the total number of work threads to a maximum
        value. The recommended default is <code>ThreadsPerChild 250</code>.</p>

        <p><code class="directive"><a href="../mod/mpm_common.html#threadstacksize">ThreadStackSize</a></code> -
        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 <code class="directive"><a href="../mod/mod_so.html#loadmodule">LoadModule</a></code> directive
        must be used. For example, to active the status module, use
        the following:</p>

        <div class="example"><p><code>
          LoadModule status_module modules/status.nlm
        </code></p></div>

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

    <h3><a name="use-add" id="use-add">Additional NetWare specific directives:</a></h3>

      

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

    

  </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
<h2><a name="comp" id="comp">Compiling Apache for NetWare</a></h2>

    

    <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>

    <h3><a name="comp-req" id="comp-req">Requirements:</a></h3>

      

      <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>

    

    <h3><a name="comp-make" id="comp-make">Building Apache using the NetWare makefiles:</a></h3>

      

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

        <li>Set the environment variable <code>METROWERKS</code> to the
        location where you installed the Metrowerks CodeWarrior compiler,
        for example:
        <div class="example"><p><code>Set METROWERKS=C:\Program Files\Metrowerks\CodeWarrior</code></p></div>
        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:
        <div class="example"><p><code>Set LDAPSDK=c:\Novell\NDK\cldapsdk\NetWare\libc</code></p></div>
        </li>

        <li>Set the environment variable <code>ZLIBSDK</code> to the
        location where you installed the source code for the ZLib Library,
        for example:
        <div class="example"><p><code>Set ZLIBSDK=D:\NOVELL\zlib</code></p></div>
        </li>

        <li>Set the environment variable <code>PCRESDK</code> to the location
        where you installed the source code for the PCRE Library, for example:
        <div class="example"><p><code>Set PCRESDK=D:\NOVELL\pcre</code></p></div>
        </li>

        <li>Set the environment variable <code>AP_WORK</code> to the full path of
        the <code>httpd</code> source code directory.
        <div class="example"><p><code>Set AP_WORK=D:\httpd-2.0.x</code></p></div>
        </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.
        <div class="example"><p><code>Set APR_WORK=D:\apr-1.x.x</code></p></div>
        </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.
        <div class="example"><p><code>Set APU_WORK=D:\apr-util-1.x.x</code></p></div>
        </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:
          <div class="example"><p><code>
            SYS:\genchars &gt; sys:\test_char.h<br />
            SYS:\dftables sys:\chartables.c<br />
          </code></p></div>
        </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:
        <div class="example"><p><code>gmake -f nwgnumakefile install</code></p></div>
        </li>
      </ul>

    

    <h3><a name="comp-add" id="comp-add">Additional make options</a></h3>

      

      <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>

    

    <h3><a name="comp-add-env" id="comp-add-env">Additional environment variable options</a></h3>

      

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

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

      </ul>

    

    <h3><a name="comp-mod_ssl" id="comp-mod_ssl">Building mod_ssl for the NetWare platform</a></h3>

      

      <p>By default Apache for NetWare uses the built-in module
      <code class="module"><a href="../mod/mod_nw_ssl.html">mod_nw_ssl</a></code> 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:
          <div class="example"><p><code>
              Netware\set_env netware-libc<br />
              Netware\build netware-libc
          </code></p></div>
          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:
          <div class="example"><p><code>
              Netware\build netware-libc nw-nasm enable-mdc2 enable-md5
          </code></p></div>
          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.
          <div class="example"><p><code>
              Set OSSLSDK=d:\openssl-0.9.8x<br />
              Set WITH_MOD_SSL=1
          </code></p></div></li>

      </ul>

    

  </div></div>
<div class="bottomlang">
<p><span>Available Languages: </span><a href="../en/platform/netware.html" title="English">&nbsp;en&nbsp;</a> |
<a href="../ko/platform/netware.html" hreflang="ko" rel="alternate" title="Korean">&nbsp;ko&nbsp;</a></p>
</div><div class="top"><a href="#page-header"><img src="../images/up.gif" alt="top" /></a></div><div class="section"><h2><a id="comments_section" name="comments_section">Comments</a></h2><div class="warning"><strong>Notice:</strong><br />This is not a Q&amp;A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed again by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Freenode, or sent to our <a href="http://httpd.apache.org/lists.html">mailing lists</a>.</div>
<script type="text/javascript"><!--//--><![CDATA[//><!--
var comments_shortname = 'httpd';
var comments_identifier = 'http://httpd.apache.org/docs/trunk/platform/netware.html';
(function(w, d) {
    if (w.location.hostname.toLowerCase() == "httpd.apache.org") {
        d.write('<div id="comments_thread"><\/div>');
        var s = d.createElement('script');
        s.type = 'text/javascript';
        s.async = true;
        s.src = 'https://comments.apache.org/show_comments.lua?site=' + comments_shortname + '&page=' + comments_identifier;
        (d.getElementsByTagName('head')[0] || d.getElementsByTagName('body')[0]).appendChild(s);
    }
    else {
        d.write('<div id="comments_thread">Comments are disabled for this page at the moment.<\/div>');
    }
})(window, document);
//--><!]]></script></div><div id="footer">
<p class="apache">Copyright 2016 The Apache Software Foundation.<br />Licensed under the <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a>.</p>
<p class="menu"><a href="../mod/">Modules</a> | <a href="../mod/quickreference.html">Directives</a> | <a href="http://wiki.apache.org/httpd/FAQ">FAQ</a> | <a href="../glossary.html">Glossary</a> | <a href="../sitemap.html">Sitemap</a></p></div><script type="text/javascript"><!--//--><![CDATA[//><!--
if (typeof(prettyPrint) !== 'undefined') {
    prettyPrint();
}
//--><!]]></script>
</body></html>