我最近将Mac的操作系统从Lion升级到Lion Server,这改变了Apache启动时读取httpd.conf设置的方式。特别是,WEBSHARING_ON和MACOSXSERVER等环境变量由Server.app进程设置,因此在启动Apache时会读入额外的模块和文件。
现在,要重新启动Apache服务器并加载所有正确的设置和模块,我必须使用以下命令: -
sudo serveradmin stop web && sudo serveradmin start web
以前,我会跑: -
sudo apachectl -S
sudo apachectl graceful
到目前为止我更喜欢后一种方法。首先,命令返回得更快,我还想象apache / httpd服务器进程没有完全终止,只是重新加载设置。
那么,有没有办法在Lion Server中优雅地重启Apache?
答案 0 :(得分:2)
快速回答是否。
'apachectl'程序实际上只是一个shell脚本,所以(在意识到这一点之后)很容易看出它在做什么,以及为什么它没有按照我的预期进行。
在Mac上重启Apache(优雅或其他方式)时,相关的launchctl作业只是卸载并重新加载,我想这不是按照正常重启的official Apache description进行的:
USR1或优美信号导致父进程建议孩子在他们当前请求后退出(或者如果他们没有提供任何东西则立即退出)
apachectl -S
未显示已配置的虚拟服务器的原因是因为此命令不是由launchctl运行的,因此/System/Library/LaunchDaemons/org.apache.httpd.plist中设置的环境变量是没装。
因此,apachectl graceful
,apachectl restart
和其他人会加载正确的变量,因此请正确读取配置文件,但默认情况下不会执行所有命令。
为了解决这个问题,我手动编辑了/ usr / sbin / apachectl,如下所示。我所做的就是在适当的时候添加“-D MACOSXSERVER -D WEBSERVICE_ON”。
case $ARGV in
start)
run_launchctl load -w $LAUNCHD_JOB
ERROR=$?
;;
stop|graceful-stop)
run_launchctl unload -w $LAUNCHD_JOB
ERROR=$?
;;
restart|graceful)
run_launchctl unload -w $LAUNCHD_JOB 2> /dev/null
run_launchctl load -w $LAUNCHD_JOB
ERROR=$?
;;
startssl|sslstart|start-SSL)
echo The startssl option is no longer supported.
echo Please edit httpd.conf to include the SSL configuration settings
echo and then use "apachectl start".
ERROR=2
;;
configtest)
$HTTPD -t -D MACOSXSERVER -D WEBSERVICE_ON
ERROR=$?
;;
status|fullstatus)
echo Go to $STATUSURL in the web browser of your choice.
echo Note that mod_status must be enabled for this to work.
;;
*)
$HTTPD $ARGV -D MACOSXSERVER -D WEBSERVICE_ON
ERROR=$?
esac