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