<?xml version="1.0" encoding="UTF-8"?>
<!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=UTF-8" http-equiv="Content-Type" />
<!--
        XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
              This file is generated from xml source: DO NOT EDIT
        XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
      -->
<title>Using Apache With RPM Based Systems (Redhat / CentOS / Fedora) - Apache HTTP Server Version 2.4</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/directives.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.4</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.4</a> &gt; <a href="./">Platform Specific Notes</a></div><div id="page-content"><div id="preamble"><h1>Using Apache With RPM Based Systems (Redhat / CentOS / Fedora)</h1>
<div class="toplang">
<p><span>Available Languages: </span><a href="../en/platform/rpm.html" title="English">&nbsp;en&nbsp;</a> |
<a href="../fr/platform/rpm.html" hreflang="fr" rel="alternate" title="Français">&nbsp;fr&nbsp;</a></p>
</div>


    <p>While many distributions make Apache httpd available as operating system
    supported packages, it can sometimes be desirable to install and use the
    canonical version of Apache httpd on these systems, replacing the natively
    provided versions of the packages.</p>

    <p>While the Apache httpd project does not currently create binary RPMs
    for the various distributions out there, it is easy to build your own
    binary RPMs from the canonical Apache httpd tarball.</p>

    <p>This document explains how to build, install, configure and run
    Apache httpd 2.4 under Unix systems supporting the RPM packaging format.</p>

  </div>
<div id="quickview"><a href="https://www.apache.org/foundation/contributing.html" class="badge"><img src="https://www.apache.org/images/SupportApache-small.png" alt="Support Apache!" /></a><ul id="toc"><li><img alt="" src="../images/down.gif" /> <a href="#creating">Creating a Source RPM</a></li>
<li><img alt="" src="../images/down.gif" /> <a href="#building">Building RPMs</a></li>
<li><img alt="" src="../images/down.gif" /> <a href="#installing">Installing the Server</a></li>
<li><img alt="" src="../images/down.gif" /> <a href="#default">Configuring the Default Instance of Apache httpd</a></li>
<li><img alt="" src="../images/down.gif" /> <a href="#additional">Configuring Additional Instances of Apache httpd on the Same Machine</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="creating" id="creating">Creating a Source RPM</a></h2>
    

    <p>The Apache httpd source tarball can be converted into an SRPM as
    follows:</p>

    <div class="example"><p><code>
      rpmbuild -ts httpd-2.4.x.tar.bz2
    </code></p></div>

  </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
<h2><a name="building" id="building">Building RPMs</a></h2>
    

    <p>RPMs can be built directly from the Apache httpd source tarballs using
    the following command:</p>

    <div class="example"><p><code>
      rpmbuild -tb httpd-2.4.x.tar.bz2
    </code></p></div>

    <p>Corresponding "-devel" packages will be required to be installed on your
    build system prior to building the RPMs, the <code>rpmbuild</code> command
    will automatically calculate what RPMs are required and will list any
    dependencies that are missing on your system. These "-devel" packages will
    not be required after the build is completed, and can be safely removed.</p>

    <p>If successful, the following RPMs will be created:</p>

    <dl>
    <dt>httpd-2.4.x-1.i686.rpm</dt>
    <dd>The core server and basic module set.</dd>

    <dt>httpd-debuginfo-2.4.x-1.i686.rpm</dt>
    <dd>Debugging symbols for the server and all modules.</dd>

    <dt>httpd-devel-2.4.x-1.i686.rpm</dt>
    <dd>Headers and development files for the server.</dd>

    <dt>httpd-manual-2.4.x-1.i686.rpm</dt>
    <dd>The webserver manual.</dd>

    <dt>httpd-tools-2.4.x-1.i686.rpm</dt>
    <dd>Supporting tools for the webserver.</dd>

    <dt>mod_authnz_ldap-2.4.x-1.i686.rpm</dt>
    <dd><code class="module"><a href="../mod/mod_ldap.html">mod_ldap</a></code> and <code class="module"><a href="../mod/mod_authnz_ldap.html">mod_authnz_ldap</a></code>, with
    corresponding dependency on openldap.</dd>

    <dt>mod_lua-2.4.x-1.i686.rpm</dt>
    <dd><code class="module"><a href="../mod/mod_lua.html">mod_lua</a></code> module, with
    corresponding dependency on lua.</dd>

    <dt>mod_proxy_html-2.4.x-1.i686.rpm</dt>
    <dd><code class="module"><a href="../mod/mod_proxy_html.html">mod_proxy_html</a></code> module, with
    corresponding dependency on libxml2.</dd>

    <dt>mod_socache_dc-2.4.x-1.i686.rpm</dt>
    <dd><code class="module"><a href="../mod/mod_socache_dc.html">mod_socache_dc</a></code> module, with
    corresponding dependency on distcache.</dd>

    <dt>mod_ssl-2.4.x-1.i686.rpm</dt>
    <dd><code class="module"><a href="../mod/mod_ssl.html">mod_ssl</a></code> module, with
    corresponding dependency on openssl.</dd>

    </dl>

  </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
<h2><a name="installing" id="installing">Installing the Server</a></h2>
    

    <p>The <code>httpd</code> RPM is the only RPM necessary to get a basic
    server to run. Install it as follows:</p>

    <div class="example"><p><code>
      rpm -U httpd-2.4.x-1.i686.rpm
    </code></p></div>

    <p>Self contained modules are included with the server. Modules that
    depend on external libraries are provided as separate RPMs to install
    if needed.</p>

  </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
<h2><a name="default" id="default">Configuring the Default Instance of Apache httpd</a></h2>
    

    <p>The default configuration for the server is installed by default
    beneath the <code>/etc/httpd</code> directory, with logs written by
    default to <code>/var/log/httpd</code>. The environment for the
    webserver is set by default within the optional
    <code>/etc/sysconfig/httpd</code> file.</p>

    <p>Start the server as follows:</p>

    <div class="example"><p><code>
      service httpd restart
    </code></p></div>

  </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
<h2><a name="additional" id="additional">Configuring Additional Instances of Apache httpd on the Same Machine</a></h2>
    

    <p>It is possible to configure additional instances of the Apache
    httpd server running independently alongside each other on the same
    machine. These instances can have independent configurations, and
    can potentially run as separate users if so configured.</p>

    <p>This was done by making the httpd startup script aware of its own
    name. This name is then used to find the environment file for the
    server, and in turn, the server root of the server instance.</p>

    <p>To create an additional instance called
    <code>httpd-additional</code>, follow these steps:</p>

    <ul>
      <li>Create a symbolic link to the startup script for the additional
      server:

      <div class="example"><p><code>
        ln -s /etc/rc.d/init.d/httpd /etc/rc.d/init.d/httpd-additional<br />
        chkconfig --add httpd-additional
      </code></p></div>

      </li>

      <li>Create an environment file for the server, using the
      <code>/etc/sysconfig/httpd</code> file as a template:

      <div class="example"><p><code>
        # template from httpd<br />
        cp /etc/sysconfig/httpd /etc/sysconfig/httpd-additional
      </code></p></div>
      
      <div class="example"><p><code>
        # blank template<br />
        touch /etc/sysconfig/httpd-additional
      </code></p></div>

      Edit <code>/etc/sysconfig/httpd-additional</code> and pass the
      server root of the new server instance within the
      <code>OPTIONS</code> environment variable.

      <div class="example"><p><code>
        OPTIONS="-d /etc/httpd-additional -f conf/httpd-additional.conf"
      </code></p></div>

      </li>

      <li>Edit the server configuration file
      <code>/etc/httpd-additional/conf/httpd-additional.conf</code> to
      ensure the correct ports and paths are configured.
      </li>

      <li>Start the server as follows:

      <div class="example"><p><code>
        service httpd-additional restart
      </code></p></div>

      </li>

      <li>Repeat this process as required for each server instance.</li>
    </ul>

  </div></div>
<div class="bottomlang">
<p><span>Available Languages: </span><a href="../en/platform/rpm.html" title="English">&nbsp;en&nbsp;</a> |
<a href="../fr/platform/rpm.html" hreflang="fr" rel="alternate" title="Français">&nbsp;fr&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 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 Libera.chat, or sent to our <a href="https://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/2.4/platform/rpm.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 2023 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/directives.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>