How to `Graceful Restart Apache` in centos 7?

My system is centos 7.4, with apache 2.4
Based on apache manual,apachectl -k graceful should be the way to graceful restart apache, but I got notice as below:

[root@localhost root]# apachectl -k graceful
Passing arguments to httpd using apachectl is no longer supported.
You can only start/stop/restart httpd using this script.
If you want to pass extra arguments to httpd, edit the
/etc/sysconfig/httpd config file.

What's the problem?
How to Graceful Restart Apache in centos 7?


Solution 1:

Please see this page on apachectl, which appears to be a new version: https://httpd.apache.org/docs/2.4/programs/apachectl.html

There is no need to pass the '-k' argument. apachectl graceful (without the -k) works just fine for a graceful reload/restart on my Centos7 box and Centos6 box.

Apparently nobody updated the manual page OP cited in her question, which still exists, and where the commands are shown with the '-k' argument throughout (apachectl -k graceful, apachectl -k restart, etc.) There's no explanation on that page about what the -k argument is actually doing, however.

But on the newer page there is this note on about apachectl graceful:

This is equivalent to apachectl -k graceful.

On my Centos6 box, I had been using the command service httpd graceful. That no longer worked on Centos7. It's necessary to use apachectl graceful to do the equivalent on Centos 7. Also apachectl graceful works just fine on Centos 6.

Solution 2:

Most systemd-based distributions use a patched apachectl script [1] that delegates commands to systemctl. The patched apachectl command does not support the "pass-through" mode of operation in which arguments are passed through to httpd. The apachectl manual page reflects the upstream non-patched apachectl command, hence the discrepancy.

I recommend using the systemctl [2] abstraction for starting and stopping services.

Thus, to gracefully restart the Apache HTTP Server on Centos 7, and other linux distributions using systemd, use:

sudo systemctl reload httpd.service

Under the hood, this invokes httpd -k graceful. You can verify this with this command:

$ systemctl cat httpd.service | grep -F ExecReload
ExecReload=/usr/sbin/httpd $OPTIONS -k graceful

To stop the Apache HTTP Server:

sudo systemctl stop httpd.service

which, behind the scenes, sends a SIGWINCH signal to the httpd process.

This can be verified with this command:

$ systemctl cat httpd.service \
  | grep -E --before-context=1 'ExecStop|KillSignal'
# Send SIGWINCH for graceful stop
KillSignal=SIGWINCH

The systemd.service [3] manual says that in this situation, where the ExecStop option is not specified, "the process is terminated by sending the signal specified in KillSignal."

Why SIGWINCH? Because, per https://bz.apache.org/bugzilla/show_bug.cgi?id=50669 , Apache uses the SIGWINCH signal as a 'graceful shutdown' trigger.

Another command you may find useful to explore service options is the show command combined with -p, --property options, like this:

$ systemctl show httpd.service -p ExecStart -p ExecReload -p ExecStop -p KillSignal

[1] https://git.centos.org/blob/rpms!httpd.git/c7/SOURCES!httpd-2.4.3-apctl-systemd.patch
[2] https://www.freedesktop.org/software/systemd/man/systemctl.html
[3] https://www.freedesktop.org/software/systemd/man/systemd.service.html

Solution 3:

As with other Linux distributions that use systemd, you can manage httpd with systemctl. In particular:

systemctl reload httpd

will cause httpd to reload its configuration files and restart its workers with the new configuration, exactly as graceful did.