Apache2 Configuration: Key Differences Between sites-enabled vs conf-enabled Directories


20 views

In Apache2's configuration system, both sites-enabled and conf-enabled serve distinct purposes for modular configuration:

# Typical Apache2 directory structure
/etc/apache2/
├── sites-available/
├── sites-enabled/
├── conf-available/
└── conf-enabled/

sites-enabled/ contains symbolic links to virtual host configurations in sites-available/. These define complete website configurations including:

  • Document roots
  • Server names
  • Port bindings
  • SSL configurations
# Example virtual host in sites-available/example.com.conf
<VirtualHost *:80>
    ServerName example.com
    DocumentRoot /var/www/example
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

conf-enabled/ contains links to general server configuration snippets from conf-available/ that affect the entire server:

  • Module configurations
  • Global security settings
  • Performance tuning
  • MIME type additions
# Example configuration in conf-available/security.conf
ServerTokens Prod
ServerSignature Off
FileETag None

Use sites-enabled when:

  • Configuring complete websites/virtual hosts
  • Needing to bind specific configurations to domains/ports

Use conf-enabled when:

  • Applying server-wide configuration changes
  • Enabling module-specific settings
  • Implementing global security policies

Both directories are processed during Apache startup, but with different inclusion patterns:

# In apache2.conf (Debian/Ubuntu):
IncludeOptional sites-enabled/*.conf
IncludeOptional conf-enabled/*.conf

The loading order is:

  1. core modules
  2. conf-enabled/*.conf
  3. mods-enabled/*.load/.conf
  4. sites-enabled/*.conf

1. Always maintain configurations in *-available directories and symlink to *-enabled:

a2ensite example.com.conf
a2enmod rewrite

2. For complex setups, consider this pattern:

sites-available/domain.tld.conf  # Main Vhost
conf-available/domain-security.conf  # Security rules
conf-available/domain-rewrites.conf  # URL rewrites

In Apache's configuration system, both *-enabled and *-available directories serve distinct purposes:


/etc/apache2/
├── sites-available/
├── sites-enabled/
├── conf-available/
└── conf-enabled/

sites-* directories are specifically designed for virtual host configurations. Each file typically contains a complete <VirtualHost> block:


<VirtualHost *:80>
    ServerName example.com
    DocumentRoot /var/www/html
    <Directory /var/www/html>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>

conf-* directories contain general configuration snippets that apply server-wide:


# Example security.conf snippet
<Directory />
    Options FollowSymLinks
    AllowOverride None
    Require all denied
</Directory>

Use sites-available/enabled when:

  • Configuring virtual hosts
  • Setting up domain-specific configurations
  • Managing SSL certificates per site

Use conf-available/enabled when:

  • Implementing global settings (security, logging)
  • Loading modules or setting environment variables
  • Applying configurations affecting all virtual hosts

Both use symlinks, but with different commands:


# For sites
sudo a2ensite example.conf
sudo a2dissite example.conf

# For conf files  
sudo a2enconf security.conf
sudo a2disconf security.conf

The files load in this sequence:

  1. conf-enabled/ (alphabetical order)
  2. sites-enabled/ (alphabetical order)

This means conf settings can be overridden by site-specific configurations.

Here's how you might structure a real deployment:


# In conf-available/security.conf:
<IfModule mod_headers.c>
    Header always set X-Content-Type-Options nosniff
</IfModule>

# In sites-available/example.com.conf:
<VirtualHost *:443>
    Header always set Strict-Transport-Security "max-age=63072000"
    # Other site-specific configs...
</VirtualHost>