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

98% использование процессора на сервере ubuntu под управлением apache, сайт не отвечает

Я запускаю сервер с apache2 в ящике ubuntu. Это пул для майнинга криптовалют. Все шло нормально даже при большом потоке людей, заходящих на наш сайт. Тогда из ниоткуда использование ЦП на всех 8 ядрах составляет от 98 до 100%.

Я использую обратный прокси-сервер перед сервером, чтобы помочь смягчить DDOS-атаки, но с этим я никогда раньше не сталкивался.

netstat -an | grep: 80 | grep SYN | wc -l дает результат 100+, пока это происходит.

Убийство apache немедленно снижает нагрузку до нормального уровня и позволяет моим клиентам продолжать использовать другие службы на сервере. Но нам нужно, чтобы наш интерфейс работал.

Я пробовал несколько правил iptables, но они не работают. Я изменил свой sysctl в соответствии с некоторыми предложениями:

net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.conf.all.accept_redirects = 0
net.ipv6.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.all.accept_source_route = 0
net.ipv6.conf.all.accept_source_route = 0
net.core.wmem_max = 16777216
net.core.rmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.tcp_mem = 128000 200000 262144
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_synack_retries = 1
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_max_tw_buckets = 1800000
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_tw_recycle = 1
vm.swappiness = 5
net.ipv4.tcp_syncookies = 1

но это, похоже, не решает проблемы.

Я в своем уме, и мне нужно, чтобы веб-сайт снова заработал.

ЛЮБЫЕ и все предложения будут оценены.

Спасибо.

Ваш вопрос слишком общий для "ответа", но у меня есть несколько предложений:

Первый, используйте файл hosts.deny, чтобы разрешить только хороших парней или исключить выбранных плохих парней. Не забудьте поместить свои локальные сети в файл hosts.allow, который имеет приоритет. Вы можете найти плохих парней в своем журнале Apache или сделав это (настоящий пример из сегодняшнего журнала)

# BADGUYS=(`grep "authentication failure.*rhost=" /var/log/auth.log | \
    sed 's/.*rhost=\(\S*\).*/\1/' | \
    sort -u`)
# echo ${BADGUYS[0]}
109.228.29.199

а теперь заблокируйте их

# for GUY in ${BADGUYS[*]}; do
> echo "ALL: $GUY" >> /etc/hosts.deny
> done

Это может достаточно помочь, чтобы все работало, пока вы выбираете лучший протокол межсетевого экрана. Отказ от ответственности: Приведенный выше фрагмент является образцом, а не полным обсуждением или решением. В представленном виде он, вероятно, заблокирует некоторых законных пользователей, у которых только что возникли проблемы с вводом пароля, поэтому проверьте результаты. Вот почему вы хотите, чтобы ваши локальные сети были hosts.allow.

Второй, установить DenyHosts или fail2ban, которые делают это автоматически. У меня больше опыта работы с DenyHosts, но, похоже, он теряет популярность. Он нацелен на хосты, которые атакуют вашу службу ssh, но может блокировать все службы.

Третий, решите проблему с правилами iptables. Ubuntu не загружает (или не загружает) правила по умолчанию, но есть несколько способов сделать их постоянными. Проверьте iptables-persistent пакет.

Вы можете найти количество 10 лучших (или другое число) текущих TCP-соединений на IP-адрес с помощью netstat -tan| grep -v 'LISTEN'| awk '{print $5}'| grep -v 'and' |grep -v 'Address' |cut -d':' -f1 |sort -n | uniq -c | sort -rn | head -n10

А также 10 лучших IP-адресов в файлах журнала Apache с cd /var/log/apache2; for i in ./access.log*; do echo $i; cat $i | awk '{print $1}'| sort -n | uniq -c | sort -rn | head -n10; done

Как только вы определите оскорбительные IP-адреса, вы можете заблокировать их с помощью iptables -A INPUT -s 1.2.3.4 -j DROP.

Вы также можете ограничить скорость соединений с помощью iptables, например, если вы не хотите более 20 соединений в минуту от источника:

iptables -I INPUT -p tcp --dport 80 -m state --state NEW -m recent --set

iptables -I INPUT -p tcp --dport 80 -m state --state NEW -m recent --update --seconds 60 --hitcount 20 -j DROP