Configuring Apache Vhost on CentOS

Configuring Apache Vhost on CentOS

In order for apache to accept connections from the internet and serve content to the internet, the VHOST for the domin name needs to be configured.

This article will guide you to configure a basic VHOST for a website.

Let's start creating the vhost

We will start by creating a directory sites where we will create all our Vhosts

mkdir /etc/httpd/conf/sites

Then create a sub directory for each website. I will be using example.com for this tutorial.

mkdir /etc/httpd/conf/sites/example.com

Enter the example.com directory.

cd /etc/httpd/conf/sites/example.com

Create a new file using vim:

vim httpd-example.com.conf

Now we will be defining the Directives of the Vhost

We start with the following tags to indicate the start and end of our Virtual Host

<VirtualHost *:80>

</VirtualHost>

Next we will be definining our ServerName which is usually the DNS and ServerAlias can be any DNS which will use the same VirtualHost.

<VirtualHost *:80>
	ServerName example.com
    ServerAlias www.example.com
    ServerAlias test.example.com
</VirtualHost>

Then we will add the DocumentRoot which is where the html and the website files will be placed. The default is /var/www/html but you can set whatever path you prefer.

We will also set the directory to be available by everyone without authentication with the AllowOverride All and Require all granted directives.

<VirtualHost *:80>
	ServerName example.com
    ServerAlias www.example.com
    ServerAlias test.example.com
    DocumentRoot "/home/websites/example.com/www"
    <Directory "/home/websites/example.com/www">
		AllowOverride All
		Require all granted
	</Directory>
</VirtualHost>

We also have to configure the logging for our website namely access and error logs.

We will be using the rotatelogs binary to make Apache automatically rotate the logs each day while appending date and time to the end of the logs

The final configuration of the VirtualHost should look as follow:

<VirtualHost *:80>
	ServerName example.com
    ServerAlias www.example.com
    ServerAlias test.example.com
    DocumentRoot "/home/websites/example.com/www"
    <Directory "/home/websites/example.com/www">
		AllowOverride All
		Require all granted
	</Directory>
    ErrorLog "|/usr/sbin/rotatelogs -l /home/logs/apache/example.com/err-%Y%m%d-%H%M.log 86400"
	CustomLog "|/usr/sbin/rotatelogs -l /home/logs/apache/example.com/%Y%m%d-%H%M.log 86400" combined
</VirtualHost>

You should make sure the directories specified have been created

Now we will add a line in the main httpd.conf file which will include another conf file in the vhost.

echo "Include conf/httpd-sites.conf" >> /etc/httpd/conf/httpd.conf

Then we will include our newly configured vhost file in the httpd-sites.conf file

Each time a vhost is added, we will append the file the same way we are doing so that each vhost will be included in the Apache

echo "Include conf/sites/example.com/httpd-example.com.conf" >> /etc/httpd/conf/httpd-sites.conf

Now check your configuration for errors

apachectl configtest

Now reload Apache Configurations using one of the following.

systemctl reload httpd
apachectl graceful

Now if you have firewalld and selinux enabled on your server, follow the next steps for the configuration to work.

Allow http and https service through firewalld

firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https

Check if selinux is enabled:

getenforce

If it is Enforcing as shown above, we should check the context of the default DocumentRoot directory.

Create a file in the documentroot:

touch  /var/www/html/index.html

Check for the selinux context

ls -Z /var/www/html/

Now check the context of the DocumentRoot directory defined in the new vhost.

ls -Z /home/websites/example.com/www

As you can see it is not the same and therefore we should make it the same:

chcon -Rt httpd_sys_content_t /home/websites/example.com/www

As you can see below, the context has changed