mod_ssl.so not loading - apache

I am trying to run Apache with SSL for my website. But when I start the Apache it throws the error saying:
httpd: Syntax error on line 127 of /usr/local/custom/apache/conf/httpd.conf:
Cannot load modules/mod_ssl.so into server: /usr/local/custom/apache/modules/mod_ssl.so:
undefined symbol: apr_global_mutex_lockfile

I also encountered the same issue.
The root cause of the issue is a version mismatch in the apr version
In order to fix it, download the following: apr-util-1.5.4.tar.gz and apr-1.5.1.tar.gz.
These can be downloaded at : https://apr.apache.org/download.cgi
Assuming that you have http src untarred in /src/httpd, you untar the apr-1.5.1 and apr-util in the opt/src/httpd/srclib
So the unzipped structure would be opt/src/httpd/srclib/apr and opt/src/httpd/srclib/apr-util
After this is done, you can run the configure with the following command
./configure --prefix=/opt/httpd-2.4.10 --with-included-apr
make
make install
This will install httpd in
/opt/httpd-2.4.10
You can check if the correct version of APR is referenced using the following command
/opt/httpd-2.4.10/bin/httpd -V
You should see output as below.
Server version: Apache/2.4.10 (Unix)
Server built: Dec 16 2014 11:46:58
Server's Module Magic Number: 20120211:36
Server loaded: APR 1.5.1, APR-UTIL 1.5.4
Compiled using: APR 1.5.1, APR-UTIL 1.5.4
Architecture: 64-bit
Server MPM: worker
threaded: yes (fixed thread count)
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="/opt/httpd-2.4.10"
-D SUEXEC_BIN="/opt/httpd-2.4.10/bin/suexec"
-D DEFAULT_PIDLOG="logs/httpd.pid"
-D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
-D DEFAULT_ERRORLOG="logs/error_log"
-D AP_TYPES_CONFIG_FILE="conf/mime.types"
-D SERVER_CONFIG_FILE="conf/httpd.conf"

Related

How to find the path of apache config file

I want to add some configuration in my Apache Web server configuration file so, anyone would help me with a command in Linux/Ubunbtu.
First find your httpd processes:
ps -ef | grep httpd
root 14124 1096 0 21:46 ? 00:00:00 /opt/apache/bin/httpd -k start
httpd 14125 14124 0 21:46 ? 00:00:00 /opt/apache/bin/httpd -k start
httpd 14126 14124 0 21:46 ? 00:00:00 /opt/apache/bin/httpd -k start
httpd 14127 14124 0 21:46 ? 00:00:00 /opt/apache/bin/httpd -k start
httpd 14240 6263 0 21:49 pts/0 00:00:00 grep --color=auto http
This will tell you:
the path to the httpd process. Here /opt/apache
Maybe the name and path of the configuration file, as an argument to the httpd process. The httpd process would then be started with the -f CONFIG-FILE argument.
In case 2., you are done!
In case 1, go to the directory the httpd process is from and run this:
cd /opt/apache/bin
./apachectl -V
Server version: Apache/2.4.37 (Unix)
Server built: Jun 21 2019 21:32:47
Server's Module Magic Number: 20120211:83
Server loaded: APR 1.6.5, APR-UTIL 1.6.1
Compiled using: APR 1.6.5, APR-UTIL 1.6.1
Architecture: 64-bit
Server MPM: worker
threaded: yes (fixed thread count)
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="/opt/apache"
-D SUEXEC_BIN="/opt/apache/bin/suexec"
-D DEFAULT_PIDLOG="logs/httpd.pid"
-D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
-D DEFAULT_ERRORLOG="logs/error_log"
-D AP_TYPES_CONFIG_FILE="conf/mime.types"
-D SERVER_CONFIG_FILE="conf/httpd.conf"
And there you have it! The last line: -D SERVER_CONFIG_FILE="conf/httpd.conf" tells you that the configuration file is httpd.conf in the conf directory. Since it is an absolute path, look at the value of HTTPD_ROOT to know where the root is for this Apache. Here it is -D HTTPD_ROOT="/opt/apache".
So the full path is: HTTPD_ROOT/SERVER_CONFIG_FILE. Here, /opt/apache/conf/httpd.conf.
Another method:
cd /opt/apache/bin
./httpd -S
Hope this helps!

Virtual Hosts on Mac directing to ServerRoot

I was mainly using XAMPP for my local development needs, but I felt it time to take the crutches off and work from the command line interface.
The issue I am running into is that my virtual hosts are directing to the ServerRoot, and not where the virtual host points. The ones I'm trying currently are laravel apps, so my file structure is
/usr/local/var/www/domain1/laravel
/usr/local/var/www/domain1/public_html
Here is my config files
# /etc/apache2/httpd.conf
ServerRoot "/usr/local/var/www"
ServerName 127.0.0.1
DocumentRoot "/usr/local/var/www"
# /etc/apache2/extra/httpd-vhosts.conf
<VirtualHost *:80>
DocumentRoot "/usr/local/var/www/mydomain.com/public_html"
ServerName dev.mydomain
ServerAlias www.dev.mydomain
ErrorLog "/private/var/log/apache2/dev.mydomain/error_log"
CustomLog "/private/var/log/apache2/dev.mydomain/access_log" common
</VirtualHost>
# /ect/hosts
127.0.0.1 localhost
127.0.0.1 dev.mydomain
::1 localhost
::1 dev.mydomain
When I go to dev.mydomain in the browser, it takes me to /usr/local/var/www instead of /usr/local/var/www/mydomain/public_html
I've already restarted the server.
Edit 1:
When I traverse the file path, the php files are not parsing either and are opening as regular text files.
Edit 2:
I commented the httpd.conf DocumentRoot line out and restarted apache, but the issue persists. When I do a apachectl -t -D DUMP_VHOSTS the Virtual Configuration comes back blank. I have Include /private/etc/apache2/extra/httpd-vhosts.conf uncommented as well as the LoadModule vhost_alias_module.
I changed
Include /private/etc/apache2/extra/httpd-vhosts.conf
to
Include /etc/apache2/extra/httpd-vhosts.conf
but they both link to the same file.
Edit 3:
Doing apachectl -S returns back a different server root than what I established. `apachectl -t -D DUMP_VHOSTS also returns back empty. I think it's possible I might be running a different version of apache than what came default on OSX. I played with it a few years ago. Is there a way to tell where the current running Apache config path is at?
Edit 4:
I checked where the httpd was running and found I have a different apache running than what is default.
MacBook-Pro:extra Daniel$ whereis httpd
/usr/sbin/httpd
Daniels-MacBook-Pro:extra Daniel$ /usr/sbin/httpd -V
Server version: Apache/2.4.29 (Unix)
Server built: Jan 17 2018 18:20:31
Server's Module Magic Number: 20120211:68
Server loaded: APR 1.5.2, APR-UTIL 1.5.4
Compiled using: APR 1.5.2, APR-UTIL 1.5.4
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_FLOCK_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="/usr"
-D SUEXEC_BIN="/usr/bin/suexec"
-D DEFAULT_PIDLOG="/private/var/run/httpd.pid"
-D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
-D DEFAULT_ERRORLOG="logs/error_log"
-D AP_TYPES_CONFIG_FILE="/private/etc/apache2/mime.types"
-D SERVER_CONFIG_FILE="/private/etc/apache2/httpd.conf"
I uncommented the vhosts lines again in the other config but now I get an error on restart saying
httpd: Syntax error on line 69 of /usr/local/etc/httpd/httpd.conf: Cannot load lib/httpd/modules/mod_mpm_prefork.so into server: dlopen(/usr/local/var/www/lib/httpd/modules/mod_mpm_prefork.so, 10): image not found
Okay, the issue was that I installed apache a few years ago with Homebrew and forgot. I was configuring the OSX apache config files. To find out which config file is being used, use:
$ whereis httpd
/usr/sbin/httpd
$ /usr/sbin/httpd -V
Server version: Apache/2.4.29 (Unix)
Server built: Jan 17 2018 18:20:31
Server's Module Magic Number: 20120211:68
Server loaded: APR 1.5.2, APR-UTIL 1.5.4
Compiled using: APR 1.5.2, APR-UTIL 1.5.4
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_FLOCK_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="/usr"
-D SUEXEC_BIN="/usr/bin/suexec"
-D DEFAULT_PIDLOG="/private/var/run/httpd.pid"
-D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
-D DEFAULT_ERRORLOG="logs/error_log"
-D AP_TYPES_CONFIG_FILE="/private/etc/apache2/mime.types"
-D SERVER_CONFIG_FILE="/private/etc/apache2/httpd.conf" <- where you config is, mine wasn't here
The reason the modules were not loading was because I changed the ServerRoot line a long time ago and didn't realize it. The default ServerRoot is /usr/local/opt/httpd, which contains the lib directory, which is where the modules are located and loaded from. Reseting the httpd.conf back to default and looking into that directory before I changed the path was what helped me catch it.

Apache 2.4 graceful restart is killing connections

I have RHEL7.2 with Apache 2.4.6 (From the RHEL repository) using the event-mpm. When I do a graceful restart using the following command, active connections are terminated.
/usr/sbin/httpd -f /path/to/httpd.conf -k graceful
Everything I have read suggests that this should not be the case. Any worker processes/threads should complete their active connections before being terminated and replaced by a new worker with the new config.
I tested this by using JMeter and by using ab on some 'large' files (~15Mb). I was seeing the problem on small 1Kb files also, but I was only able to reliably reproduce the problem on JMeter and not from ab. Using the larger file highlights the problem more reliably as there is a higher chance of the reload happening during an active connection.
For more background, I was originally thinking that the behaviour I was seeing from JMeter (but not from ab) was new connections failing during the brief time that the master listening process was reloading and refusing new connections. This did not make sense as the OS is meant to queue the new connections. This is when I investigated the possibility that it was killing existing connections and tried with the larger files.
Any thoughts on what may be going on here, how I can test further and possibly how to resolve?
Here is the Apache info, if it helps:
Server version: Apache/2.4.6 (Red Hat Enterprise Linux)
Server built: Jul 12 2016 05:02:54
Server's Module Magic Number: 20120211:24
Server loaded: APR 1.4.8, APR-UTIL 1.5.2
Compiled using: APR 1.4.8, APR-UTIL 1.5.2
Architecture: 64-bit
Server MPM: event
threaded: yes (fixed thread count)
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/httpd"
-D SUEXEC_BIN="/usr/sbin/suexec"
-D DEFAULT_PIDLOG="/run/httpd/httpd.pid"
-D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
-D DEFAULT_ERRORLOG="logs/error_log"
-D AP_TYPES_CONFIG_FILE="conf/mime.types"
-D SERVER_CONFIG_FILE="conf/httpd.conf"

Apache MPM Confusion -- Clarification Needed

I'm working on the linux box where i didn't compile and build Apache. I can't tell which Apache MPM (prefork or worker) I'm using because there seems to be executables for both in /usr/sbin/. This is a CentOS box:
httpd
httpd.worker
In the script /usr/sbin/apachectl is the following line:
# the path to your httpd binary, including options if necessary
HTTPD='/usr/sbin/httpd'
However, /usr/sbin/apachectl also shows HTTPD configuration in the following file which makes me believe it's overriding the above options for HTTPD and pointing it at httpd.worker:
$ cat /etc/sysconfig/httpd
# Configuration file for the httpd service.
#
# The default processing model (MPM) is the process-based
# 'prefork' model. A thread-based model, 'worker', is also
# available, but does not work with some modules (such as PHP).
# The service must be stopped before changing this variable.
#
HTTPD=/usr/sbin/httpd.worker
#
# To pass additional options (for instance, -D definitions) to the
# httpd binary at startup, set OPTIONS here.
#
#OPTIONS=
#
# By default, the httpd process is started in the C locale; to
# change the locale in which the server runs, the HTTPD_LANG
# variable can be set.
#
#HTTPD_LANG=C
#
# By default, the httpd process will create the file
# /var/run/httpd/httpd.pid in which it records its process
# identification number when it starts. If an alternate location is
# specified in httpd.conf (via the PidFile directive), the new
# location needs to be reported in the PIDFILE.
#
#PIDFILE=/var/run/httpd/httpd.pid
My conclusion is that i'm using MPM worker. However, why would i have an httpd executable in /usr/sbin that seems compiled as MPM prefork? Look at these commands? Artifacts maybe?:
# httpd -l
compiled in modules:
core.c
prefork.c
http_core.c
mod_so.c
$ httpd -V
Server version: Apache/2.2.15 (Unix)
Server built: Feb 13 2012 22:31:42
Server's Module Magic Number: 20051115:24
Server loaded: APR 1.3.9, APR-Util 1.3.9
Compiled using: APR 1.3.9, APR-Util 1.3.9
Architecture: 64-bit
Server MPM: Prefork
threaded: no
forked: yes (variable process count)
Server compiled with....
-D APACHE_MPM_DIR="server/mpm/prefork"
-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=128
-D HTTPD_ROOT="/etc/httpd"
-D SUEXEC_BIN="/usr/sbin/suexec"
-D DEFAULT_PIDLOG="run/httpd.pid"
-D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
-D DEFAULT_LOCKFILE="logs/accept.lock"
-D DEFAULT_ERRORLOG="logs/error_log"
-D AP_TYPES_CONFIG_FILE="conf/mime.types"
-D SERVER_CONFIG_FILE="conf/httpd.conf"
$ httpd.worker -l
Compiled in modules:
core.c
worker.c
http_core.c
mod_so.c
$ apachectl -l
Compiled in modules:
core.c
worker.c
http_core.c
mod_so.c
# apachectl -V
Server version: Apache/2.2.15 (Unix)
Server built: Feb 13 2012 22:33:00
Server's Module Magic Number: 20051115:24
Server loaded: APR 1.3.9, APR-Util 1.3.9
Compiled using: APR 1.3.9, APR-Util 1.3.9
Architecture: 64-bit
Server MPM: Worker
threaded: yes (fixed thread count)
forked: yes (variable process count)
Server compiled with....
-D APACHE_MPM_DIR="server/mpm/worker"
-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=128
-D HTTPD_ROOT="/etc/httpd"
-D SUEXEC_BIN="/usr/sbin/suexec"
-D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
-D DEFAULT_ERRORLOG="logs/error_log"
-D AP_TYPES_CONFIG_FILE="conf/mime.types"
-D SERVER_CONFIG_FILE="conf/httpd.conf"
the final reason I believe i'm running httpd.worker:
ps -C httpd.worker -F
UID PID PPID C SZ RSS PSR STIME TTY TIME CMD
root 13603 1 0 34690 4852 1 01:58 ? 00:00:00 /usr/sbin/httpd.worker
apache 13605 13603 0 34619 2352 1 01:58 ? 00:00:00 /usr/sbin/httpd.worker
apache 13606 13603 0 123554 7444 1 01:58 ? 00:00:00 /usr/sbin/httpd.worker
apache 13607 13603 0 240987 52604 0 01:58 ? 00:00:00 /usr/sbin/httpd.worker
apache 13609 13603 0 273755 52396 0 01:58 ? 00:00:00 /usr/sbin/httpd.worker
apache 13611 13603 0 290139 52128 0 01:58 ? 00:00:00 /usr/sbin/httpd.worker
If you are on CentOS, open /usr/sbin/apachectl and below the following lines you mentioned
# the path to your httpd binary, including options if necessary
HTTPD='/usr/sbin/httpd'
you will find the following lines:
# Source /etc/sysconfig/httpd for $HTTPD setting, etc.
if [ -r /etc/sysconfig/httpd ]; then
. /etc/sysconfig/httpd
fi
That is how your apachectl is grabbing and overriding apachectl own HTTPD variable.
This also means that you are indeed using worker mpm instead of prefork.

Version of Apache installed on a Debian machine

How can I check which version of Apache is installed on a Debian machine?
Is there a command for doing this?
Try apachectl -V:
$ apachectl -V
Server version: Apache/2.2.9 (Unix)
Server built: Sep 18 2008 21:54:05
Server's Module Magic Number: 20051115:15
Server loaded: APR 1.2.7, APR-Util 1.2.7
Compiled using: APR 1.2.7, APR-Util 1.2.7
... etc ...
If it does not work for you, run the command with sudo.
This works for my Debian:
$ /usr/sbin/apache2 -v
You should use apache2ctl -v or apache2 -v for newer Debian or Ubuntu distributions.
apache:/etc/apache2# apache2ctl -v
Server version: Apache/2.2.16 (Debian)
Server built: May 12 2011 11:58:18
or you can use apache2 -V to get more information.
apache2 -V
Server version: Apache/2.2.16 (Debian)
Server built: May 12 2011 11:58:18
Server's Module Magic Number: x
Server loaded: APR 1.4.2, APR-Util 1.3.9
Compiled using: APR 1.2.12, APR-Util 1.3.9
Architecture: 64-bit
Server MPM: Worker
threaded: yes (fixed thread count)
forked: yes (variable process count)
Server compiled with....
The command varies depending on how your version of Linux has named the Apache Server.
On Debian and Mac OS:
apachectl -v
On Red Hat and Amazon's EC2 Linux use:
httpd -v
On other verisons of Linux try:
apache2 -v
You can use two different flags:
-v # gives you the version number
-V # gives you the compile settings including version number.
If you want to run the command with the full directory like user3786265 did but don't know where your apache is located, use the whereis command:
whereis httpd
I am using Red Hat Linux and the following command works:
httpd -V
I think you have to be sure what type of installation you have binary or source.
To check what binary packages is installed: with root rights execute following command:
dpkg -l |grep apache2
result should be something like:
dpkg -l |grep apache2
ii apache2 2.4.10-10+deb8u8 amd64 Apache HTTP Server
ii apache2-bin 2.4.10-10+deb8u8 amd64 Apache HTTP Server (modules and other binary files)
ii apache2-data 2.4.10-10+deb8u8 all Apache HTTP Server (common files)
ii apache2-doc 2.4.10-10+deb8u8 all Apache HTTP Server (on-site documentation)
To find version you can run :
apache2ctl -V |grep -i "Server version"
result should be something like:
Server version: Apache/2.4.10 (Debian)
Try it with sudo
apachectl -V
-bash: apachectl: command not found
sudo apachectl -V
Server version: Apache/2.4.6 (Debian)
Server built: Aug 12 2013 18:20:23
Server's Module Magic Number: 20120211:24
Server loaded: APR 1.4.8, APR-UTIL 1.5.3
Compiled using: APR 1.4.8, APR-UTIL 1.5.2
Architecture: 32-bit
Server MPM: prefork
threaded: no
forked: yes (variable process count)
Server compiled with....
bla bla....
You can also use the package manager directly:
dpkg -l | grep apache
This isn't focused on just version number, but it will make a broader search, which will give you other useful information, like module versions.
Another way round to check a package (including Apache) installed version on Debian-based system, we can use:
apt-cache policy <package_name>
e.g. for Apache
apt-cache policy apache2
which will show something like (look at the Installed line):
$ apt-cache policy apache2
apache2:
Installed: (none)
Candidate: 2.2.22-1ubuntu1.9
Version table:
2.2.22-1ubuntu1.9 0
500 http://hk.archive.ubuntu.com/ubuntu/ precise-updates/main amd64 Packages
500 http://security.ubuntu.com/ubuntu/ precise-security/main amd64 Packages
2.2.22-1ubuntu1 0
500 http://hk.archive.ubuntu.com/ubuntu/ precise/main amd64 Packages
For me this works on Debian 6 (Squeeze):
Linux www809 2.6.26-2-xen-686 #1 SMP Wed Sep 21 09:56:47 UTC 2011 i686 GNU/Linux
I had to go to the right path:
/usr/local/apache/bin** $ **./apachectl -v
./apachectl: line 71: ulimit: open files: cannot modify limit: Operation not permitted
Server version: Apache/2.2.21 (Unix)
Server built: Dec 17 2011 19:57:53
I tried running the command "httpd -V" and "apachectl -V", but I could not execute and was getting the error:
-ksh: php: not found [No such file or directory]
Then I tried another way. I went to the Apache directory on my server and then tried executing the command:
./apachectl -v
This worked for me and returned the output:
Server version: Apache/2.2.20 (Unix)
Server built: Sep 6 2012 17:22:16
I hope this helps.
You can use apachectl -V or apachectl -v. Both of them will return the Apache version information!
xgqfrms:~/workspace $ apachectl -v
Server version: Apache/2.4.7 (Ubuntu)
Server built: Jul 15 2016 15:34:04
xgqfrms:~/workspace $ apachectl -V
Server version: Apache/2.4.7 (Ubuntu)
Server built: Jul 15 2016 15:34:04
Server's Module Magic Number: 20120211:27
Server loaded: APR 1.5.1-dev, APR-UTIL 1.5.3
Compiled using: APR 1.5.1-dev, APR-UTIL 1.5.3
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"
You may be more like using apache2 -V or apache2 -v. It seems easier to remember!
xgqfrms:~/workspace $ apache2 -v
Server version: Apache/2.4.7 (Ubuntu)
Server built: Jul 15 2016 15:34:04
xgqfrms:~/workspace $ apache2 -V
Server version: Apache/2.4.7 (Ubuntu)
Server built: Jul 15 2016 15:34:04
Server's Module Magic Number: 20120211:27
Server loaded: APR 1.5.1-dev, APR-UTIL 1.5.3
Compiled using: APR 1.5.1-dev, APR-UTIL 1.5.3
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"
For me apachectl -V did not work, but apachectl fullstatus gave me my version.
Some installations of Apache are fubar (think Oracle's packaging of it, OHS) and do not understand the -V flag, nor can be invoked directly without running into missing library errors.
Easiest way is to use the strings command (part of binutils) on the httpd binary and grep for a string that might resemble a version. For example, assuming your httpd binary is under directory /foo/bar:
$ strings /foo/bar/httpd | grep 2.2
GLIBC_2.2.5
Oracle-HTTP-Server/2.2.22 (Unix)
Success_Accepted_202
202 Accepted
Most binaries (not all) contain their version (at least their major version) as static strings. This is my go-to way to get versions (or to corroborate what a binary's help message matches what reality on the ground truly is.)
Or, less directly:
nmap -A localhost -p 80
Surely typing /usr/sbin/apache2 -v into the shell is the best and quickest way to go, by the way here's another option, just in case there's PHP too in your server and you're interested into gathering Apache version (and much more infos) in quick programmatical steps.
Just make an info.php file in your Apache web root folder (or whatever you like) and write these inside it:
<?php
phpinfo();
?>
Now go to yoursite.com/info.php (or localhost/info.php for local machines).
You'll see your Apache version in PHP Variables section, here's an example:
phpinfo() example dump page
Also, please notice that these steps obviously apply to any web server with PHP integration, so it's not limited to Apache and once created that page could be handy while developing (just don't forget to remove it on production environments!!)
dlocate -s apache2 | grep '^Version:'
works in debian 11 bullseye
/usr/sbin/apache2 -v