exactly 90 seconds to restart apache httpd

After a lot of trial and error I found out that it's being caused by the php5 module which is being loaded in /etc/sysconfig/apache2. Removing it completelly stopped this behavior.

I need the php5 module though, so in order to mitigate this delay I've added the following in etc/apache2/server-tuning.conf:

GracefulShutdownTimeout 2

Now when the segfault occurs when stopping apache it only hangs for 2 seconds.


This same thing was happening to me and it turns out that I left the /etc/hosts file at its default setting.

The delay went away immediately after I updated the hosts file similar to this:

127.0.0.1   localhost
::1         localhost
172.16.333.444  www.mysite.com mysite.com

References:

/etc/hosts entry for single IP server serving multiple domains

https://unix.stackexchange.com/questions/57439/slow-start-of-midnight-commander#answer-397879


When using graceful restart, the parent apache process stops accepting new connections and waits forever for all the child processes to exit. So essentially the web server is dead (other than existing connections) until all the existing children exit.

In the normal use case of short-lived http/https connections, this is not a problem when doing a graceful shutdown or restart...it should normally take a second. The problem is when you have something that delays the children exiting, such as persistent websocket connections. In that case the server will never actually manage to gracefully stop/restart...it will just sit there forever in a semi-dead state.

You can adjust the delay using the GracefulShutdownTimeout directive:

https://httpd.apache.org/docs/2.4/mod/mpm_common.html#gracefulshutdowntimeout

By default it is set to 0 (infinite). 5 seconds is a more reasonable value.

Note that when using systemctl to restart the server, it will only wait a maximum of 90 seconds by default before forcing it to kill the child processes (rather than forever), which is why you are seeing this 90 second delay. This is set in /etc/systemd/system.conf:

#DefaultTimeoutStopSec=90s

This can also be changed for individual units using the TimeoutStopSec option.