How to Install and Configure Apache for Your Website – EC2InstanceHelper

Apache is a powerful web server that supports more than 50 million websites. It’s developed by the Apache Software Foundation and used by a variety of businesses, from small businesses to large corporations. Apache has been around since 1995 and is still one of the most popular web servers in use today. This guide will walk you through installing and configuring Apache on your remote Linux server.

Step 1 – Prerequisites

To install Apache on a Linux system, the following prerequisites are necessary:

A Linux distribution is installed on your machine, such as Ubuntu, CentOS, or Fedora.

Administrative privileges to perform the installation.

An internet connection to download the Apache packages.

The necessary packages for compiling Apache from sources, such as build-essential, libpcre3-dev, and zlib1g-dev.

A text editor, such as nano or vim, to edit the Apache configuration files.

Before installing Apache, it’s a good idea to check if there’s an Apache package available in the default package repository of your Linux distribution. If so, it’s recommended to use that package as it will simplify the installation process.


For Debian-based systems (e.g. Ubuntu, Mint, etc.) use apt:

apt search apache2

CentOS, etc

yum list httpd

yum info httpd

The result should indicate if the repository is available or if it is already installed. Ran on  a target, centos distribution below is the output


[root@ip--------]# yum list httpd

Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
244 packages excluded due to repository priority protections
Installed Packages
httpd.x86_64                                  2.4.54-1.amzn2                                   @amzn2-core
[root@ip--------]# yum info httpd

Loaded plugins: extras_suggestions, langpacks, priorities, update-motd

244 packages excluded due to repository priority protections

Installed Packages
Name        : httpd
Arch        : x86_64
Version     : 2.4.54
Release     : 1.amzn2
Size        : 4.1 M
Repo        : installed
From repo   : amzn2-core
Summary     : Apache HTTP Server
  • It’s very important that you already have a domain name and DNS properly configured to the IP address of the target Linux machine.
  • You will also need SSH access to the target server.
  • The memory requirement for Apache is usually a minimum 512 MB although it can vary depending on the number of modules you are using in your configuration file.
  • For Ubuntu and Debian distributions Apache is called “apache2” and for centos-based systems, it’s called “httpd”.


Apache Installation

Here are the steps to install Apache on the three mentioned Linux systems:


sudo apt update
sudo apt install apache2


sudo yum update
sudo yum install httpd

Once the installation is complete, you can start the Apache service using the following command:

sudo systemctl start apache2 # on Ubuntu/Debian
sudo systemctl start httpd # on CentOS

sudo systemctl enable apache2 # on Ubuntu/Debian
sudo systemctl enable httpd # on CentOS

Location for Apache Config files

For Linux distributions, Apache configuration files are usually stored in the following locations for different distributions:

  • Debian/Ubuntu: The main Apache configuration file is typically located at “/etc/apache2/apache2.conf”.
  • The virtual host configurations are stored in the “/etc/apache2/sites-available” directory.
  • CentOS: The main Apache configuration file is typically located at “/etc/httpd/conf/httpd.conf”.
  • The virtual host configurations are stored in the “/etc/httpd/conf.d” directory.

Note that these paths may vary depending on the version of the Linux distribution and the method used to install Apache.

See also  Guide to Modules and Configuration with examples - Apache Web Server - EC2InstanceHelper

Below is the SSH output of the centos-based distribution :

[root@ip-----httpd]# ls -lt
drwxr-xr-x 2 root root 138 Oct 31 00:26 conf.d
drwxr-xr-x 2 root root 264 Oct 31 00:10 conf.modules.d
drwxr-xr-x 2 root root  59 Oct 27 12:48 conf
lrwxrwxrwx 1 root root  10 Oct 26 14:15 run -> /run/httpd
lrwxrwxrwx 1 root root  19 Oct 26 14:15 state -> ../../var/lib/httpd
lrwxrwxrwx 1 root root  19 Oct 26 14:15 logs -> ../../var/log/httpd
lrwxrwxrwx 1 root root  29 Oct 26 14:15 modules -> ../../usr/lib64/httpd/modules

[root@ip--------- conf]# ls -lt
-rw-r--r-- 1 root root 15691 Oct 28 13:38 httpd.conf                                                   //Apache config
-rw-r--r-- 1 root root 13064 Jun 30  2022 magic
-rw-r--r-- 1 root root 11910 Jun 30  2022 httpd.conf.old

[root@ip--------- conf.d]# ls -lt
-rw-r--r-- 1 root root 9732 Oct 28 14:58 ssl.conf                                                          //SSL configuration
-rw-r--r-- 1 root root 2893 Jun 30  2022 autoindex.conf
-rw-r--r-- 1 root root  366 Jun 30  2022 README
-rw-r--r-- 1 root root 1252 Jun 30  2022 userdir.conf
-rw-r--r-- 1 root root  516 Jun 30  2022 welcome.conf
-rw-r--r-- 1 root root 1618 Jun 23  2022 php.conf
-rw-r--r-- 1 root root 3475 Jun 16  2015 mod_evasive.conf                                       //Security module

The Virtual host directory contains additional modules that can be used to extend the functionality of your Apache server.   This directory contains configuration files for your virtual hosts. When a new site is configured, Apache will read the file from this directory and include its contents into your main server configuration file.

Step 3 – Configuring Virtual Hosts for Apache

Virtual hosts are a way to host single/multiple websites on a single web server. Each virtual host has a unique domain name and can serve its own content. To configure multiple Apache virtual hosts, you need to create separate virtual host configurations for each website in the Apache configuration file (usually named “httpd.conf”).

Each virtual host configuration should

  • specify the domain name,
  • Document Root (the directory where website files are stored),
  • and any other necessary options such as the port number and Server Name.

Here is an example of a basic virtual host configuration in Apache. This can be done in the same conf file or added to new files and pointed to by main conf file.

<VirtualHost *:80>
    DocumentRoot /var/www/

<VirtualHost *:80>
    DocumentRoot /var/www/

After editing the Apache configuration file, you need to restart the Apache service for the changes to take effect.

Hosting Multiple Websites on Apache Server

You may configure multiple web hosts in the same config file or create separate config files, both methods can be used to configure multiple websites on an Apache server. However, using multiple virtual host files is considered the best practice as it provides better organization and ease of maintenance. A virtual host file is a separate file for each website, allowing you to configure specific settings for each website independently, and it also makes it easier to manage and update each website without affecting others.

Below are two virtual host files for two separate websites, and, on an Apache server:

<VirtualHost *:80>
    DocumentRoot /var/www/
    ErrorLog /var/www/

<VirtualHost *:80>
    DocumentRoot /var/www/
    ErrorLog /var/www/

Setup Document Root and Permissions for Apache

The DocumentRoot is the directory on your server that contains the files to be served for a website. It’s specified in the virtual host file and Apache serves web files from that directory in response to incoming requests.

See also  Save Money on EC2 Instances using Spot Instances -  EC2InstanceHelper

Correct permissions for the DocumentRoot depend on your specific needs, but a common and secure setup is to allow the web server process (usually Apache or nginx) to read the files, and a separate user (such as “www-data” normally used by Apache and Nginx servers) to own the files and have write access to the directory.

Below is a quick demo of how to set correct permissions using the chown and chmod commands:

sudo chown -R www-data:www-data /var/www/
sudo chmod -R 755 /var/www/

  • This sets the owner and group of the directory and all files inside to www-data
  • Sets the permissions to 755, which means that the owner has read, write, and execute permissions.
  • while everyone else has only read and execute permissions.

Step 4: Starting and Checking Apache

To start Apache, you can use the following command:

sudo systemctl start apache2         //Ubuntu and Debian
sudo systemctl start httpd        //Centos

To check the Apache server status:

Check Apache status: sudo systemctl status apache2

Check Apache status: sudo systemctl status httpd

Both commands should return output indicating whether Apache is running and functioning properly. The exact output may vary depending on the version of the operating system and Apache. If Apache is running correctly, the output should indicate that the Apache service is active (running).

Below is the output of centos based distribution:

[root@ip-------- conf.d]# sudo systemctl status httpd
httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
  Drop-In: /usr/lib/systemd/system/httpd.service.d
   Active: active (running) since Fri 2023-01-06 01:50:31 UTC; 3 weeks 6 days ago
     Docs: man:httpd.service(8)
  Process: 1848 ExecReload=/usr/sbin/httpd $OPTIONS -k graceful (code=exited, status=0/SUCCESS)
 Main PID: 2110 (httpd)

if the status is “Dead” then check the error log file. most likely is because of Apache not finding files where they are supposed to be.

Configuring SSL for Your Website on Apache

SSL (Secure Sockets Layer) is a security protocol that provides encryption and authentication for communication over the internet. It is now commonly known as TLS (Transport Layer Security). To configure SSL for Apache, you need to obtain a SSL certificate from a trusted certificate authority (CA) and install it on your Apache server. The process of obtaining a certificate and installing it may vary depending on the CA you choose.

Once you have obtained the certificate, you can configure SSL for Apache by adding the following lines to your virtual host configuration in Apache’s configuration file. Normally these config is added to ssl.conf as shown in the above section.

<VirtualHost *:443>
    DocumentRoot /var/www/
    SSLEngine on
    SSLCertificateFile /path/to/certificate.crt
    SSLCertificateKeyFile /path/to/private.key

The certificate and private key files have to be issued by CA service( or you can self-sign the certs ). Whatever the process is, we are not going to go into details of it for now. We assume you have got access to these required cert files. Note that you also need to ensure that the Apache mod_ssl module is enabled and that port 443 is open in your firewall. After making the changes, restart the Apache service for the changes to take effect.

See also  Path to AWS Certifications: Guidelines and Tips - EC2InstanceHelper

To check if the mod_ssl module is enabled in Apache, you can run the following command:

sudo apachectl -M | grep ssl

If the module is enabled, you will see the line ssl_module (static) in the output.

If the module is not enabled, you can enable it on Ubuntu/Debian by running the following command:
sudo a2enmod ssl

And on CentOS, run the following command:
sudo yum install mod_ssl

After enabling the mod_ssl module, you need to restart the Apache service for the changes to take effect:

sudo systemctl restart apache2 # on Ubuntu/Debian

sudo systemctl restart httpd # on CentOS

Redirect HTTP to HTTPS for Apache

You may want to redirect all HTTP (port 80 ) traffic to HTTPS ( port 443 )  to direct all your users to secure socket layers communication which would normally be the preferred way of communication.

Edit the Apache configuration file for editing and add the following lines in the virtual Host section.

RewriteEngine on
RewriteCond %{SERVER_PORT} !^443$ [NC]
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

Save the changes and don’t forget to restart your Apache server.

If for any reason above code doesn’t work try the below code:

Redirect permanent /

Configure SSL Certs using Lets Encrypt Project

Let’s Encrypt is a non-profit organization that provides free, automated, and open Certificate Authority (CA) services, allowing anyone to secure their website with SSL/TLS certificates. These certificates are used to establish a secure and encrypted connection between a website and its visitors’ web browsers. By making it easy and free for website owners to obtain and install certificates, Let’s Encrypt aims to improve internet security and privacy for everyone. Below we are giving out a very basic demo of how to install lets encrypt issued SSL certs on your system. It is not intended to be a detailed tutorial.

Install certbot: sudo apt install certbot
Obtain SSL certificate: sudo certbot --apache
Follow the on-screen instructions to complete the SSL certificate issuance process
Verify SSL certificate installation: sudo certbot certificates

Install certbot: sudo yum install certbot
Obtain SSL certificate: sudo certbot --apache
Follow the on-screen instructions to complete the SSL certificate issuance process
Verify SSL certificate installation: sudo certbot certificates


The above instructions are for obtaining an SSL certificate using the certbot tool and assuming the Apache web server is already installed and running.

Apache- Check if it all works:

If all has gone well, if you access the domain name in Brower you should be redirected to the Apache default welcome screen