Nginx-ru mailing list archive (nginx-ru@sysoev.ru)
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: ошибка в nginx ?
On Friday, July 11, 2008 at 8:22:54, Igor Sysoev wrote:
>> IS> В чём причина EAGAIN
>> насколько удалось понять из исходников ядра Linux,
>> http://lxr.linux.no/linux/net/unix/af_unix.c#L1070
>> Linux всегда (2.2.6 - 2.6.25.10) возвращает EAGAIN
>> при неблокирующем коннекте и переполнении backlog.
1070 if (skb_queue_len(&other->sk_receive_queue) >
1071 other->sk_max_ack_backlog) {
1072 err = -EAGAIN;
1073 if (!timeo)
1074 goto out_unlock;
>> IS> и что делать при его получении - непонятно.
>> http://www.issociate.de/board/post/456462/non-blocking_connect_and_EAGAIN.html
"unix_stream_connect() is immediately invoked by sys_connect()
that returns its result untouched to user space afterwards."
если в Linux вернули код ошибки EAGAIN - connect не установлен.
IS> Так что делать-то при получении EAGAIN ?
вопрос можно перефразировать по-другому:
"что делать при переполнении backlog`а?"
на мой взгляд, в этой ситуации лучше всего будет делать то же самое,
что и в других операционных системах при получении [ECONNREFUSED].
IS> Единственное, что можно делать:
IS> ждать секунду и повторять попытку до истечения ..._connect_timeout.
backlog обычно бывает переполнен при (очень) большой нагрузке,
это сделает веб-сервера под управлением nginx на операционной
системе с ядром Linux гораздо более уязвимыми к DDOS-атакам.
nginx будет ..._connect_timeout секунд держать tcp соединение
с клиентом, и будет раз в секунду пытаться установить соединение
с сервером при переполненном backlog`е - впустую растрачивая
системные ресурсы. и workaround к этой уязвимости неизвестен.
IS> Пока в следующей версии EAGAIN будет сразу писаться в лог.
это поможет с отладкой ситуации "somaxconn 128", но может быть
использовано для DDOS-атаки на сервер - сначала переполняется
backlog, потом error.log nginx`а начинает резко увеличиваться
и занимает все свободное место на разделе где лежат логи.
workaround - делать ротацию логов каждую минуту
=========================================================================================
On Wednesday, May 21, 2008 at 9:34:49, Volkov Oleg wrote:
>> VO> Сегодня nginx переполнил мне весь /var сообщениями в
>> VO> какой-нибудь-сайт-errors_log :
>> VO> 2008/05/20 11:57:07 [alert] 28859#0: accept() failed (24: Too many open
>> files)
>> VO> while accepting new connection on 0.0.0.0:80
>> Лучше под логи отдельный раздел делать. И переполнение не страшно и
>> можно как async монтировать и журналирование не нужно включать...
VO> /var на отдельном разделе (10 гиг), раздел был забит за пару часов. После
чего
VO> машина перестала нормально отдавать сайты. Произошло переключение на
VO> резервную машину, которую быстро постигла та же участь.
VO> В общем надо исправлять нгинкс, чтобы он так не хулиганил.
=========================================================================================
--
Best regards,
Gena
|