Understanding the .d Directory Suffix in Linux: Configuration Best Practices for Apache, Cron and System Services


2 views

In Linux systems, directories ending with .d (short for "directory") follow a special convention for configuration management. These directories serve as:

  • Drop-in locations for modular configuration files
  • Standardized way to split configuration into manageable parts
  • Package-maintainer friendly structure

The standard Apache layout demonstrates this perfectly:

/etc/httpd/conf/httpd.conf    # Main configuration
/etc/httpd/conf.d/           # Additional configs
/etc/httpd/conf.modules.d/   # Module-specific configs

The httpd.conf typically includes directives like:

# In httpd.conf
IncludeOptional conf.d/*.conf
IncludeOptional conf.modules.d/*.conf

Other common .d directories include:

/etc/cron.d/          # System cron jobs
/etc/security/limits.d/ # User limits
/etc/sysctl.d/         # Kernel parameters
/etc/apt/sources.list.d/ # APT repositories

Several technical advantages emerge from this pattern:

  1. Package Safety - Packages can add configs without modifying main files
  2. Atomic Changes - Individual files can be safely added/removed
  3. Version Control - Easier to track changes to discrete files

For your own applications, implement similar behavior:

#!/bin/bash
# Example init script snippet
for f in /etc/myapp/conf.d/*.conf; do
    [ -f "$f" ] || continue
    source "$f"
done

Or in Python:

import glob
import configparser

config = configparser.ConfigParser()
for conf_file in glob.glob('/etc/myapp/conf.d/*.conf'):
    config.read(conf_file)
  • Use alphabetical sorting for predictable load order
  • Document file naming conventions (e.g. prefix numbers for ordering)
  • Include sanity checking in your config parser
  • Consider file permissions (usually root:root 644)

In Linux systems, the .d suffix denotes a directory containing modular configuration files. This convention allows for:

  • Clean separation of configuration components
  • Easier package management
  • Dynamic configuration loading

The key difference between /etc/httpd/conf and /etc/httpd/conf.d:

# Main configuration (monolithic approach)
/etc/httpd/conf/httpd.conf
# Example content:
ServerRoot "/etc/httpd"
Listen 80

# Modular configuration (recommended)
/etc/httpd/conf.d/ssl.conf
/etc/httpd/conf.d/vhosts.conf
# Example ssl.conf content:
<VirtualHost *:443>
    SSLEngine on
    SSLCertificateFile /etc/pki/tls/certs/server.crt
</VirtualHost>
Directory Purpose
/etc/init.d System V init scripts
/etc/cron.d System-wide cron jobs
/etc/apt/sources.list.d Additional APT repositories
/etc/systemd/systemd.conf.d Systemd overrides

When creating custom configuration files:

  1. Use descriptive filenames: myapp.conf rather than config1.conf
  2. Include proper file extensions: .conf for Apache, .list for APT
  3. Set correct permissions: typically 644 (-rw-r--r--)

Example cron job creation:

# /etc/cron.d/backup-job
# Run daily backups at 2:30 AM
30 2 * * * root /usr/local/bin/backup-script.sh

Most services include this pattern in their default configuration:

# Typical Apache include directive
IncludeOptional conf.d/*.conf

# Systemd example
[Unit]
Include=/etc/systemd/system.conf.d/*.conf