Изящный перезапуск Apache на Lion Server - PullRequest
3 голосов
/ 02 апреля 2012

Я недавно обновил операционную систему моего Mac с Lion до Lion Server, что меняет способ чтения настроек httpd.conf при запуске Apache.В частности, переменные среды, такие как WEBSHARING_ON и MACOSXSERVER, устанавливаются процессом Server.app, так что дополнительные модули и файлы считываются при запуске Apache.

Итак, теперь, чтобы перезапустить сервер Apache со всеми необходимымиНастройки и модули загружены, я должен использовать команду: -

sudo serveradmin stop web && sudo serveradmin start web

Ранее я хотел бы запустить: -

sudo apachectl -S
sudo apachectl graceful

Я предпочитаю последний метод на сегодняшний день.Во-первых, команда возвращается намного быстрее, и я также представляю, что процесс сервера apache / httpd не завершается полностью, просто перезагружаются настройки.

Итак, есть ли способ изящно перезапустить Apache вLion Server?

1 Ответ

2 голосов
/ 16 июля 2012

Быстрый ответ - нет.
Программа 'apachectl' на самом деле является всего лишь сценарием оболочки, поэтому (поняв это) легко увидеть, что она делает, и почему она не выполняет то, что я ожидала.

При перезапуске Apache (изящно или иным образом) на Mac соответствующее задание launchctl просто выгружается и перезагружается, что, я думаю, не соответствует официальному описанию Apache изящного перезапуска:

Сигнал 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
...