在Lion服务器上优雅地重新启动Apache

在Lion服务器上优雅地重新启动Apache,apache,osx-lion,osx-server,Apache,Osx Lion,Osx Server,我最近将我的Mac操作系统从Lion升级到Lion服务器,这改变了Apache启动时读取httpd.conf设置的方式。特别是,诸如WEBSHARING_ON和MACOSXSERVER之类的环境变量由Server.app进程设置,以便在启动Apache时读入额外的模块和文件 现在,要在加载了所有正确设置和模块的情况下重新启动Apache服务器,我必须使用以下命令:- sudo serveradmin stop web && sudo serveradmin start web

我最近将我的Mac操作系统从Lion升级到Lion服务器,这改变了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?

答案是否定的。
“apachectl”程序实际上只是一个shell脚本,因此(在意识到这一点后)很容易看到它在做什么,以及为什么它没有达到我预期的效果

在Mac上重新启动Apache(优雅地或以其他方式)时,相关的launchctl作业只是被卸载和重新加载,我认为这与优雅地重新启动不同:

USR1或优雅信号会导致父进程建议子进程在其当前请求后退出(或者如果它们没有提供任何服务,则立即退出)

apachectl-S未显示配置的虚拟服务器的原因是launchctl未运行此命令,因此未加载/System/Library/LaunchDaemons/org.apache.httpd.plist中设置的环境变量

因此,
apachectl
apachectl restart
等确实加载了正确的变量,因此正确读取了配置文件,但并非所有命令都默认这样做

为了克服这个问题,我手动编辑了/usr/sbin/apachectl,如下所示。我所做的只是在适当的地方添加“-D MACOSXSERVER-D WEBSERVICE_”

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