error 408

Igor Sysoev is at rambler-co.ru
Fri Dec 31 09:45:32 MSK 2004


On Thu, 30 Dec 2004, Yevgeniy Kruglov wrote:

> >> А  по  какой  причине  nginx  может  давать некоторое количество 408? Причем это
> >> случается  только  с Opera или FF, с MSIE не замечено ни разу. Ошибки появляются
> >> как на контенте, отдаваемом самим nginx, так и с backend.
> IS> 408 - это client timed out. Эта ошибка пишется в лог, если таймаут произoшёл
> IS> при чтении запроса или его тела от клиента. Причём, если в логе есть
> IS> User-Agent, то таймаут уже после чтения этого заголовка.
>
> Все чуть-чуть сложнее. Клиент просит страницу, в ответ тишина. Если долго ждать,
> сервер  пишет  в  лог  и в браузер клиенту 408. Останавливают запрос - 408 в лог
> пишется  сразу.  Повторный  запрос  проходит  без проблем. Если бы посетители не
> видели ошибки, никто бы не стал искать ее в логах (1 штука на 10-15К хитов).
>
> IS> Почему нет MSIE, не знаю. Возможно, он попадает в записи без User-Agent.
>
> Кроме  того,  при тестировании с MSIE не удалось воспроизвести ситуацию. Опера -
> получается.  Что удалось выяснить - некоторые посетителей сайта, что видели 408,
> ходят  в  и-нет  через  squid.  Повторить пока получилось только через https, от
> tcpdump пользы не будет.

Нужно собрать nginx так: ./configure ... --with-debug. Большого оверхеда это
не добавит, у меня на всех продакнш серверах nginx собран так. После этого
можно писать error_log кучу отладочной информации двумя способами:

1) error_log   file   debug;

error_log можно задать на глобальном уровне, на уровне http, server и location.
Поэтому можно задать отладку только на определённом location, а для всего
остального вести лог, например, на уровне notice.

2) В разделе events {} записать ip-адреса, для которых нужно вести
отладочный лог:

events {
    ...
    debug_connection  192.168.10.1;
    debug_connection  192.168.10.5;
    ...
}

В этом случае отладка будет вестись только для указанных адресов во всех
возможных error_log'ах, независимо от того, какой уровень лога задан.


Кстати, еще об отладке. В nginx есть несколько мест, где в принципе
могут возникнуть ошибки. В этом случае в лог пишется alert. Например,
alert, содержащий фразу "zero buf size". Такие alert'ы говорят о том,
что в nginx есть ошибка и её неплохо бы исправить. Для таких случаев
в основном разделе предусмотрена директива

debug_points  [abort|stop];

По умолчанию debug_points выключены. abort вызывает в таких cтранных
местах корку по сигналу ABORT, а stop останавливает процесс сигналом STOP и
к нему можно подключиться отладчиком. В принципе, мне достаточно abort,
и этот вариант безопаснее, так как в случае abort основной процесс
запустит новый рабочий процесс, а в случае stop - нет, и может случиться
ситуация, когда все рабочие процессы будут остановлены и обрабатывать
запросы будет некому.

Для исследования корки нужно, чтобы nginx был собран с отладочной информацией.
Это не то же самое, что и --with-debug. Если собирать nginx руками, то
отладочная информация добавляется всегда, однако, если nginx установлен,
например, из портов FreeBSD, то там она удаляется при установке командой
install ... -s.


Игорь Сысоев
http://sysoev.ru





More information about the nginx-ru mailing list