2012-04-02 59 views
3

我最近將我的Mac的操作系統從Lion升級到Lion Server,這改變了Apache啓動時如何讀取httpd.conf設置。特別是,像WEBSHARING_ON和MACOSXSERVER這樣的環境變量是由Server.app進程設置的,所以當Apache啓動時會讀入額外的模塊和文件。在Lion服務器上完美重啓Apache

所以,現在,重新啓動了所有正確的設置並加載模塊的Apache服務器,我必須使用命令: -

sudo serveradmin stop web && sudo serveradmin start web 

以前,我會跑: -

sudo apachectl -S 
sudo apachectl graceful 

到目前爲止,我更喜歡後一種方法。首先,命令返回速度更快,並且我也想象apache/httpd服務器進程沒有完全終止,只是設置被重新加載。

那麼,有沒有辦法在Lion Server中正常重啓Apache?

回答

2

快速回答是否定的。
'apachectl'程序實際上只是一個shell腳本,因此(意識到這一點後)很容易看到它在做什麼,以及爲什麼它沒有按照我的預期做。

重啓動Apache(正常或以其他方式)在Mac上時,相關launchctl工作纔剛剛卸載並重新加載,我想象不按平穩重啓的official Apache description

的USR1或優雅信號使得父進程的當前請求後,孩子們勸退出(或立即退出,如果他們沒有進行服務的任何東西)

原因apachectl -S不顯示配置的虛擬服務器是因爲該命令不是由launchctl運行,所以envir未加載/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