FedoraRHEL Based

How To Setup Virtual Host Apache on Fedora 42

Setup Virtual Host Apache on Fedora 42

Setting up Apache virtual hosts on Fedora 42 allows you to host multiple websites on a single server, each with its own domain name and content directory. This powerful feature enables efficient resource utilization while maintaining distinct web presences. In this comprehensive guide, we’ll walk through the entire process of configuring Apache virtual hosts on Fedora 42, from installation to advanced configurations and troubleshooting.

Table of Contents

Introduction

Apache HTTP Server remains one of the most popular web server platforms worldwide due to its reliability, flexibility, and robust feature set. Among its most valuable capabilities is virtual hosting-the ability to serve multiple websites from a single physical server. This functionality saves resources and simplifies administration while maintaining separate web identities.

Fedora 42, the latest in Red Hat’s community-driven Linux distribution line, provides an excellent platform for hosting web applications. Its cutting-edge packages and strong security features make it ideal for web hosting environments. Virtual hosting on Fedora leverages these strengths while adding powerful site management capabilities.

By the end of this tutorial, you’ll understand how to configure both name-based and IP-based virtual hosts, secure them with SSL/TLS, troubleshoot common issues, and implement best practices for Apache administration on Fedora 42.

Prerequisites and System Requirements

Before beginning the virtual host setup process, ensure your system meets these requirements:

  • A Fedora 42 installation with root or sudo access privileges
  • Minimum 2GB RAM (4GB recommended for production environments)
  • At least 20GB of available disk space
  • Basic familiarity with terminal commands and text editors
  • Domain names ready for configuration (or local testing alternatives)
  • Network connectivity with appropriate firewall settings

For production environments, you should have registered domain names pointing to your server’s IP address. For testing purposes, you can use hostname entries in your local /etc/hosts file as we’ll demonstrate later.

Installing Apache HTTP Server on Fedora 42

Let’s begin by installing Apache on your Fedora 42 system:

1. Open a terminal and update your system packages:

sudo dnf update -y

2. Install the Apache HTTP Server package:

sudo dnf install httpd -y

3. Start the Apache service and enable it to launch at system boot:

sudo systemctl start httpd
sudo systemctl enable httpd

4. Verify the installation by checking the service status:

sudo systemctl status httpd

You should see output indicating that the service is active and running. Now that Apache is installed, you can access the default welcome page by navigating to http://localhost in your web browser. Note that you may not be able to access the server from other hosts without additional configuration.

The default Apache configuration files are located in /etc/httpd/conf/, with additional configuration files in /etc/httpd/conf.d/. Understanding this directory structure is crucial as we’ll be modifying these files to create our virtual hosts.

Understanding Apache Virtual Hosts

Virtual hosting is Apache’s method for hosting multiple websites on a single server. Each website appears to have dedicated server resources from the user’s perspective, but they’re actually sharing the same physical server. Apache offers two primary approaches to virtual hosting:

Name-Based Virtual Hosting

Name-based virtual hosting uses the HTTP Host header to determine which website to serve. This approach allows multiple websites to share a single IP address, making it the most common and resource-efficient method. When a client makes a request, the server inspects the Host header and routes the request to the appropriate virtual host based on the domain name.

IP-Based Virtual Hosting

IP-based virtual hosting relies on different IP addresses to distinguish between websites. Each website is associated with a unique IP address, and Apache routes requests based on the destination IP address. This method is less common today but useful in specific scenarios, such as when SSL configurations require dedicated IPs or for compatibility with older clients that don’t send Host headers.

The primary configuration elements for both types of virtual hosts are contained within <VirtualHost> directive blocks in the Apache configuration files. These blocks encapsulate all settings specific to a particular website.

Configuring Name-Based Virtual Hosts

Name-based virtual hosting is the most common approach and easiest to implement. Let’s set up two name-based virtual hosts on our Fedora 42 server:

Step 1: Create Directory Structure

First, create directories to store your website files:

sudo mkdir -p /var/www/html/mydomain1.com/
sudo mkdir -p /var/www/html/mydomain2.com/

Step 2: Set Permissions

Set appropriate ownership and permissions for these directories:

sudo chmod -R 755 /var/www/html/
sudo chown -R apache:apache /var/www/html/mydomain1.com/
sudo chown -R apache:apache /var/www/html/mydomain2.com/

Step 3: Create Test Pages

Create simple index files to verify your virtual hosts are working correctly:

echo "<html><head><title>Welcome to mydomain1.com</title></head><body><h1>Success! mydomain1.com virtual host is working!</h1></body></html>" | sudo tee /var/www/html/mydomain1.com/index.html
echo "<html><head><title>Welcome to mydomain2.com</title></head><body><h1>Success! mydomain2.com virtual host is working!</h1></body></html>" | sudo tee /var/www/html/mydomain2.com/index.html

Step 4: Configure Virtual Hosts

You have two options for configuring virtual hosts on Fedora 42:

1. Add configuration directly to /etc/httpd/conf/httpd.conf
2. Create separate configuration files in /etc/httpd/conf.d/ directory (recommended)

Let’s use the recommended approach by creating dedicated configuration files:

sudo nano /etc/httpd/conf.d/mydomain1.com.conf

Add the following configuration:

<VirtualHost *:80>
    ServerName www.mydomain1.com
    ServerAlias mydomain1.com
    DocumentRoot /var/www/html/mydomain1.com
    ErrorLog /var/log/httpd/mydomain1.com-error.log
    CustomLog /var/log/httpd/mydomain1.com-access.log combined
    
    <Directory "/var/www/html/mydomain1.com">
        Require all granted
        AllowOverride All
        Options FollowSymLinks
    </Directory>
</VirtualHost>

Now create a similar configuration for the second domain:

sudo nano /etc/httpd/conf.d/mydomain2.com.conf

With content:

<VirtualHost *:80>
    ServerName www.mydomain2.com
    ServerAlias mydomain2.com
    DocumentRoot /var/www/html/mydomain2.com
    ErrorLog /var/log/httpd/mydomain2.com-error.log
    CustomLog /var/log/httpd/mydomain2.com-access.log combined
    
    <Directory "/var/www/html/mydomain2.com">
        Require all granted
        AllowOverride All
        Options FollowSymLinks
    </Directory>
</VirtualHost>

Step 5: Configure Local Domain Resolution (For Testing)

If you’re setting this up in a test environment without actual domain names pointing to your server, add the domains to your /etc/hosts file:

sudo echo "127.0.0.1 www.mydomain1.com mydomain1.com" >> /etc/hosts
sudo echo "127.0.0.1 www.mydomain2.com mydomain2.com" >> /etc/hosts

For a production environment, ensure your domains’ DNS records point to your server’s IP address.

Step 6: Verify Configuration and Restart Apache

Check your configuration for syntax errors:

sudo httpd -t

If everything is correct, restart Apache to apply the changes:

sudo systemctl restart httpd

You should now be able to access your virtual hosts by navigating to your domains in a web browser.

Configuring IP-Based Virtual Hosts

While less common than name-based virtual hosting, IP-based virtual hosting remains useful in specific scenarios. To configure IP-based virtual hosts, you’ll need multiple IP addresses assigned to your server.

Step 1: Assign Multiple IP Addresses

First, assign additional IP addresses to your network interface. This can be done temporarily with the following command:

sudo ip addr add 192.168.2.106/24 dev ens33

For a persistent configuration, modify your network configuration files in /etc/sysconfig/network-scripts/.

Step 2: Create Directory Structure

Create directories for each virtual host:

sudo mkdir -p /var/www/html/ipsite1/
sudo mkdir -p /var/www/html/ipsite2/

Step 3: Set Permissions

Set appropriate permissions:

sudo chmod -R 755 /var/www/html/
sudo chown -R apache:apache /var/www/html/ipsite1/
sudo chown -R apache:apache /var/www/html/ipsite2/

Step 4: Create Test Pages

Create test pages for each site:

echo "<html><body><h1>IP Virtual Host 1</h1></body></html>" | sudo tee /var/www/html/ipsite1/index.html
echo "<html><body><h1>IP Virtual Host 2</h1></body></html>" | sudo tee /var/www/html/ipsite2/index.html

Step 5: Configure IP-Based Virtual Hosts

Create the configuration files:

sudo nano /etc/httpd/conf.d/ipvhost1.conf

Add the following:

<VirtualHost 192.168.2.105:80>
    DocumentRoot /var/www/html/ipsite1
    ServerName ipsite1.example.com
    ErrorLog /var/log/httpd/ipsite1-error.log
    CustomLog /var/log/httpd/ipsite1-access.log combined
    
    <Directory "/var/www/html/ipsite1">
        Require all granted
    </Directory>
</VirtualHost>

Create the second IP-based virtual host:

sudo nano /etc/httpd/conf.d/ipvhost2.conf

With content:

<VirtualHost 192.168.2.106:80>
    DocumentRoot /var/www/html/ipsite2
    ServerName ipsite2.example.com
    ErrorLog /var/log/httpd/ipsite2-error.log
    CustomLog /var/log/httpd/ipsite2-access.log combined
    
    <Directory "/var/www/html/ipsite2">
        Require all granted
    </Directory>
</VirtualHost>

Step 6: Verify and Restart Apache

Check configuration syntax and restart Apache:

sudo httpd -t
sudo systemctl restart httpd

Now you can access your IP-based virtual hosts by navigating directly to their IP addresses.

Advanced Virtual Host Configuration Options

Beyond basic virtual host setup, Apache offers numerous advanced configuration options to enhance security, performance, and functionality.

Custom Logging Configuration

Customize logging for each virtual host to simplify troubleshooting:

<VirtualHost *:80>
    ServerName example.com
    # Other directives...
    
    # Custom log formats
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    LogFormat "%h %l %u %t \"%r\" %>s %b" common
    
    # Separate error and access logs
    ErrorLog /var/log/httpd/example.com-error.log
    CustomLog /var/log/httpd/example.com-access.log combined
    
    # Enable debug-level logging (temporarily for troubleshooting)
    LogLevel debug
</VirtualHost>

Directory-Specific Access Controls

Control access to specific directories within your virtual host:

<VirtualHost *:80>
    ServerName example.com
    # Other directives...
    
    <Directory "/var/www/html/example.com/admin">
        # Restrict access to specific IP addresses
        Require ip 192.168.1.0/24
        
        # Or restrict by authentication
        AuthType Basic
        AuthName "Restricted Area"
        AuthUserFile /etc/httpd/htpasswd
        Require valid-user
    </Directory>
</VirtualHost>

Custom Error Pages

Configure custom error pages for a more professional appearance:

<VirtualHost *:80>
    ServerName example.com
    # Other directives...
    
    ErrorDocument 404 /custom_404.html
    ErrorDocument 500 /custom_500.html
    ErrorDocument 403 /custom_403.html
</VirtualHost>

Create the custom error pages in your DocumentRoot directory.

Practical Implementation: Creating Multiple Websites

Let’s walk through a complete practical example of setting up two distinct websites on a single Fedora 42 server. We’ll create a personal blog and a business website.

Step 1: Create Directory Structure

sudo mkdir -p /var/www/html/blog.example.com/public_html
sudo mkdir -p /var/www/html/business.example.com/public_html

Step 2: Set Permissions

sudo chmod -R 755 /var/www/html/
sudo chown -R apache:apache /var/www/html/blog.example.com/
sudo chown -R apache:apache /var/www/html/business.example.com/

Step 3: Create Website Content

For the blog:

cat > /var/www/html/blog.example.com/public_html/index.html << EOF
<!DOCTYPE html>
<html>
<head>
    <title>My Personal Blog</title>
    <meta name="description" content="Thoughts and ideas from my journey">
    <style>
        body { font-family: Arial, sans-serif; margin: 40px; line-height: 1.6; }
        header { border-bottom: 1px solid #eee; padding-bottom: 20px; margin-bottom: 20px; }
        h1 { color: #333; }
    </style>
</head>
<body>
    <header>
        <h1>Welcome to My Personal Blog</h1>
    </header>
    <main>
        <article>
            <h2>Latest Post: Getting Started with Apache</h2>
            <p>Today I'll be sharing my experience setting up Apache virtual hosts...</p>
        </article>
    </main>
    <footer>
        <p>© 2025 My Personal Blog</p>
    </footer>
</body>
</html>
EOF

For the business site:

cat > /var/www/html/business.example.com/public_html/index.html << EOF
<!DOCTYPE html>
<html>
<head>
    <title>Example Business Solutions</title>
    <meta name="description" content="Professional business services">
    <style>
        body { font-family: 'Segoe UI', Tahoma, sans-serif; margin: 0; padding: 0; }
        header { background-color: #2c3e50; color: white; padding: 20px; text-align: center; }
        .container { width: 80%; margin: 0 auto; padding: 30px 0; }
        h1 { margin: 0; }
    </style>
</head>
<body>
    <header>
        <h1>Example Business Solutions</h1>
    </header>
    <div class="container">
        <h2>Professional Services for Your Business</h2>
        <p>We provide cutting-edge solutions for businesses of all sizes...</p>
    </div>
    <footer style="background-color: #eee; text-align: center; padding: 20px;">
        <p>© 2025 Example Business Solutions</p>
    </footer>
</body>
</html>
EOF

Step 4: Create Virtual Host Configurations

sudo nano /etc/httpd/conf.d/blog.example.com.conf

Add:

<VirtualHost *:80>
    ServerName blog.example.com
    ServerAlias www.blog.example.com
    DocumentRoot /var/www/html/blog.example.com/public_html
    ErrorLog /var/log/httpd/blog.example.com-error.log
    CustomLog /var/log/httpd/blog.example.com-access.log combined
    
    <Directory "/var/www/html/blog.example.com/public_html">
        Require all granted
        AllowOverride All
        Options FollowSymLinks
    </Directory>
</VirtualHost>
sudo nano /etc/httpd/conf.d/business.example.com.conf

Add:

<VirtualHost *:80>
    ServerName business.example.com
    ServerAlias www.business.example.com
    DocumentRoot /var/www/html/business.example.com/public_html
    ErrorLog /var/log/httpd/business.example.com-error.log
    CustomLog /var/log/httpd/business.example.com-access.log combined
    
    <Directory "/var/www/html/business.example.com/public_html">
        Require all granted
        AllowOverride All
        Options FollowSymLinks
    </Directory>
</VirtualHost>

Step 5: Update Hosts File (For Testing)

sudo echo "127.0.0.1 blog.example.com www.blog.example.com" >> /etc/hosts
sudo echo "127.0.0.1 business.example.com www.business.example.com" >> /etc/hosts

Step 6: Restart Apache

sudo httpd -t
sudo systemctl restart httpd

SSL/TLS Configuration for Secure Virtual Hosts

Securing your virtual hosts with SSL/TLS is crucial for protecting user data and improving search engine rankings. Let’s configure HTTPS for one of our virtual hosts.

Step 1: Install the mod_ssl Module

sudo dnf install mod_ssl -y

Step 2: Generate Self-Signed Certificate (For Testing)

For production, you should use certificates from a trusted provider like Let’s Encrypt. For testing, create a self-signed certificate:

sudo mkdir -p /etc/pki/tls/certs/blog.example.com
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/pki/tls/private/blog.example.com.key -out /etc/pki/tls/certs/blog.example.com.crt

Step 3: Configure SSL Virtual Host

sudo nano /etc/httpd/conf.d/blog.example.com-ssl.conf

Add:

<VirtualHost *:443>
    ServerName blog.example.com
    ServerAlias www.blog.example.com
    DocumentRoot /var/www/html/blog.example.com/public_html
    
    ErrorLog /var/log/httpd/blog.example.com-ssl-error.log
    CustomLog /var/log/httpd/blog.example.com-ssl-access.log combined
    
    SSLEngine on
    SSLCertificateFile /etc/pki/tls/certs/blog.example.com.crt
    SSLCertificateKeyFile /etc/pki/tls/private/blog.example.com.key
    
    <Directory "/var/www/html/blog.example.com/public_html">
        Require all granted
        AllowOverride All
        Options FollowSymLinks
    </Directory>
</VirtualHost>

Step 4: Configure HTTP to HTTPS Redirection

Modify the non-SSL virtual host to redirect to HTTPS:

sudo nano /etc/httpd/conf.d/blog.example.com.conf

Update it to:

<VirtualHost *:80>
    ServerName blog.example.com
    ServerAlias www.blog.example.com
    
    Redirect permanent / https://blog.example.com/
</VirtualHost>

Step 5: Restart Apache

sudo httpd -t
sudo systemctl restart httpd

Now, all HTTP traffic to blog.example.com will be securely redirected to HTTPS.

Troubleshooting Common Virtual Host Issues

Virtual host configurations can sometimes be tricky. Here are solutions to common problems:

1. Default Site Always Loads Instead of Virtual Host

If the default Apache page shows instead of your virtual host:

  • Check that the ServerName matches the host you’re trying to access
  • Verify the DNS or hosts file entry is correct
  • Check for syntax errors in your virtual host configuration
  • Make sure Apache is listening on the correct ports

Solution:

# Check hostname resolution
ping example.com

# Check Apache configuration
sudo httpd -t

# Check active virtual hosts
sudo httpd -S

2. Permission Denied Errors

If you see “403 Forbidden” errors:

  • Check directory permissions
  • Verify SELinux contexts if SELinux is enabled

Solution:

# Set proper permissions
sudo chmod -R 755 /var/www/html/example.com/

# Set proper SELinux contexts
sudo restorecon -Rv /var/www/html/example.com/

# Or temporarily disable SELinux for testing
sudo setenforce 0

3. SSL/TLS Certificate Issues

For certificate-related problems:

  • Verify certificate paths
  • Check certificate validity
  • Ensure proper ownership and permissions

Solution:

# Check certificate validity
sudo openssl x509 -in /etc/pki/tls/certs/example.com.crt -text -noout

# Check log files for specific errors
sudo tail -f /var/log/httpd/ssl_error_log

4. Name Resolution Issues

If you can’t reach your virtual host by name:

  • Verify DNS configuration
  • Check local hosts file entries
  • Ensure firewall rules allow traffic

Solution:

# Test DNS resolution
dig example.com

# Check firewall status
sudo firewall-cmd --list-all

# Allow HTTP/HTTPS through firewall
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload

Best Practices for Apache Virtual Hosts

Implement these best practices to maintain a secure and efficient Apache server:

  1. Separate Logs for Each Virtual Host: Configure separate error and access logs for each virtual host to simplify troubleshooting.
  2. Use Version Control for Configuration: Keep your Apache configurations in a version control system like Git to track changes.
  3. Implement Strong Security Headers:
    <VirtualHost *:443>
        # Other directives...
        Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
        Header always set X-Content-Type-Options "nosniff"
        Header always set X-Frame-Options "SAMEORIGIN"
        Header always set X-XSS-Protection "1; mode=block"
    </VirtualHost>
  4. Disable Directory Listings: Prevent directory contents from being displayed when no index file exists:
    <Directory "/var/www/html">
        Options -Indexes
    </Directory>
  5. Regular Backup Strategy: Implement regular backups of your configuration files and website content.
  6. Monitor Log Files: Regularly review log files to identify and address potential issues early.

Congratulations! You have successfully installed VirtualHost Apache. Thanks for using this tutorial to configure virtual hosts Apache web server on Fedora 42 Linux system. For additional help or useful information, we recommend you check the official Apache website.

VPS Manage Service Offer
If you don’t have time to do all of this stuff, or if this is not your area of expertise, we offer a service to do “VPS Manage Service Offer”, starting from $10 (Paypal payment). Please contact us to get the best deal!

r00t

r00t is an experienced Linux enthusiast and technical writer with a passion for open-source software. With years of hands-on experience in various Linux distributions, r00t has developed a deep understanding of the Linux ecosystem and its powerful tools. He holds certifications in SCE and has contributed to several open-source projects. r00t is dedicated to sharing her knowledge and expertise through well-researched and informative articles, helping others navigate the world of Linux with confidence.
Back to top button