<?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="httpd.xml.meta">
<parentdocument href="./">Programs</parentdocument>

  <title>httpd - Apache Hypertext Transfer Protocol Server</title>

<summary>
     <p><code>httpd</code> is the Apache HyperText Transfer Protocol
     (HTTP) server program.  It is designed to be run as a standalone
     daemon process. When used like this it will create a pool of
     child processes or threads to handle requests.</p>

     <p>In general, <code>httpd</code> should not be invoked directly,
     but rather should be invoked via <program>
     apachectl</program> on Unix-based systems or <a
     href="../platform/windows.html#winsvc">as a service on Windows NT,
     2000 and XP</a> and <a href="../platform/windows.html#wincons">as
     a console application on Windows 9x and ME</a>.</p>
</summary>

<seealso><a href="../invoking.html">Starting Apache httpd</a></seealso>
<seealso><a href="../stopping.html">Stopping Apache httpd</a></seealso>
<seealso><a href="../configuring.html">Configuration Files</a></seealso>
<seealso><a href="../platform/">Platform-specific Documentation</a></seealso>
<seealso><program>apachectl</program></seealso>

<section id="synopsis"><title>Synopsis</title>
     <p><code><strong>httpd</strong> [ -<strong>d</strong>
     <var>serverroot</var> ] [ -<strong>f</strong> <var>config</var> ]
     [ -<strong>C</strong> <var>directive</var> ] [ -<strong>c</strong>
     <var>directive</var> ] [ -<strong>D</strong> <var>parameter</var> ]
     [ -<strong>e</strong> <var>level</var> ] [ -<strong>E</strong>
     <var>file</var> ]
     [ <strong>-k</strong> start|restart|graceful|stop|graceful-stop ]
     [ -<strong>h</strong> ]
     [ -<strong>l</strong> ] [ -<strong>L</strong> ] [ -<strong>S</strong> ]
     [ -<strong>t</strong> ] [ -<strong>v</strong> ] [ -<strong>V</strong> ]
     [ -<strong>X</strong> ] [ -<strong>M</strong> ] [ -<strong>T</strong> ]
     </code></p>

     <p>On <a href="../platform/windows.html">Windows systems</a>, the
     following additional arguments are available:</p>

     <p><code><strong>httpd</strong> [ -<strong>k</strong>
     install|config|uninstall ] [ -<strong>n</strong> <var>name</var> ]
     [ -<strong>w</strong> ]</code></p>
</section>

<section id="options"><title>Options</title>

<dl>
<dt><code>-d <var>serverroot</var></code></dt>

<dd>Set the initial value for the <directive
module="core">ServerRoot</directive> directive to
<var>serverroot</var>.  This can be overridden by the ServerRoot
directive in the configuration file. The default is
<code>/usr/local/apache2</code>.</dd>

<dt><code>-f <var>config</var></code></dt>

<dd>Uses the directives in the file <var>config</var> on startup. If
<var>config</var> does not begin with a /, then it is taken to be a
path relative to the <directive
module="core">ServerRoot</directive>. The default is
<code>conf/httpd.conf</code>.</dd>

<dt><code>-k <code>start|restart|graceful|stop|graceful-stop</code></code></dt>

<dd>Signals <code>httpd</code> to start, restart, or stop.  See <a
href="../stopping.html">Stopping Apache httpd</a> for more information.</dd>

<dt><code>-C <var>directive</var></code></dt>

<dd>Process the configuration <var>directive</var> before reading
config files.</dd>

<dt><code>-c <var>directive</var></code></dt>

<dd>Process the configuration <var>directive</var> after reading config
files.</dd>


<dt><code>-D <var>parameter</var></code></dt>

<dd>Sets a configuration <var>parameter </var>which can be used with
<directive type="section" module="core">IfDefine</directive> sections
in the configuration files to conditionally skip or process commands
at server startup and restart. Also can be used to set certain
less-common startup parameters including <code>-DNO_DETACH</code>
(prevent the parent from forking) and <code>-DFOREGROUND</code>
(prevent the parent from calling <code>setsid()</code> et al).</dd>

<dt><code>-e <var>level</var></code></dt>

<dd>Sets the <directive module="core">LogLevel</directive> to
<var>level</var> during server startup.  This is useful for
temporarily increasing the verbosity of the error messages to find
problems during startup.</dd>

<dt><code>-E <var>file</var></code></dt>

<dd>Send error messages during server startup to <var>file</var>.</dd>

<dt><code>-h</code></dt>

<dd>Output a short summary of available command line options.</dd>

<dt><code>-l</code></dt>

<dd>Output a list of modules compiled into the server.  This will
<strong>not</strong> list dynamically loaded modules included using
the <directive module="mod_so">LoadModule</directive> directive.</dd>

<dt><code>-L</code></dt>

<dd>Output a list of directives provided by static modules, together with expected arguments and
places where the directive is valid. Directives provided by shared modules are not listed.</dd>

<dt><code>-M</code></dt>

<dd>Dump a list of loaded Static and Shared Modules.</dd>

<dt><code>-S</code></dt>

<dd>Show the settings as parsed from the config file (currently only
shows the virtualhost settings).</dd>

<dt><code>-T</code> (Available in 2.3.8 and later)</dt>

<dd>Skip document root check at startup/restart.</dd>

<dt><code>-t</code></dt>

<dd>Run syntax tests for configuration files only.  The program
immediately exits after these syntax parsing tests with either a return code
of 0 (Syntax OK) or return code not equal to 0 (Syntax Error).  If -D
<var>DUMP</var>_<var>VHOSTS </var>is also set, details of the virtual host
configuration will be printed. If -D <var>DUMP</var>_<var>MODULES </var> is
set, all loaded modules will be printed.</dd>

<dt><code>-v</code></dt>

<dd>Print the version of <code>httpd</code>, and then exit.</dd>

<dt><code>-V</code></dt>

<dd>Print the version and build parameters of <code>httpd</code>, and
then exit.</dd>

<dt><code>-X</code></dt>

<dd>Run httpd in debug mode.  Only one worker will be started and the
server will not detach from the console.</dd>

</dl>

<p>The following arguments are available only on the <a
href="../platform/windows.html">Windows platform</a>:</p>

<dl>

<dt><code>-k install|config|uninstall</code></dt>

<dd>Install Apache httpd as a Windows NT service; change startup options for
the Apache httpd service; and uninstall the Apache httpd service.</dd>

<dt><code>-n <var>name</var></code></dt>

<dd>The <var>name</var> of the Apache httpd service to signal.</dd>

<dt><code>-w</code></dt>

<dd>Keep the console window open on error so that the error message can
be read.</dd>

</dl>

</section>

</manualpage>
