Skip to content

Configuring Wildcard Domains in Apache2: A Step-by-Step Guide

Wildcard domains allow Apache2 to handle requests for all subdomains of a specific domain. This setup is particularly useful for dynamic applications, multi-tenant environments, or any case where you want a single configuration to cover multiple subdomains. Here's a comprehensive guide to configuring wildcard domains in Apache2, including considerations for multi-tenant applications with wildcard and top-level domains.


1. Edit the Apache Configuration File

The first step is to locate and edit the Apache configuration file associated with your site. Depending on your Linux distribution, the file path might vary:

  • Ubuntu/Debian: /etc/apache2/sites-available/000-default.conf
  • CentOS/RHEL: /etc/httpd/conf.d/vhost.conf

Open the file using your preferred text editor, such as nano or vim:

bash
sudo nano /etc/apache2/sites-available/000-default.conf

2. Add a Wildcard ServerAlias

Within the configuration file, add the ServerAlias directive to specify the wildcard domain. This tells Apache to handle requests for any subdomain of the specified domain. Below is an example configuration:

apache
<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html
    ServerName example.com
    ServerAlias *.example.com

    # Other configurations...
</VirtualHost>
  • ServerName example.com: Specifies the primary domain.
  • ServerAlias *.example.com: Matches all subdomains (e.g., sub.example.com, app.example.com).

For multi-tenant applications, this configuration allows dynamic handling of subdomains, ideal for serving tenant-specific content or applications. Each subdomain can map to a unique tenant in your backend logic.


3. Enable the Site Configuration

After editing the configuration file, enable the site (if not already enabled) to ensure Apache recognizes the changes. On Ubuntu/Debian systems, use:

bash
sudo a2ensite 000-default.conf

For CentOS/RHEL, the configuration is typically enabled by default if placed in the correct directory.


4. Configure DNS for the Wildcard Domain

Ensure your DNS is set up to route all subdomains to your Apache server. You can achieve this by adding a wildcard DNS record:

  • Type: A (or CNAME for aliasing)
  • Name: *.example.com
  • Value: Your server's IP address

This ensures all subdomains, even those not explicitly defined, resolve to your server.


5. Restart Apache

Restart the Apache service to apply your changes:

bash
sudo systemctl restart apache2

Or, on older systems:

bash
sudo service apache2 restart

Additional Considerations

Handling SSL/TLS for Wildcard and Top-Level Domains

If you're serving content over HTTPS, you'll need SSL certificates for both wildcard and top-level domains. Services like Let’s Encrypt provide free wildcard SSL certificates via the DNS challenge. Here's a detailed guide to using certbot:

  1. Install Certbot: Ensure you have certbot installed on your server. On Ubuntu, you can install it with:

    bash
    sudo apt install certbot
  2. Generate Certificates for Wildcard and Top-Level Domains: Use the following command to request a wildcard SSL certificate for subdomains and a certificate for the top-level domain:

    bash
    sudo certbot -d "*.example.com" -d example.com --manual --preferred-challenges dns certonly

    During this process, Certbot will provide TXT records that you need to add to your DNS settings. Once the records are verified, the certificates will be issued.

  3. Configure Apache for SSL: Update your Apache configuration to use the wildcard and top-level domain certificates:

    apache
    <VirtualHost *:443>
        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html
        ServerName example.com
        ServerAlias *.example.com
    
        SSLEngine on
        SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
        SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
    
        # Other configurations...
    </VirtualHost>
  4. Set Up Automatic Renewals: Let’s Encrypt certificates are valid for 90 days. To automate renewals, add the following cron job:

    bash
    sudo crontab -e

    Add this line to run the renewal process daily:

    0 3 * * * certbot renew --quiet

    This ensures your certificates are automatically renewed and reloaded without manual intervention.

  5. Test Renewal: Manually test the renewal process to confirm it works correctly:

    bash
    sudo certbot renew --dry-run

    If there are no errors, your certificates will renew automatically.


Handling of Subdomains and Top-Level Domains

For a multi-tenant application, you may want to support both wildcard subdomains and top-level domains. Here’s how you can configure Apache:

  1. Wildcard Domains: Use a single VirtualHost with a wildcard ServerAlias for subdomains:

    apache
    <VirtualHost *:80>
        ServerName example.com
        ServerAlias *.example.com
    
        ProxyPreserveHost On
        ProxyPass / http://127.0.0.1:3000/
        ProxyPassReverse / http://127.0.0.1:3000/
    </VirtualHost>

    Requests to sub1.example.com or sub2.example.com will be proxied to your backend application, which can dynamically handle tenant-specific logic.

  2. Top-Level Domains: Define separate VirtualHost entries for each top-level domain, or use a generic configuration if the backend application can identify tenants by domain:

    apache
    <VirtualHost *:80>
        ServerName tenant1.com
        ProxyPreserveHost On
        ProxyPass / http://127.0.0.1:3000/
        ProxyPassReverse / http://127.0.0.1:3000/
    </VirtualHost>
    
    <VirtualHost *:80>
        ServerName tenant2.com
        ProxyPreserveHost On
        ProxyPass / http://127.0.0.1:3000/
        ProxyPassReverse / http://127.0.0.1:3000/
    </VirtualHost>

    These configurations ensure requests for both wildcard subdomains and specific top-level domains are routed to the backend application for tenant-specific handling.


Troubleshooting Tips

  • Configuration Syntax: Test your Apache configuration for syntax errors:

    bash
    sudo apachectl -t
  • Permissions: Ensure the DocumentRoot directory has the correct permissions:

    bash
    sudo chown -R www-data:www-data /var/www/html
    sudo chmod -R 755 /var/www/html
  • DNS Propagation: Changes to DNS records can take time to propagate. Use tools like dig or nslookup to verify:

    bash
    dig *.example.com

Example: Multiple Document Roots for Subdomains

If you want different subdomains to serve content from different directories, define separate VirtualHost entries:

apache
<VirtualHost *:80>
    ServerName example.com
    DocumentRoot /var/www/example
    ServerAlias *.example.com
</VirtualHost>

<VirtualHost *:80>
    ServerName sub.example.com
    DocumentRoot /var/www/subdomain
</VirtualHost>

This configuration serves requests to sub.example.com from /var/www/subdomain and all other subdomains from /var/www/example.


Configuring wildcard domains and top-level domains in Apache2 is essential for building scalable multi-tenant applications. By leveraging the flexibility of Apache’s ServerAlias directive, proper DNS setup, and SSL configurations, you can create a robust hosting environment. This guide equips you with the tools to manage both dynamic subdomains and unique top-level domains effectively for your application.