<?xml version="1.0" encoding="KOI8-R"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="ru" xml:lang="ru"><head><!--
        XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
              This file is generated from xml source: DO NOT EDIT
        XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
      -->
<title>Останов и перезапуск - HTTP сервер Apache</title>
<link href="./style/css/manual.css" rel="stylesheet" media="all" type="text/css" title="Main stylesheet" />
<link href="./style/css/manual-loose-100pc.css" rel="alternate stylesheet" media="all" type="text/css" title="No Sidebar - Default font size" />
<link href="./style/css/manual-print.css" rel="stylesheet" media="print" type="text/css" />
<link href="./images/favicon.ico" rel="shortcut icon" /></head>
<body id="manual-page"><div id="page-header">
<p class="menu"><a href="./mod/">Модули</a> | <a href="./mod/directives.html">Директивы</a> | <a href="./faq/">FAQ</a> | <a href="./glossary.html">Глоссарий</a> | <a href="./sitemap.html">Карта сайта</a></p>
<p class="apache">HTTP сервер Apache Версия 2.0</p>
<img alt="" src="./images/feather.gif" /></div>
<div class="up"><a href="./"><img title="&lt;-" alt="&lt;-" src="./images/left.gif" /></a></div>
<div id="path">
<a href="http://www.apache.org/">Apache</a> &gt; <a href="http://httpd.apache.org/">HTTP сервер</a> &gt; <a href="http://httpd.apache.org/docs-project/">Документация</a> &gt; <a href="./">Версия 2.0</a></div><div id="page-content"><div id="preamble"><h1>Останов и перезапуск</h1>
    <p>Этот документ рассматривает вопросы остановки и перезапуска Apache на
    Unix-подобных системах. Пользователям Windows NT, 2000 и XP следует читать раздел
    <a href="platform/windows.html#winsvc">"Работа Apache как сервиса"</a>,
    а пользователям Windows 9x и ME - <a href="platform/windows.html#wincons">"Работа
    Apache как консольного приложения"</a>, для получения информации об
    управлении сервером на этих платформах.</p>
</div>
<div id="quickview"><ul id="toc"><li><img alt="" src="./images/down.gif" /> <a href="#introduction">Введение</a></li>
<li><img alt="" src="./images/down.gif" /> <a href="#term">Немедленная остановка</a></li>
<li><img alt="" src="./images/down.gif" /> <a href="#graceful">Мягкий перезапуск</a></li>
<li><img alt="" src="./images/down.gif" /> <a href="#hup">Немедленный перезапуск</a></li>
<li><img alt="" src="./images/down.gif" /> <a href="#race">Приложение: сигналы и ситуации гонки (race conditions)</a></li>
</ul><h3>См. также</h3><ul class="seealso"><li><a href="programs/httpd.html">httpd</a></li><li><a href="programs/apachectl.html">apachectl</a></li></ul></div>
<div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
<div class="section">
<h2><a name="introduction" id="introduction">Введение</a></h2>

    <p>Для того, чтобы остановить или перезапустить Apache, необходимо послать
    сигнал запущенным процессам <code>httpd</code>.  Существует два способа
    отправить подобные сигналы. Во-первых, Вы можете послать сигналы непосредственно
    процессам, используя команду unix'а <code>kill</code>. Обратите внимание,
    что процессов <code>httpd</code> в системе выполняется несколько,
    однако Вы не должны отсылать сигналы ни одному из них, кроме родительского -
    его pid (идентификатор процесса) записывается в файл, путь к которому задается
    директивой <code class="directive"><a href="./mod/mpm_common.html#pidfile">PidFile</a></code>. Существуют три
    сигнала, которые Вы можете отправить родительскому процессу: 
    <a href="#term"><code>TERM</code></a>,
    <a href="#hup"><code>HUP</code></a>, и
    <a href="#graceful"><code>USR1</code></a> - их значение будет объяснено ниже.</p>

    <p>Чтобы отправить сигнал родительскому процессу, Вам следует набрать следующую команду:</p>

<div class="example"><p><code>kill -TERM `cat /usr/local/apache2/logs/httpd.pid`</code></p></div>

    <p>Второй способ передать сигналы процессам <code>httpd</code> - это
    использование опции <code>-k</code> в командной строке с аргументами: <code>stop</code>,
    <code>restart</code> и <code>graceful</code>, как будет описано ниже.
    Это параметры командной строки для исполняемого файла <a href="programs/httpd.html">httpd</a>,
    однако мы рекомендуем передавать их, используя скрипт <a href="programs/apachectl.html">apachectl</a>, который передаст эти параметры
    программе <code>httpd</code>.</p>

    <p>После того, как будут отправлены сигналы процессу <code>httpd</code>, вы можете
    узнать о состоянии сервера, набрав:</p>

<div class="example"><p><code>tail -f /usr/local/apache2/logs/error_log</code></p></div>

    <p>Внесите необходимые изменения в эти примеры с учётом 
       значения директив <code class="directive"><a href="./mod/core.html#serverroot">ServerRoot</a></code>
       и <code class="directive"><a href="./mod/mpm_common.html#pidfile">PidFile</a></code> в конфигурации
       Apache.</p>
</div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
<div class="section">
<h2><a name="term" id="term">Немедленная остановка</a></h2>

<dl><dt>Сигнал: TERM</dt>
<dd><code>apachectl -k stop</code></dd>
</dl>

    <p>После получения сигнала <code>TERM</code> или <code>stop</code>,
    родительский процесс пытается немедленно уничтожить все дочерние процессы.
    Это может занять несколько секунд. Затем родительский процесс сам завершает работу,
    при этом все текущие запросы прекращают обрабатываться, а новые запросы игнорируются.</p>

</div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
<div class="section">
<h2><a name="graceful" id="graceful">Мягкий перезапуск</a></h2>

<dl><dt>Сигнал: USR1</dt>
<dd><code>apachectl -k graceful</code></dd>
</dl>

    <p>При получении сигнала <code>USR1</code> или <code>graceful</code>,
    родительский процесс <em>призывает</em> дочерние процессы к завершению работы
    сразу же после обработки своего текущего запроса (или к незамедлительной остановке,
    если дочерний процесс ничего не обрабатывает). Родительский процесс
    перечитывает конфигурационные файлы, открывает заново log-файлы
    (файлы, содержащие журнал работы сервера). После того, как какой-то из
    дочерних процессов завершает работу, родительский процесс заменяет его
    дочерним процессом нового <em>поколения</em>, т.е. с новой конфигурацией,
    который начинает обрабатывать новые запросы незамедлительно.</p>

    <div class="note">На некоторых платформах, не поддерживающих передачу сигнала <code>USR1</code>
    как сигнала для инициации мягкого перезапуска, могут
    использоваться другие сигналы (такие как <code>WINCH</code>).
    Команда <code>apachectl graceful</code> отправит корректный сигнал
    на любой платформе.</div>

    <p>Программа разработана таким образом, что количество процессов и потоков,
    определённое директивами МП-модуля (мульти-процессного модуля),
    оставалось неизменным на протяжение всего процесса перезапуска.
    Кроме того, для поддержания числа запущенных процессов, определённого
    директивой <code class="directive"><a href="./mod/mpm_common.html#startservers">StartServers</a></code>, 
    используется следующий способ: если спустя одну секунду не было
    создано по крайней мере такое количество дочерних процессов, какое
    определено директивой <code class="directive"><a href="./mod/mpm_common.html#startservers">StartServers</a></code>,
    тогда создаётся такое количество дочерних процессов, которое полностью
    восполнило бы недостаток. Таким образом сервер пытается одновременно и сохранить 
    количество уже существующих дочерних процессов неизменным, и учесть Ваши 
    требования, указанные в директиве <code class="directive">StartServers</code>.</p>

    <p>Пользователи, использующие модуль <code class="module"><a href="./mod/mod_status.html">mod_status</a></code>,
    могут обратить внимание, что статистика сервера при получении сигнала
    <code>USR1</code> не обнуляется. Так было сделано для того, чтобы уменьшить
    промежуток времени, в течение которого сервер не может обрабатывать
    новые запросы (которые операционная система будет ставить в очередь,
    т.е. они не пропадут в любом случае), а также для того, чтобы учитывать
    Ваши настройки. Для этого сервер хранит <em>таблицу статистики</em>,
    в которую записываются результаты работы всех дочерних процессов, вне зависимости от их поколения.</p>

    <p>Модуль <code>mod_status</code> также использует символ <code>G</code>, чтобы
    указать те дочерние процессы, которые всё ещё обрабатывают запросы и которые были
    созданы до сигнала к мягкому перезапуску.</p>

    <p>В настоящее время нет способа определить,
    что все дочерние процессы закончили запись в старый log-файл (т.е.
    log-файл, в который производилась запись до перезапуска). Мы
    предлагаем Вам подождать некоторое время, после того как будет
    послан сигнал <code>USR1</code>, прежде чем делать что-либо
    со старым log-файлом. Например, если на выполнение запросов
    пользователей, подключённых через очень медленный канал, уходит
    не более 10 минут, тогда логично будет подождать 15 минут, прежде чем
    делать что-либо со старым log-файлом.</p>

    <div class="note">Если Ваш конфигурационный файл содержит ошибки, то попытка
    перезапустить сервер вызовет немедленное прекращение работы родительского
    процесса с сообщением об ошибке.  В случае мягкого перезапуска
    дочерние процессы продолжают обрабатывать свои запросы, после чего 
    они завершат свою работу. Это может вызвать проблемы,
    так как сервер не будет в состоянии установить соединение с необходимыми
    портами. Перед выполнением перезапуска, Вы должны
    проверить синтаксис конфигурационных файлов с помощью параметра
    <code>-t</code> командной строки (см. описание <a href="programs/httpd.html">httpd</a>).
    Однако это всё ещё не гарантирует, что сервер перезапустится корректно.
    Что проверить семантику конфигурационных файлов, равно как и их синтаксис,
    Вы можете попробовать запустить <code>httpd</code>, будучи непривилегированным пользователем.
    Если ошибки отсутствуют, то <code>httpd</code> попытается открыть
    сокеты и log-файлы, но не сможет этого сделать, потому что у него отсутствуют
    необходимые для этого права (или потому что в текущее время работающий <code>httpd</code> уже
    установил соединение с нужными портами, заняв их). Если сбой
    происходит по любой другой причине - значит, скорее всего,
    существует ошибка в конфигурационном файле, которая должна быть
    исправлена перед началом мягкого перезапуска.</div>
</div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
<div class="section">
<h2><a name="hup" id="hup">Немедленный перезапуск</a></h2>

<dl><dt>Сигнал: HUP</dt>
<dd><code>apachectl -k restart</code></dd>
</dl>

    <p>Отправленный родительскому процессу сигнал <code>HUP</code> 
    или <code>restart</code> вызывает немедленное уничтожение 
    всех дочерних процессов, также как и при обработке сигнала 
    <code>TERM</code>, однако родительский процесс не завершает работу.
    Он перечитывает конфигурационные файлы и открывает заново log-файлы
    (файлы, содержащие журнал работы сервера). Затем он порождает
    новых потомков и продолжает обработку запросов.</p>

    <p>Пользователи, использующие модуль <code class="module"><a href="./mod/mod_status.html">mod_status</a></code>,
    могут обратить внимание, что статистика сервера при получении сигнала
    <code>HUP</code> полностью обнуляется.</p>

<div class="note">Если Ваш конфигурационный файл содержит ошибки, то попытка
перезапустить сервер вызовет немедленное прекращение его работы
с сообщением об ошибке. Способы избежать этого смотрите выше.
</div>
</div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
<div class="section">
<h2><a name="race" id="race">Приложение: сигналы и ситуации гонки (race conditions)</a></h2>

    <p>В Apache до версии 1.2b9 существовало несколько <em>ситуаций гонки (race
    conditions)</em>, возникающих при получении сигналов к перезапуску или останову (простое
    объяснение ситуаций гонки (race conditions): проблема, возникающая,
    когда что-то происходит в то время, когда не должно происходить,
    из-за чего нарушается нормальная работа параллельно выполняемых процессов).
    Для компьютеров с архитектурами, имеющими "правильный", "хороший" набор 
    возможностей, подобные проблемы были устранены везде, где это возможно.
    Однако следует помнить, что на компьютерах с некоторыми архитектурами
    всё ещё существует возможность возникновения ситуаций гонки (race conditions).</p>

    <p>Компьютеры с архитектурами, на которых таблица статистики хранится
    в файле, описанном директивой <code class="directive"><a href="./mod/mpm_common.html#scoreboardfile">ScoreBoardFile</a></code>,
    имеют потенциальную возможность повреждения их таблиц статистики.
    Это может вызвать ошибку "bind: Address already in use" - 
    "установление связи: Адрес уже используется" (после сигнала <code>HUP</code>) 
    или "long lost child came home!" - "Возврат потерянного дочернего процесса"
    (после сигнала <code>USR1</code>).  Последнее сообщение - фатальная ошибка,
    в то время как предыдущее вызывает только потерю связи с таблицей статистики.
    Поэтому можно порекомендовать использовать мягкий перезапуск, и лишь время от времени
    делать жесткий перезапуск. С этими проблемами очень сложно бороться,
    однако, к счастью, большинство архитектур не требуют хранить таблицу статистики
    на диске. Смотрите документацию к директиве  <code class="directive"><a href="./mod/mpm_common.html#scoreboardfile">ScoreBoardFile</a></code>, чтобы узнать, на каких архитектурах
    используется этот файл.</p>

    <p>Во всех архитектурах существуют небольшие ситуации гонки (race conditions)
    в каждом дочернем процессе, начиная со второго запроса при постоянном
    HTTP соединении (KeepAlive). Процесс может завершиться после чтения
    строки запроса, но перед чтением заголовков запроса. Исправление
    появилось позже выпуска версии 1.2, а потому не включено в него. Теоретически, это
    не проблема, потому что KeepAlive-клиент должен ожидать таких событий
    из-за задержек сети и времени ожидания сервера. Практически,
    складывается впечатление, что это также не оказывает никакого 
    влияния - во время тестов сервер перезапускался с частотой 20 раз
    в секунду, а клиенты успешно просматривали сайт, не получая
    пустых документов и повреждённых картинок.</p>
</div></div>
<div id="footer">
<p class="apache">Поддержка осуществляется <a href="http://httpd.apache.org/docs-project/">Apache HTTP Server Documentation Project</a></p>
<p class="menu"><a href="./mod/">Модули</a> | <a href="./mod/directives.html">Директивы</a> | <a href="./faq/">FAQ</a> | <a href="./glossary.html">Глоссарий</a> | <a href="./sitemap.html">Карта сайта</a></p></div>
</body></html>