In this article, you will learn how to install the Apache web server on CentOS/RHEL 8.
Apache is a
web-server. And it is in the market since
April 1995, also it is
open-source software, which means anyone can view the software code, modify, and share it freely.
The primary role of any web server is to
serve the webpage to the
end-users. Apache uses
HTTP protocol to bring the web pages to the users. And, we are going to install and configure the Apache web server. Nowadays, many web servers’ companies are using
Nginx. But Apache has its importance.
It has a
33% market share in the year
2020. It provides many powerful features, some of them mentioned below,
- Dynamic Modules
- Compatible with IPv6
- Apache server supports HTTP/2
- .htaccess per-directory configuration support
- gzip compression and decompression
- Handling of static files, index files, auto-indexing, and content negotiation
- Perl, PHP, and Lua scripts are already build
- FTP connections are possible with proper module
Alternative of Apache
- Apache Tomcat
- Microsoft IIS
- You have a
- You must log-in with a
rootuser or a user with
sudoprivilege to make the changes.
- Internet connection
Now let’s begin to install the Apache web server.
Installation of Apache
Step 1: Before going to install Apache, we’ll check any
pending update of the software package with the below command.
Step 2: * Apache is available in default software repositories, to install it, you can use the below command.
dnf install httpd
Manage the services of Apache
Step 3: Once Apache has been installed. You have to
start the service and also need to
enable on startup. The service name of the Apache is
httpd. So, you can find the below command useful for this purpose.
systemctl enable --now httpd
And to verify the
httpd service status, use the following command.
systemctl status httpd
If you are getting the above picture like output, then Apache service is running. But, you have to allow the service or port in the firewall.
Configuring the firewall for Apache
Step 4: You need to configure the
firewall for allowing the traffic. Use the below command to authorize in the firewall.
firewall-cmd --permanent --add-service http
firewall-cmd --permanent --add-service https
So, after making the changes in firewall, you have to reload the firewall service,
Checking Apache server
Step 5: You can check your Apache server using
domain_name or using the
IP address in the
web browser. For instance, you can type as below.
For example, in my case the IP address for my server is
As a result, you shall get the output like in the below picture.
Managing the Apache service
Step 6: As of now, you’ll learn some basic process management of the Apache web server.
To stop the webserver
systemctl stop httpd
You can start the service if it is stopped, using the below command.
systemctl start httpd
Suppose, you are going to restart the service make sure that you know that firstly, it will stop the service, then it starts again. If someone is downloading or doing something on your website, he lost the connection.
systemctl restart httpd
If you simply executing configuration changes then you can only use reload without dropping the connections.
systemctl reload httpd
* Right now, our server is configured to start automatically on system startup. If you want to disable that.
systemctl disable httpd
Enabling the service on startup
systemctl enable httpd
To check, if the service is enabled on startup or not,
systemctl is-enabled httpd
Setting up Virtual Hosts
Step 7: If you want to host more than one domain server then you have to configure Apache
virtual host. I am going to set up a domain with the name
linuxgurus.in, But, you can replace this name with your domain name.
In Apache, by default location to store the website files are
/var/www/html directory. It is good for one website, but if you are using it for multiple websites, then it is not good. The best practice to host the new website is creating a new directory with the name of the website, in my case, it is
linuxgurus.in and I will create this directory inside
/var/www. so let’s create it,
mkdir -p /var/www/linuxgurus.in/html
It is also a good convention to create a
log directory, so that you can get it quickly, let’s create it.
mkdir -p /var/www/linuxgurus.in/log
Now, assign the
ownership of the html directory with the
$USER environmental variable,
chown -R $USER:$USER /var/www/linuxgurus.in/html
Make sure that your web root directory has the default permissions set,
chmod -R 755 /var/www
Creating a simple html file
Now we are going to create a simple html file or you can create as per your need. I’m using here vim editors to create this simple page.
i to go into
insert mode and type the below lines.
<html> <head> <title>Welcome to the Linux Guru</title> </head> <body> <h1> <center> You have created successfully this page and The linuxgurus.in virtual host is working. </center>> </h1> </body> </html>
To save the file, press
Esc key and type
:wq and press
Creating a directory to hold the Virtual Host information
As we have created an html file now we are going to create a directory with name
sites-available which will hold the virtual host information. and we need also to create another directory
sites-enabled this directory tells Apache that a virtual host is ready to serve the visitors. The
sites-enabled directory will hold
symbolic links to virtual hosts that we want to publish. Create both directories with the following command:
mkdir /etc/httpd/sites-available /etc/httpd/sites-enabled
Now we have to configure Apache to get the virtual host information from the
sites-enabled directory. So open the Apache configuration file. I’m using
vim editors to open this file, but you can use whatever is right editors for you.
So, add this below line to the end of the file,
Save the configuration file, pressing
Esc key, and typing
:wq and then press
Creating Virtual Host file
Now, as we have created the virtual host directory, So, we can create our virtual host file in the directory
In my case, the file name is
linuxgurus.in and you have to add the file extension
.conf in the end, so it will look like
For instance, I’m using again
vim editor to create the file. So, you can see the command as below.
Add in this file, the following configuration block, and change the
linuxgurus.in domain name to your domain name.
<VirtualHost *:80> ServerName www.linuxgurus.in ServerAlias linuxgurus.in DocumentRoot /var/www/linuxgurus.in/html ErrorLog /var/www/linuxgurus.in/log/error.log CustomLog /var/www/linuxgurus.in/log/requests.log combined </VirtualHost>
It will tell Apache where to find the root directly that holds the publicly accessible web documents. It also tells Apache where to store
request logs for this particular site. So, save and close the file when you are finished.
Now that you have created the virtual host files, you will enable them so that Apache knows to serve them to visitors. To do this, create a
symbolic link for each
virtual host in the
ln -s /etc/httpd/sites-available/linuxgurus.in.conf /etc/httpd/sites-enabled/linuxgurus.in.conf
virtual host is configured and it is ready to serve content. If you have enabled
SELinux, then you have to lookup for the few settings.
Altering SELinux Permissions for Virtual Hosts
Step 8: SELinux works with Apache by default but as we have created custom virtual host files so we need to update the
SElinux policy to allow them. Before changing the policy in SELinux if you restarted the service of Apache, you will get an error so let’s set up that first, and then we’ll restart the Apache service.
Firstly, we have to install
SELinux manage package so we can alter the settings of SELinux, use the below command to install it.
dnf install -y setroubleshoot-server selinux-policy-devel
Changing the Apache policy universally
Secondly, changing the SELinux boolean value.
setsebool -P httpd_unified 1
setsebool command alters
SELinux boolean values. The
-P flag will update the boot-time value, making this change persist across reboots.
httpd_unified is the boolean that will tell SELinux to treat all Apache processes as the same type, so you have enabled it with a value of
Changing the Apache policies for the directory
First, check the context type that SELinux gave the
ls -dZ /var/www/linuxgurus.in/log/
The current context is
httpd_sys_content_t, which tells SELinux that the Apache process can only read files created in this directory. In this tutorial, you will change the content type of the
/var/www/linuxgurus.in/log directory to
httpd_log_t. This type will allow Apache to generate and append to web application log files:
semanage fcontext -a -t httpd_log_t "/var/www/linuxgurus.in/log(/.*)?"
Now, use the
restorecon command to apply these changes and have them persist across reboots:
restorecon -R -v /var/www/linuxgurus.in/log
restorecon -R -v /var/www/linuxgurus.in/html
Here, If you are changing any file or re-writing with any other name in html, you have run the command
restorecon -R -v /var/www/linuxgurus.in/html
-R flag runs this command recursively, meaning it will update any existing files to use the new context. The
-v flag will print the context changes the command made. You will see the following output confirming the changes:
You can list the contexts once more to see the changes:
ls -dZ /var/www/linuxgurus.in/log/
The output reflects the updated context type:
Now that the
/var/www/linuxgurus.in/log directory is using the
httpd_log_t type, you are ready to test your virtual host configuration.
Now you can test the Virtual Host
Step 9: Now restart the Apache service
systemctl restart httpd
And you can check the logs Apache has created in directory
/var/www/linuxgurus.in/log with name
requests.log. And you get the list in SELinux that it has set in the policy
Now that you have your virtual host set up completed, and SELinux permissions updated, Apache will now serve your domain name. You can test this by navigating to
http://linuxgurus.in, or you can use your
IP address, where you should see something like this:
If you want to create a new
Virtual Host to set up a
new website, you can follow the steps from
step 7 to step 9.
In this tutorial, you learned how to install the apache web server on CentOS 8 and configure the virtual host. You can practice as many times as you want. I always recommend installing the Apache web server two or three times for practice. And try to know the terms. So, I hope you understand but, if you have any questions, you can ask in the comment section.
Also, you can further read,
- How to install and configure OpenSSH in Linux
- The latest Apache update
- How to install and configure Nginx server on CentOS 7
- And How to install WordPress on CentOS/RHEL 8
- How to install PHP 7.4 on CentOS/RHEL 8