如何在不重新启动 apache 的情况下为站点重新加载 apache 配置?

Posted

技术标签:

【中文标题】如何在不重新启动 apache 的情况下为站点重新加载 apache 配置?【英文标题】:How to reload apache configuration for a site without restarting apache? 【发布时间】:2012-01-06 09:25:59 【问题描述】:

我已经在 sites-enabled 目录中为我的一个网站编辑了变量 AllowOverride。如何在不重新启动 apache 的情况下重新加载新配置?有可能吗?

【问题讨论】:

apache2 重新加载 superuser.com/questions/192686/… 好像所有的答案都不正确。 澄清一下,下面的答案是在重新加载时有效——尽管不同发行版的命令不同(例如 CentOs 中的 apachectl 或 Ubuntu 中的 apache2)。但担心的是不重新启动。全部重新启动,但优雅 (SIGUSR1) 解决方案等待没有打开的连接被破坏。 【参考方案1】:

应该可以使用命令

sudo /etc/init.d/apache2 reload

希望对你有帮助。

【讨论】:

我很确定这是不正确的。查看 Ubuntu 服务器的 init.d-script,reload 指的是优雅重启。这意味着重新加载实际上是重新启动,但是很优雅。我的观点是不中断服务就不能重新加载apache。 阿鲁曼的答案是正确的。大多数 Apache 初始化脚本都会发送 SIGHUP,这相当于 'apachectl restart',OP 明确要求避免这种情况。其他 Apache 初始化脚本发送 SIGUSR1 相当于“apachectl graceful”,这也是重新启动,但做得更优雅,这是 Aruman 的答案所提供的。 @SteffenNielsen 我认为你是对的......有些人可以使用负载均衡器,禁用一个重新启动,重新启动,处理数据库版本控制,然后对另一个做同样的事情阿帕奇服务器/容器。 K8s 消除了其中一些问题。 好的,这就是发生的事情,主 apache2 进程没有改变,但是子进程或工作进程(我不知道正确的术语)都重新启动,这些 PID 实际上发生了变化。 我认为在这种情况下优雅只是意味着那些童工在被杀死和重生之前完成了他们的请求。【参考方案2】:

另一种方法是:

sudo service apache2 reload

【讨论】:

【参考方案3】:

apachectl -k graceful

查看此链接了解更多信息: http://www.electrictoolbox.com/article/apache/restart-apache/

【讨论】:

这将重新启动 Apache httpd 守护程序,该问题特别要求避免。 @cs01 你从哪里得知 httpd 守护进程将重新启动?我在答案中提供的链接上读到的所有内容都说apachectl graceful: Gracefully restarts the Apache daemon by sending it a SIGUSR1. If the daemon is not running, it is started. This differs from a normal restart in that currently open connections are not aborted. 您发布的文档的第一句话就是这么说的,不是吗? @cs01 你需要了解他们为什么担心重启。这没有具体说明,但我的猜测是他们不希望连接中止,而不是重新启动本身。在大多数情况下,优雅的重启可以做到这一点。如果有长期的联系,这可能是一个问题。您还需要对重启有一个好的定义,因为所有正常重启所做的都是重新初始化父进程,即 pid 不会改变,而正常重启会破坏整个进程树,并产生一个新进程树。因此 Tyler Collier 的回答是完全合法的。 @cs01 这不会重新启动服务器。请参阅apache documentation,其中指出此答案中的命令是如何执行正常重启。我新添加的答案中也有更多详细信息。【参考方案4】:

针对 Apache 2.4、非 systemd(例如 CentOS 6.x、Amazon Linux AMI)和 systemd(例如 CentOS 7.x)进行了更新:

有两种方法可以让 apache 进程重新加载配置,具体取决于您希望对其当前线程执行的操作,建议在空闲时退出,或直接终止它们。

注意Apache推荐使用apachectl -k作为命令,对于systemd,命令替换为httpd -k

apachectl -k gracefulhttpd -k graceful

Apache 会在空闲时建议其线程退出,然后 apache 重新加载配置(它不会自行退出),这意味着统计信息不会重置。

apachectl -k restarthttpd -k restart

这类似于停止,因为进程会杀死其线程,但随后进程会重新加载配置文件,而不是杀死自己。

来源:https://httpd.apache.org/docs/2.4/stopping.html

【讨论】:

apache 2.4.39 (win) 不支持httpd -k gracefulhttpd -k restart: httpd /? => -k restart : tell running Apache to do a graceful restart【参考方案5】:

如果你使用的是 Ubuntu 服务器,你可以使用 systemctl

systemctl reload apache2

【讨论】:

在 ubuntu 18 上(至少)这是/usr/sbin/apachectl graceful的别名【参考方案6】:

这里是迟到的答案,但如果你在/etc/init.d/apache2 中搜索'reload',你会发现类似这样的内容:

do_reload() 
        if apache_conftest; then
                if ! pidofproc -p $PIDFILE "$DAEMON" > /dev/null 2>&1 ; then
                        APACHE2_INIT_MESSAGE="Apache2 is not running"
                        return 2
                fi
                $APACHE2CTL graceful > /dev/null 2>&1
                return $?
        else
                APACHE2_INIT_MESSAGE="The apache2$DIR_SUFFIX configtest failed. Not doing anything."
                return 2
        fi

基本上,建议使用 init.d、systemctl 等的答案调用的是一个瘦包装器,上面写着:

检查 apache 配置 如果没问题,运行apachectl graceful(吞下输出,转发退出代码)

这表明@Aruman 的回答也是正确的,前提是您确信您的配置中没有错误或者已经手动运行了apachctl configtest

apache documentation 还提供了相同的命令以进行正常重启 (apachectl -k graceful),并为其行为提供了更多颜色。

【讨论】:

以上是关于如何在不重新启动 apache 的情况下为站点重新加载 apache 配置?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不重新启动的情况下调试 mod_perl2 模块?

如何在不重新启动树莓派本身的情况下重新启动 ALSA?

如何在不重新启动的情况下在 Express 上重新加载一个文件?

如何在不重新加载页面的情况下重新启动 Angular 应用程序?

如何在不重新启动的情况下卸载 Windows 服务并删除其文件

如何在不使用 void 的情况下重新启动 CSS 动画?