The Apache HTTP Server Control Interface Program –
apachectl – is a shell script that acts as a front end to the Apache Web Server that can be used to perform administrative tasks for the
httpd daemon. It can be used as a pass-through to the
httpd binary relaying any options passed to it with/without modifications. So effectively whatever options you pass to
apachectl can also be passed to the
apache2 in some operation systems) program/binary on the command line with or without minor changes.
So let’s see what are the different useful and interesting things we can do with various cli options.
Note: Most popular Unix-like or Unix-based platforms like Mac OS, FreeBSD and Linux distributions like Ubuntu, Debian, CentOS, Fedora, etc. ship
apachectl with their standard Apache installations. But if
apachectl is not available or ain’t working as expected for you, don’t worry as I’ll also specify the
Find Config Location
-V option can help us locate the main server config file alongside giving other information like the server version, architecture, current mpm in use, magic number, configuration directives
httpd was compiled with, etc.
# apachectl -V # or httpd -V Server version: Apache/2.4.29 (Ubuntu) Server built: 2020-03-13T12:26:16 Server's Module Magic Number: 20120211:68 Server loaded: APR 1.6.3, APR-UTIL 1.6.1 Compiled using: APR 1.6.3, APR-UTIL 1.6.1 Architecture: 64-bit Server MPM: prefork threaded: no forked: yes (variable process count) Server compiled with.... -D APR_HAS_SENDFILE -D APR_HAS_MMAP -D APR_HAVE_IPV6 (IPv4-mapped addresses enabled) -D APR_USE_SYSVSEM_SERIALIZE -D APR_USE_PTHREAD_SERIALIZE -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT -D APR_HAS_OTHER_CHILD -D AP_HAVE_RELIABLE_PIPED_LOGS -D DYNAMIC_MODULE_LIMIT=256 -D HTTPD_ROOT="/etc/apache2" -D SUEXEC_BIN="/usr/lib/apache2/suexec" -D DEFAULT_PIDLOG="/var/run/apache2.pid" -D DEFAULT_SCOREBOARD="logs/apache_runtime_status" -D DEFAULT_ERRORLOG="logs/error_log" -D AP_TYPES_CONFIG_FILE="mime.types" -D SERVER_CONFIG_FILE="apache2.conf"
Syntax Check Config
-t options can help us run syntax parsing tests on all the configuration files to ensure there’s no error and a
restart of the server won’t fail.
# apachectl configtest Syntax OK # apachectl -t # or httpd -t Syntax OK
List All Config Files
The primary config file that is picked up by
apache2.conf located at, well, read the
Find Config Location section above. Now in a lot of cases the configuration will be split across multiple files for obvious reasons – better organisation. If one wants to find out all the config files included in the main config file, then the
-D DUMP_MODULES is just meant to do that.
# apachectl -D DUMP_INCLUDES # or httpd -D DUMP_INCLUDES Included configuration files: (*) /usr/local/etc/apache24/httpd.conf (536) /usr/local/etc/apache24/Includes/no-accf.conf
Find Server Root
-D DUMP_RUN_CFG and
-V options can help locate the server root where the server is supposed to “live”, i.e., contain configurations at least, logs, etc.
# apachectl -D DUMP_RUN_CFG # or httpd -D DUMP_RUN_CFG ServerRoot: "/etc/apache2" Main DocumentRoot: "/var/www/html" Main ErrorLog: "/var/log/apache2/error.log" Mutex default: dir="/var/run/apache2/" mechanism=default Mutex mpm-accept: using_defaults Mutex watchdog-callback: using_defaults Mutex rewrite-map: using_defaults PidFile: "/var/run/apache2/apache2.pid" Define: DUMP_RUN_CFG User: name="www-data" id=33 Group: name="www-data" id=33 # apachectl -V # or httpd -V ... -D HTTPD_ROOT="/etc/apache2" ...
You need to eye for
ServerRoot in the first output and
HTTPD_ROOT in the next one. The latter is compiled into
httpd where as the former overrides it once the main configuration file is read during the server startup.
DUMP_RUN_CFG gives a lot of other details like the system user/group
httpd will be running as, location of the pid file, various mutex and their mechanisms in use, main server’s
List All Static and Shared Modules
A lot of the Apache Web Server feature set is usually powered by plug-and-play modules (or shared objects). Static modules that
httpd was compiled with can be listed via the
-l option where as all the dynamic/shared modules currently loaded/enabled (along with the static ones again) can be fetched via the
-D DUMP_MODULES option.
# apachectl -l # or httpd -l Compiled in modules: core.c mod_so.c http_core.c # apachectl -D DUMP_MODULES # or httpd -D DUMP_MODULES Loaded Modules: core_module (static) so_module (static) http_module (static) mpm_prefork_module (shared) authn_file_module (shared) authn_core_module (shared) authz_host_module (shared) authz_groupfile_module (shared) authz_user_module (shared) authz_core_module (shared) access_compat_module (shared) auth_basic_module (shared) reqtimeout_module (shared) filter_module (shared) mime_module (shared) log_config_module (shared) env_module (shared) headers_module (shared) setenvif_module (shared) version_module (shared) unixd_module (shared) status_module (shared) autoindex_module (shared) dir_module (shared) alias_module (shared)
Dump Parsed Virtual Hosts
So you made a few changes to your virtual hosts configuration and want to debug/check it ?
-D DUMP_VHOSTS can help here.
# apachectl -D DUMP_VHOSTS # or httpd -D DUMP_VHOSTS VirtualHost configuration: *:80 is a NameVirtualHost default server catchall (/etc/apache2/sites-enabled/000-catchall.conf:1) port 80 namevhost catchall (/etc/apache2/sites-enabled/000-catchall.conf:1) port 80 namevhost codingshower.com (/etc/apache2/sites-enabled/codingshower.conf:1)
The same can be achieved with
apachectl -S or
httpd -S which is a synonym for
-D DUMP_VHOSTS -D DUMP_RUN_CFG.
We can pass-through signals for
restart for instance.
# apachectl start # httpd -k start # apachectl restart # httpd -k restart # apachectl stop # httpd -k stop
Of course there’s the
-h option for help that lists literally everything that you can do with the
apachectl program. As you might have already guessed, a lot of
apachectl -h will be similar to what you’d see for