CRITICAL

Solved: Apache AH00111 Config Variable Overflow in httpd 2.4.60+

Quick Fix Summary

TL;DR

Increase the `AP_MAX_STRING_LEN` limit in your Apache source code and recompile, or reduce environment variable size.

Apache 2.4.60+ enforces a strict 8192-byte limit on the total size of environment variables passed to CGI/SSI. Exceeding this limit during startup triggers the AH00111 error, preventing the server from launching.

Diagnosis & Causes

  • Large `SetEnv` or `PassEnv` directives in httpd.conf.
  • Excessive or oversized environment variables from systemd/init.
  • Complex mod_rewrite rules generating long query strings.
  • Third-party modules injecting large data into the environment.
  • Upgrading to httpd 2.4.60+ from an older, more permissive version.
  • Recovery Steps

    1

    Step 1: Immediate Diagnostic - Identify the Offending Variables

    Before making changes, audit your configuration to find which variables are consuming space. Use this script to sum the lengths.

    bash
    #!/bin/bash
    # Run from shell to check total env size pre-Apache
    env | awk '{ sum += length($0) + 1 } END { print "Total bytes:", sum, "\nLimit is 8192." }'
    # Check Apache's parsed config for SetEnv/PassEnv
    grep -r "SetEnv\|PassEnv" /etc/apache2/ /usr/local/apache2/conf/ 2>/dev/null
    2

    Step 2: Quick Production Mitigation - Reduce Variable Size

    The fastest fix is to reduce the environment's footprint. Comment out or shorten non-essential `SetEnv` directives, especially large API keys or configuration blobs.

    bash
    # Edit your main Apache config (e.g., httpd.conf, apache2.conf)
    sudo nano /usr/local/apache2/conf/httpd.conf
    # Locate lines like:
    # SetEnv MY_LARGE_VAR "very_long_string..."
    # Prefix with a hash to comment them out:
    # SetEnv MY_LARGE_VAR "very_long_string..."
    # After saving, test the configuration:
    sudo apachectl -t
    # If OK, restart Apache:
    sudo systemctl restart apache2 || sudo apachectl -k graceful
    3

    Step 3: Permanent Solution A - Recompile Apache with a Higher Limit

    For environments that legitimately need large environment data, increase the `AP_MAX_STRING_LEN` constant in the Apache source code and recompile. This is the definitive fix.

    bash
    # 1. Download and extract the httpd source matching your version
    cd /usr/src
    wget https://downloads.apache.org/httpd/httpd-2.4.60.tar.gz
    tar xzvf httpd-2.4.60.tar.gz
    cd httpd-2.4.60
    # 2. Edit the source file containing the limit
    nano include/ap_config.h
    # 3. Find the line (around line 50-60):
    # define AP_MAX_STRING_LEN 8192
    # 4. Increase it, e.g., to 32768:
    # define AP_MAX_STRING_LEN 32768
    # 5. Reconfigure, compile, and install (adjust prefix for your setup)
    ./configure --prefix=/usr/local/apache2 --enable-modules=most
    make
    sudo make install
    4

    Step 4: Permanent Solution B - Offload Data to Alternative Storage

    Best practice for scalability: move large configuration data out of environment variables. Use external config files, a key-value store, or Apache's `Define` directive for internal values.

    bash
    # Instead of: SetEnv APP_CONFIG "{...massive JSON...}"
    # 1. Write config to a file
    echo '{...massive JSON...}' > /etc/myapp/config.json
    chmod 640 /etc/myapp/config.json
    # 2. In your CGI/SSI script, read the file
    # PHP example:
    $config = json_decode(file_get_contents('/etc/myapp/config.json'), true);
    # Python example:
    import json
    with open('/etc/myapp/config.json') as f:
        config = json.load(f)
    5

    Step 5: Validate and Monitor the Fix

    After applying the fix, verify Apache starts and monitor logs to ensure stability. Implement a check to prevent regression.

    bash
    # Test configuration syntax
    sudo apachectl configtest
    # Start Apache and check status
    sudo systemctl start apache2
    sudo systemctl status apache2 --no-pager -l
    # Tail the error log to confirm AH00111 is gone
    sudo tail -f /usr/local/apache2/logs/error_log
    # Add a pre-start validation script for systemd (optional)
    # /usr/local/bin/check-apache-env.sh:
    #!/bin/bash
    if env | awk '{ sum += length($0)+1 } END { exit sum > 8000 }'; then
      echo "Environment size OK."
    else
      echo "WARNING: Environment size near limit." >&2
    fi

    Architect's Pro Tip

    "The limit counts the *total* size of all variables, including the '=' sign and null terminators. Use `env | wc -c` for a quick byte count; it's very close to Apache's internal calculation."

    Frequently Asked Questions

    Did this limit exist before Apache 2.4.60?

    Yes, but it was a soft, unenforced guideline. Version 2.4.60 made it a hard limit, causing immediate startup failure (AH00111) when exceeded to improve security and stability.

    Can I fix this just by changing a setting in httpd.conf?

    No. There is no runtime configuration directive to adjust this limit. You must either reduce the environment size or recompile Apache from source with a modified `AP_MAX_STRING_LEN`.

    Does this affect PHP-FPM or other proxy backends?

    Primarily, it affects CGI (mod_cgi) and SSI (mod_include). Requests proxied to PHP-FPM or other backends via mod_proxy typically do not pass the entire Apache environment, so they are less likely to trigger this.

    Related Apache Guides