Назад | Перейти на главную страницу

Слишком много УСТАНОВЛЕННЫХ соединений с одного IP-адреса в Apache

netstat -ntp |grep 80 показывает слишком много ESTABLISHED подключение с одного IP-адреса. Вокруг 300 из них, и это не атака и пользователь использует соединение 2G для доступа к Apache. То же самое и с другими соединениями 2G. В результате этого у Apache заканчиваются дети.

Раньше показывалось слишком много close_wait и после включения tcp_tw_reuse и tcp_tw-recycle есть не так много close_wait но количество ESTABLISHED связи увеличились.

Мы используем Ubuntu 11.04 с оперативной памятью 48 ГБ

keepalive On
keepalive timeout 10
max clients 800
max-request-perchild 4000
timeout 300

Я установил syn_ack к 1 и syn_retries к 2.

По wifi такой проблемы нет. Соединения закрываются правильно, но с соединениями 2G в Apache заканчиваются дети и слишком много ESTABLISHED подключение.

также я пробовал установить тайм-аут от 300 до 30 по умолчанию, но поскольку наш проект - это хостинг изображений для мобильных телефонов, клиенты не могли правильно загружать изображения, так как у них часто случаются перерывы в работе. 408 сообщения, поэтому изменил его на значение по умолчанию 300

Проблема связана с низкоскоростными клиентами. Лучший способ решить эту проблему - использовать решение обратного прокси, например. nginx, varnish или подобное программное обеспечение, если из вашего apache. Хороший обратный прокси-сервер может без проблем обрабатывать тысячи подключений.

Почему стоит установить Nginx в качестве обратного прокси?

tcp_tw_reuse и tcp_tw-recycle и tcp-fin_timeout до 30

Здесь помогает тайм-аут плавника, но повторное использование и повторное использование? Зачем?

время ожидания поддержки активности 10

Это просто глупо. Даже при коммутируемом доступе это должно быть 3 или меньше.

тайм-аут 300

Вы знаете, что это значит? Это может быть значение по умолчанию, но оно снова слишком велико.

Вы можете попробовать захватить часть трафика с помощью wirehark, чтобы точно узнать, почему соединения не закрываются.

Использует параметр mod_reqtimeout

Только в том случае, если клиент очень сильно сломан, и вы не беспокоитесь о предоставлении ему услуг.

мы должны перейти на сервер ngnix

Он, безусловно, будет намного легче обрабатывать медленные соединения, однако вы можете использовать его в качестве прокси (и вы можете выборочно / прозрачно маршрутизировать определенные подсети через это, используя iptables)

Вы пробовали отбросить Timeout директива к чему-то гораздо более низкому, например 10 или 5?

В качестве альтернативы вы можете попробовать отказаться от предварительного форка MPM (если возможно) и использовать модель, управляемую событиями, такую ​​как событие MPM в Apache 2.4 или другой веб-сервер, такой как nginx.

Вы также можете использовать nginx (или аналогичный) в качестве обратного прокси перед Apache. Прокси-сервер будет ждать, пока он не получит весь запрос, прежде чем отправлять восходящий запрос к Apache. Тогда у этого запроса не будет задержек в середине.

Проблема с исчерпанием детей Apache также может быть вызвана или усугублена Keepalive настройки у вас есть. Попробуйте выключить это или понизить keepalive timeout стоимость. Слишком низкое значение, конечно, может сделать его бесполезным.