How to Install and Configure Apache Virtual Hosts on Ubuntu 18.04/20.04/22.04 LTS
Serving multiple websites from a single server is a common and efficient practice. Apache Virtual Hosts make this possible, allowing you to host several domains or subdomains on one machine. This guide will walk you through setting up Apache Virtual Hosts on Ubuntu 18.04, 20.04, and 22.04 LTS. Understanding How to Install and Configure Apache Virtual Hosts on Ubuntu 18.04/20.04/22.04 LTS is crucial for efficient server management.
Introduction
Virtual hosts are configurations within Apache that define how the web server should respond to different domain names or subdomains. Each virtual host can have its own document root (the directory where website files are stored), error logs, and access logs. This isolation is key to managing multiple websites effectively. This guide focuses on How to Install and Configure Apache Virtual Hosts on Ubuntu 18.04/20.04/22.04 LTS.
Step 1: Install Apache
Before diving into virtual host configuration, ensure Apache is installed on your Ubuntu server. Use the following commands:
$ sudo apt update
$ sudo apt install apache2
The first command updates the package list, while the second installs Apache. After installation, verify Apache is running by visiting your server’s IP address in a web browser:
You should see the Apache default page:

Step 2: Set Up a Domain Name
Virtual hosts rely on domain names to direct traffic to the correct website. You’ll need a domain name that points to your server’s IP address.
If you don’t have a domain name, consider registering one.
After acquiring a domain, create an A record in your DNS settings that maps the domain to your server’s IP address. This ensures that when someone types your domain name into their browser, their request is routed to your server.
Step 3: Create the Virtual Host Files
Virtual host configuration files reside in the /etc/apache2/sites-available
directory. Each website hosted on your server requires its own configuration file.
For example, to create a virtual host for example.com
, create a file named /etc/apache2/sites-available/example.com.conf
with the following content:
<VirtualHost *:80>
ServerAdmin <a href="/cdn-cgi/l/email-protection" data-cfemail="1d6a787f707c6e69786f5d78657c706d7178337e7270">[email protected]</a>
ServerName example.com
ServerAlias www.example.com
DocumentRoot /var/www/example.com/public_html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
Replace example.com
with your actual domain name. Let’s break down the configuration:
<VirtualHost *:80>
: Defines a virtual host that listens on port 80 (the standard HTTP port).ServerAdmin
: The email address of the website administrator.ServerName
: The primary domain name for the virtual host.ServerAlias
: Any alternative domain names or subdomains that should point to the same website (e.g.,www.example.com
).DocumentRoot
: The directory where the website’s files are stored. This is where Apache will look for theindex.html
orindex.php
file to serve.ErrorLog
: The location where Apache will log any errors encountered while serving the website.CustomLog
: The location where Apache will log all requests to the website.
Step 4: Enable the Virtual Host Files
After creating the virtual host files, enable them using the a2ensite
command:
$ sudo a2ensite example.com.conf
This command creates a symbolic link from the sites-available
directory to the sites-enabled
directory, effectively enabling the virtual host.
Step 5: Disable the Default Virtual Host
Apache comes with a default virtual host configuration located at /etc/apache2/sites-available/000-default.conf
. This default configuration needs to be disabled to prevent conflicts with your newly created virtual hosts.
Disable the default virtual host using the a2dissite
command:
$ sudo a2dissite 000-default.conf
Step 6: Restart Apache
To apply the changes, restart the Apache web server:
$ sudo systemctl restart apache2
This command reloads the Apache configuration, making your virtual hosts active.
Step 7: Test Your Virtual Hosts
Verify your virtual hosts are working correctly by visiting your website in a web browser. If you configured example.com
, navigate to http://example.com
. You should see the content located in the DocumentRoot
directory you specified in the virtual host configuration file.
Conclusion
This guide outlined the steps to install and configure Apache Virtual Hosts on Ubuntu. Virtual hosts are a powerful tool for hosting multiple websites on a single server, making efficient use of resources.
Alternative Solutions and Elaboration
While the above method is standard, here are two alternative approaches to achieving similar results:
1. Using Docker Containers
Docker provides a way to containerize each website, giving each its own isolated environment. This approach is more resource-intensive than virtual hosts but offers increased security and portability.
Explanation:
Docker containers package an application with all its dependencies, isolating it from other applications on the same server. This prevents conflicts and ensures that each website runs in a consistent environment, regardless of the underlying operating system.
Steps:
- Install Docker: Follow the official Docker installation instructions for Ubuntu.
- Create Dockerfiles: For each website, create a
Dockerfile
that defines how to build the Docker image. This Dockerfile will typically:- Start from a base image (e.g.,
ubuntu:latest
orphp:7.4-apache
). - Copy the website’s files into the container.
- Install any necessary dependencies (e.g., PHP extensions, database drivers).
- Configure Apache within the container.
- Expose port 80.
- Start from a base image (e.g.,
- Build Docker Images: Use the
docker build
command to create Docker images from the Dockerfiles. - Run Docker Containers: Use the
docker run
command to start containers from the images. - Configure Reverse Proxy: Use a reverse proxy (like Nginx or Apache itself) to route traffic to the appropriate container based on the domain name.
Code Example (Dockerfile for a simple PHP website):
FROM php:7.4-apache
# Copy website files into the container
COPY . /var/www/html/
# Install any necessary PHP extensions
RUN apt-get update && apt-get install -y
libpng-dev
libjpeg62-turbo-dev
libfreetype6-dev
zip
unzip
&& docker-php-ext-configure gd --with-freetype --with-jpeg
&& docker-php-ext-install -j $(nproc) gd mysqli pdo pdo_mysql zip
# Set document root
RUN sed -i 's!/var/www/html!/var/www/html!g' /etc/apache2/sites-available/000-default.conf
RUN a2enmod rewrite
# Expose port 80
EXPOSE 80
Reverse Proxy Configuration (Nginx Example):
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://<docker_container_ip>:80;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
Replace <docker_container_ip>
with the IP address of the Docker container running the example.com
website.
2. Using a Control Panel (e.g., cPanel, Plesk)
Control panels provide a graphical interface for managing web servers, simplifying the process of creating and managing virtual hosts.
Explanation:
Control panels abstract away the complexities of command-line configuration, offering a user-friendly way to manage domains, databases, email accounts, and other server-related tasks.
Steps:
- Install a Control Panel: Choose a control panel that suits your needs (e.g., cPanel, Plesk, Virtualmin). Follow the installation instructions provided by the control panel vendor.
- Add Domains: Use the control panel’s interface to add the domain names you want to host.
- Create Virtual Hosts: The control panel will typically handle the creation of virtual host configuration files automatically when you add a domain.
- Manage Website Files: Upload your website files to the appropriate directory specified by the control panel.
- Configure DNS: Ensure that your domain names are pointing to your server’s IP address.
Advantages:
- Simplified management: Control panels provide a graphical interface for managing various server tasks.
- Automation: Many tasks, such as creating virtual hosts and managing databases, are automated.
- User-friendly: Easier for users who are not comfortable with the command line.
Disadvantages:
- Cost: Most control panels are commercial products and require a license fee.
- Resource usage: Control panels can consume significant server resources.
- Complexity: While they simplify many tasks, they can also add a layer of complexity to the overall server setup.
These alternative solutions offer different trade-offs in terms of complexity, resource usage, and control. The best approach depends on your specific needs and technical expertise.