如何在 centos 7 中“优雅重启 Apache”?

如何在 centos 7 中“优雅重启 Apache”?

我的系统是centos 7.4,以apache 2.4
为基础Apache 手册apachectl -k graceful应该是优雅重启 apache 的方法,但是我收到以下通知:

[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.

有什么问题?在 centos 7 中
该如何解决?Graceful Restart Apache

答案1

请参阅 apachectl 上的此页面,它似乎是一个新版本: https://httpd.apache.org/docs/2.4/programs/apachectl.html

没有必要传递‘-k’参数。 apachectl graceful (没有-k)就可以很好地在我的 Centos7 框和 Centos6 框上正常重新加载/重启。

显然没有人更新 OP 在她的问题中引用的手册页,该手册页仍然存在,并且其中的命令始终都带有“-k”参数(apachectl -k graceful、apachectl -k restart 等)。但是,该页面上没有关于 -k 参数实际上在做什么的解释。

但是在较新的页面上,有关于 apachectl graceful 的注释:

这相当于 apachectl -k graceful。

在我的 Centos6 机器上,我一直在使用命令service httpd graceful。该命令在 Centos7 上不再起作用。需要apachectl graceful在 Centos 7 上执行等效操作。apachectl graceful在 Centos 6 上也可以正常工作。

答案2

大多数基于 systemd 的发行版使用已修补的apachectl脚本 [1],将命令委托给systemctl。已修补的apachectl命令不支持将参数传递给 的“直通”操作模式httpd。apachectl 手册页反映了上游未修补的apachectl命令,因此存在差异。

我建议使用systemctl[2]抽象来启动和停止服务。

因此,要正常重启 Centos 7 和其他使用 systemd 的 Linux 发行版上的 Apache HTTP Server,请使用:

sudo systemctl reload httpd.service

在底层,这将调用httpd -k graceful。您可以使用以下命令进行验证:

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

要停止 Apache HTTP 服务器:

sudo systemctl stop httpd.service

它在后台SIGWINCHhttpd进程发送信号。

可以使用以下命令来验证:

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

[3]手册systemd.service说,在这种情况下,如果ExecStop没有指定选项,“进程将通过发送 中指定的信号来终止KillSignal”。

为什么SIGWINCH?因为,每https://bz.apache.org/bugzilla/show_bug.cgi?id=50669,Apache 使用该SIGWINCH信号作为‘优雅关闭’触发器。

您可能会发现另一个对探索服务选项有用的命令是show-p, --property选项组合的命令,如下所示:

$ 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

答案3

与其他使用 systemd 的 Linux 发行版一样,你可以使用 来管理 httpd systemctl。特别是:

systemctl reload httpd

将导致 httpd 重新加载其配置文件并使用新配置重新启动其工作程序,正如graceful所做的那样。

相关内容