之前通过 yum 或者编译安装的 httpd 服务,在使用 service httpd restart 重启时,Stopping httpd 显示 OK,但 Starting httpd: httpd (pid 7205) already running。并且没有重新读取修改的配置文件,每次设置新的 vhost 虚拟主机,总是需要使用 pkill httpd 才能完全杀死 httpd 进程,之后再启动服务。

今天查找 httpd 服务重启的时候突然看到一个指令 apachectl graceful,实验了一下,新的 ssl 证书配置更新了。不禁喜出望外,之前重启 httpd 服务,主要就是为了让 Apache 重新读取配置文件,现在轻松实现了。这有点像 Nginx 服务器里的 nginx -s reload 指令,不需要手动关闭所有进程,Nginx 自然而然地很顺滑的重新加载了配置文件。

然后就发现了 httpd 指令本身自带的参数指令:

httpd -k start|restart|graceful|graceful-stop|stop

测试发现,执行 httpd -k restart 或者 httpd -k graceful 指令都会重启子进程(主进程未重启)。只不过后者更加强调顺滑、优雅,先是启动了相同数量的子进程替代之前的进程进行服务,之后才去关闭之前的进程。-k 是明确执行的对象是正在运行中的 httpd 服务,所以有些教程又把这种带 -k 的启动,叫热启动,重启叫热重启。

查看配置是否正确可以使用 apachectl configtest 或者 httpd -t,这又让我联想到 Nginx 的 nginx -thttpd -h 查看所有的指令用法。原来软件的很多功能都是存在的,只不过使用者不知道而已。