httpd (Apache) 服务重启总是失败的解决方法
之前通过 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 -t
。httpd -h
查看所有的指令用法。原来软件的很多功能都是存在的,只不过使用者不知道而已。