How to install Apache from Source Code on CentOS 7

To install Apache from Source Code on CentOS 7

In our previous article, we have been briefed about the installation of Apache from Source code on CentOS 6. Now, we will see about the installation of Apache from source code on CentOS 7. Apache is a web server used to serve web page content over HTTP and HTTPS protocol. For the easy installation of Apache web server we normally use yum install command. In this tutorial, we will install Apache by compiling from it' s source code. For compiling Apache from its source, it will require for APR and APR-UTIL, which means Apache Portable Runtime (APR).

Remove any the previous installation of Apache if it is installed from yum command in the target system.

Installation procedure

To proceed with the installation procedure, run the below command which installs all the required packages for the source code compilation of Apache and press y to continue with the installation.

[root@linuxhelp1 ~]# yum groupinstall " Development Tools"  -y
Loaded plugins: fastestmirror, langpacks
There is no installed groups file.
Maybe run: yum groups mark convert (see man yum)
base                                                                                                                 | 3.6 kB  00:00:00     
extras                                                                                                               | 3.4 kB  00:00:00     
updates                                                                                                              | 3.4 kB  00:00:00     
Loading mirror speeds from cached hostfile
 * base: mirrors.vinahost.vn
 * extras: mirrors.vhost.vn
 * updates: ftp.iitm.ac.in
Resolving Dependencies
-->  Running transaction check
--->  Package autoconf.noarch 0:2.69-11.el7 will be installed
-->  Processing Dependency: m4 > = 1.4.14 for package: autoconf-2.69-11.el7.noarch
-->  Processing Dependency: perl(Data::Dumper) for package: autoconf-2.69-11.el7.noarch
--->  Package automake.noarch 0:1.13.4-3.el7 will be installed
-->  Processing Dependency: perl(Thread::Queue) for package: automake-1.13.4-3.el7.noarch
-->  Processing Dependency: perl(TAP::Parser) for package: automake-1.13.4-3.el7.noarch
--->  Package bison.x86_64 0:3.0.4-1.el7 will be installed
--->  Package byacc.x86_64 0:1.9.20130304-3.el7 will be installed
--->  Package cscope.x86_64 0:15.8-10.el7 will be installed
--->  Package ctags.x86_64 0:5.8-13.el7 will be installed
--->  Package diffstat.x86_64 0:1.57-4.el7 will be installed
--->  Package doxygen.x86_64 1:1.8.5-3.el7 will be installed
--->  Package flex.x86_64 0:2.5.37-3.el7 will be installed
--->  Package gcc.x86_64 0:4.8.5-16.el7 will be installed
.
.
perl-TermReadKey.x86_64 0:2.30-20.el7           perl-Test-Harness.noarch 0:3.28-3.el7       perl-Thread-Queue.noarch 0:3.02-2.el7        
  perl-XML-Parser.x86_64 0:2.41-10.el7            perl-srpm-macros.noarch 0:1-8.el7           subversion-libs.x86_64 0:1.7.14-11.el7_4     
  systemtap-client.x86_64 0:3.1-3.el7             systemtap-devel.x86_64 0:3.1-3.el7         

Complete!

Now install pcre and pcre-devel packages which is also required for Apache installation by running the following command.

[root@linuxhelp1 ~]# yum install expat-devel pcre pcre-devel openssl-devel -y
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * base: mirrors.vinahost.vn
 * extras: mirrors.vinahost.vn
 * updates: ftp.iitm.ac.in
Package pcre-8.32-17.el7.x86_64 already installed and latest version
Resolving Dependencies
-->  Running transaction check
--->  Package expat-devel.x86_64 0:2.1.0-10.el7_3 will be installed
--->  Package openssl-devel.x86_64 1:1.0.2k-8.el7 will be installed
-->  Processing Dependency: zlib-devel(x86-64) for package: 1:openssl-devel-1.0.2k-8.el7.x86_64
-->  Processing Dependency: krb5-devel(x86-64) for package: 1:openssl-devel-1.0.2k-8.el7.x86_64
--->  Package pcre-devel.x86_64 0:8.32-17.el7 will be installed
-->  Running transaction check
--->  Package krb5-devel.x86_64 0:1.15.1-8.el7 will be installed
-->  Processing Dependency: libverto-devel for package: krb5-devel-1.15.1-8.el7.x86_64
-->  Processing Dependency: libselinux-devel for package: krb5-devel-1.15.1-8.el7.x86_64
-->  Processing Dependency: libcom_err-devel for package: krb5-devel-1.15.1-8.el7.x86_64
-->  Processing Dependency: keyutils-libs-devel for package: krb5-devel-1.15.1-8.el7.x86_64
--->  Package zlib-devel.x86_64 0:1.2.7-17.el7 will be installed
-->  Running transaction check
--->  Package keyutils-libs-devel.x86_64 0:1.5.8-3.el7 will be installed
.
.
Dependency Installed:
  keyutils-libs-devel.x86_64 0:1.5.8-3.el7         krb5-devel.x86_64 0:1.15.1-8.el7          libcom_err-devel.x86_64 0:1.42.9-10.el7        
  libselinux-devel.x86_64 0:2.5-11.el7             libsepol-devel.x86_64 0:2.5-6.el7         libverto-devel.x86_64 0:0.2.5-4.el7            
  zlib-devel.x86_64 0:1.2.7-17.el7                

Complete!


Download the Apache source code along with apr and apr-util from Apache' s official website or from Git repository by using the following URLs

Apache httpd - https://github.com/apache/httpd/releases
Apr - https://github.com/apache/apr/releases
Apr-util - https://github.com/apache/apr-util/releases

or execute the wget command followed by the respective download links.

[root@linuxhelp1 ~]# wget https://github.com/apache/httpd/archive/2.4.28.tar.gz -O httpd-2.4.28.tar.gz
--2017-10-14 15:57:39--  https://github.com/apache/httpd/archive/2.4.28.tar.gz
Resolving github.com (github.com)... 192.30.255.113, 192.30.255.112
Connecting to github.com (github.com)|192.30.255.113|:443... connected.
HTTP request sent, awaiting response... 302 Found
Location: https://codeload.github.com/apache/httpd/tar.gz/2.4.28 [following]
--2017-10-14 15:57:41--  https://codeload.github.com/apache/httpd/tar.gz/2.4.28
Resolving codeload.github.com (codeload.github.com)... 192.30.255.120, 192.30.255.121
Connecting to codeload.github.com (codeload.github.com)|192.30.255.120|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [application/x-gzip]
Saving to: ‘ httpd-2.4.28.tar.gz’ 

    [                                                                         < =>                        ] 1,14,89,746  556KB/s   in 27s    

2017-10-14 15:58:09 (420 KB/s) - ‘ httpd-2.4.28.tar.gz’  saved [11489746]

[root@linuxhelp1 ~]# wget https://github.com/apache/apr/archive/1.6.2.tar.gz -O apr-1.6.2.tar.gz
--2017-10-14 15:58:18--  https://github.com/apache/apr/archive/1.6.2.tar.gz
Resolving github.com (github.com)... 192.30.255.112, 192.30.255.113
Connecting to github.com (github.com)|192.30.255.112|:443... connected.
HTTP request sent, awaiting response... 302 Found
Location: https://codeload.github.com/apache/apr/tar.gz/1.6.2 [following]
--2017-10-14 15:58:20--  https://codeload.github.com/apache/apr/tar.gz/1.6.2
Resolving codeload.github.com (codeload.github.com)... 192.30.255.120, 192.30.255.121
Connecting to codeload.github.com (codeload.github.com)|192.30.255.120|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [application/x-gzip]
Saving to: ‘ apr-1.6.2.tar.gz’ 

    [          < =>                                                                                       ] 7,30,808     265KB/s   in 2.7s   

2017-10-14 15:58:24 (265 KB/s) - ‘ apr-1.6.2.tar.gz’  saved [730808]

[root@linuxhelp1 ~]# wget https://github.com/apache/apr-util/archive/1.6.0.tar.gz -O apr-util-1.6.0.tar.gz
--2017-10-14 15:58:31--  https://github.com/apache/apr-util/archive/1.6.0.tar.gz
Resolving github.com (github.com)... 192.30.255.112, 192.30.255.113
Connecting to github.com (github.com)|192.30.255.112|:443... connected.
HTTP request sent, awaiting response... 302 Found
Location: https://codeload.github.com/apache/apr-util/tar.gz/1.6.0 [following]
--2017-10-14 15:58:33--  https://codeload.github.com/apache/apr-util/tar.gz/1.6.0
Resolving codeload.github.com (codeload.github.com)... 192.30.255.120, 192.30.255.121
Connecting to codeload.github.com (codeload.github.com)|192.30.255.120|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [application/x-gzip]
Saving to: ‘ apr-util-1.6.0.tar.gz’ 

    [       < =>                                                                                          ] 4,34,431     243KB/s   in 1.7s   

2017-10-14 15:58:37 (243 KB/s) - ‘ apr-util-1.6.0.tar.gz’  saved [434431]

All the required packages has been downloaded. Now extract the packages by running the tar command as follows.

[root@linuxhelp1 ~]# tar -xzf httpd-2.4.28.tar.gz
[root@linuxhelp1 ~]# tar -xzf apr-1.6.2.tar.gz
[root@linuxhelp1 ~]# tar -xzf apr-util-1.6.0.tar.gz

Next we need to place apr and apr-util directory inside srclib directory which is located under HTTPD directory, and the name should be in apr and apr-util. Use the following command to move apr and apr-util directory to the respective directory.

[root@linuxhelp1 ~]# mv apr-1.6.2 httpd-2.4.28/srclib/apr
[root@linuxhelp1 ~]# mv apr-util-1.6.0 httpd-2.4.28/srclib/apr-util

Now move to HTTPD directory.

[root@linuxhelp1 ~]# cd httpd-2.4.28

Compilation of Apache source
To build configure script, execute the following buildconf script file as follows.

[root@linuxhelp1 httpd-2.4.28]# ./buildconf 
found apr source: srclib/apr
found apr-util source: srclib/apr-util
rebuilding srclib/apr/configure
buildconf: checking installation...
buildconf: python version 2.7.5 (ok)
buildconf: autoconf version 2.69 (ok)
buildconf: libtool version 2.4.2 (ok)
buildconf: copying libtool helper files using /usr/bin/libtoolize
.
.
rebuilding rpm spec file
fixing timestamps for ap_expr sources

Next run the configure command as shown below. You can change the default Apache installation directory path, here we have mentioned /usr/local/apache2 directory path.

[root@linuxhelp1 httpd-2.4.28]# ./configure --enable-ssl --enable-so --with-mpm=event --with-included-apr --prefix=/usr/local/apache2
checking for chosen layout... Apache
checking for working mkdir -p... yes
checking for grep that handles long lines and -e... /usr/bin/grep
checking for egrep... /usr/bin/grep -E
checking build system type... x86_64-pc-linux-gnu
checking host system type... x86_64-pc-linux-gnu
checking target system type... x86_64-pc-linux-gnu
configure: 
configure: Configuring Apache Portable Runtime library...
configure: 
configuring package in srclib/apr now
checking build system type... x86_64-pc-linux-gnu
checking host system type... x86_64-pc-linux-gnu
checking target system type... x86_64-pc-linux-gnu
Configuring APR library
Platform: x86_64-pc-linux-gnu
checking for working mkdir -p... yes
APR Version: 1.6.2
checking for chosen layout... apr
.
.
configure: summary of build options:

    Server Version: 2.4.28
    Install prefix: /usr/local/apache2
    C compiler:     gcc -std=gnu99
    CFLAGS:          -g -O2 -pthread
    LDFLAGS:         
    LIBS:           
    CPPFLAGS:        -DLINUX -D_REENTRANT -D_GNU_SOURCE
    C preprocessor: gcc -E

Execute the make command to prepare the files for the installation of Apache.

[root@linuxhelp1 httpd-2.4.28]# make
Making all in srclib
make[1]: Entering directory `/root/httpd-2.4.28/srclib' 
Making all in apr
make[2]: Entering directory `/root/httpd-2.4.28/srclib/apr' 
make[3]: Entering directory `/root/httpd-2.4.28/srclib/apr' 
/root/httpd-2.4.28/srclib/apr/build/mkdir.sh tools
/bin/sh /root/httpd-2.4.28/srclib/apr/libtool --silent --mode=compile gcc -g -O2 -pthread   -DHAVE_CONFIG_H  -DLINUX -D_REENTRANT -D_GNU_SOURCE   -I./include -I/root/httpd-2.4.28/srclib/apr/include/arch/unix -I./include/arch/unix -I/root/httpd-2.4.28/srclib/apr/include/arch/unix -I/root/httpd-2.4.28/srclib/apr/include -I/root/httpd-2.4.28/srclib/apr/include/private -I/root/httpd-2.4.28/srclib/apr/include/private  -o tools/gen_test_char.lo -c tools/gen_test_char.c & &  touch tools/gen_test_char.lo
.
.
make[4]: Leaving directory `/root/httpd-2.4.28/modules/mappers' 
make[3]: Leaving directory `/root/httpd-2.4.28/modules/mappers' 
make[2]: Leaving directory `/root/httpd-2.4.28/modules' 
make[2]: Entering directory `/root/httpd-2.4.28/support' 
make[2]: Leaving directory `/root/httpd-2.4.28/support' 

make[1]: Leaving directory `/root/httpd-2.4.28' 

Execute the make install command to install Apache in it' s appropriate directory.

[root@linuxhelp1 httpd-2.4.28]# make install
Making install in srclib
make[1]: Entering directory `/root/httpd-2.4.28/srclib' 
Making install in apr
make[2]: Entering directory `/root/httpd-2.4.28/srclib/apr' 
make[3]: Entering directory `/root/httpd-2.4.28/srclib/apr' 
make[3]: Nothing to be done for `local-all' .
make[3]: Leaving directory `/root/httpd-2.4.28/srclib/apr' 
/root/httpd-2.4.28/srclib/apr/build/mkdir.sh /usr/local/apache2/lib /usr/local/apache2/bin /usr/local/apache2/build 
         /usr/local/apache2/lib/pkgconfig /usr/local/apache2/include
mkdir /usr/local/apache2
mkdir /usr/local/apache2/lib
mkdir /usr/local/apache2/bin
mkdir /usr/local/apache2/build
mkdir /usr/local/apache2/lib/pkgconfig
mkdir /usr/local/apache2/include
.
.
mkdir /usr/local/apache2/manual
make[1]: Leaving directory `/root/httpd-2.4.28' 

Now the Apache is successfully installed on the server from it' s source code. Next run the httpd -v command to check Apache' s version. A error may appear as shown below.

[root@linuxhelp1 httpd-2.4.28]# httpd -v
bash: httpd: command not found...

To remove that error, create a HTTPD commad manually. Create a script file for httpd command under /etc/profile.d/ directory. Enter the following line in the file and save it.

[root@linuxhelp1 httpd-2.4.28]# vim /etc/profile.d/httpd.sh
pathmunge /usr/local/apache2/bin

The file has been created, now logout from the current session and re-login to reload the profile. Check the Apache version by running the following command.

[root@linuxhelp1 ~]# httpd -v
Server version: Apache/2.4.28 (Unix)
Server built:   Oct 13 2017 23:23:07

Create an init script for managing httpd service. So create a httpd file under /etc/init.d/ directory using vim editor and make the following changes in the file. Save and exit the file.

[root@linuxhelp1 ~]# vim /etc/systemd/system/httpd.service

[Unit]
Description=The Apache HTTP Server
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/apache2/bin/apachectl -k start
ExecReload=/usr/local/apache2/bin/apachectl -k graceful
ExecStop=/usr/local/apache2/bin/apachectl -k graceful-stop
PIDFile=/usr/local/apache2/logs/httpd.pid
PrivateTmp=true

[Install]
WantedBy=multi-user.target

Reload the Systemctl daemon by executing the following command.

[root@linuxhelp1 ~]# systemctl daemon-reload

Now start and enable your Apache httpd service with the following command.

[root@linuxhelp1 ~]# systemctl start httpd
[root@linuxhelp1 ~]# systemctl enable httpd
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /etc/systemd/system/httpd.service.

Switch over to the browser and enter the IP address for the Apache server to run in the target system. It runs without any glitches.

Thus we conclude the installation and configuration of Apache from its Source Code on CentOS 7.

Tag : Apache CentOS
Comment
brittwell
Aug 15 2021
how do you remove the installed one? i got two version installed ..this one located in ServerRoot "/usr/local/apache2"...the default one in var/www/html...when i yum remove, it only uninstalled default one...this version (the one on the article still exist) cannot be removed
MariettoTI
Dec 30 2020
Thanks! I have done the same tutorial for apache http 2.4.46 and with python 3.8, a little not if make don't work only install make, yum -y install make haha. Very thanks for your help. Cheers from Ecuador.
melik2k3
Jun 06 2019
Thank you very much!
parthiban
Aug 27 2018
Thanks for your Feedback and keep in touch for further tutorials
ArunR
Aug 17 2018
Hi Guys.., I have followed the steps to install this apache source installation on my DR server. It is worked and really helped me. Really resourceful site. Keep on Roccccking.!!!!!.
Add a comment
FAQ
Q
What is a Web server used for?
A
Apache is a freely available Web server that is distributed under an "open source" license. Version 2.0 runs on most UNIX-based operating systems (such as Linux, Solaris, Digital UNIX, and AIX), on other UNIX/POSIX-derived systems (such as Rhapsody, BeOS, and BS2000/OSD), on AmigaOS, and on Windows 2000.
Q
What is Apache and how it works?
A
The Apache HTTP server is a software (or program) that runs in the background under an appropriate operating system, which supports multi-tasking, and provides services to other applications that connect to it, such as client web browsers.
Q
What is the use of Apache?
A
Apache is the most widely used web server software. Developed and maintained by Apache Software Foundation, Apache is an open source software available for free. It runs on 67% of all webservers in the world. It is fast, reliable, and secure.
Q
Who developed the Apache HTTP server?
A
Originally based on the NCSA HTTPd server, development of Apache began in early 1995 after work on the NCSA code stalled. Apache played a key role in the initial growth of the World Wide Web, quickly overtaking NCSA HTTPd as the dominant HTTP server, and has remained most popular since April 1996.
Q
Why do I get a "Forbidden" message whenever I try to access a particular directory?
A
This message is generally caused because of either the underlying file system permissions do not allow the User/Group under which Apache is running to access the necessary files.