ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: nginx-ru
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




 




Copyright © Lexa Software, 1996-2009.