Я уже довольно давно использую сервер Ubuntu 14.04 со стандартным стеком LAMP и получаю от системы ежедневные отчеты о средней загрузке процессора по электронной почте. Долгое время это по большей части сообщало о времени простоя ЦП в 90-е годы (это слегка загруженный сервер).
Примерно месяц или около того назад, это изменилось, и теперь сервер сообщает о времени простоя больше 80-х, чем 90-х. top
показывает, что apache является потребителем большей части ЦП:
top - 00:20:43 up 39 days, 22:34, 1 user, load average: 0.34, 0.41, 0.39
Tasks: 165 total, 2 running, 163 sleeping, 0 stopped, 0 zombie
%Cpu(s): 10.0 us, 0.7 sy, 0.0 ni, 89.2 id, 0.1 wa, 0.0 hi, 0.1 si, 0.0 st
KiB Mem: 6110180 total, 5500892 used, 609288 free, 232448 buffers
KiB Swap: 0 total, 0 used, 0 free. 3502368 cached Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
16235 www-data 20 0 503848 77680 41564 S 8.3 1.3 0:04.28 apache2
16124 www-data 20 0 506624 86688 47888 S 8.0 1.4 0:06.23 apache2
16351 www-data 20 0 506456 79224 41364 S 7.3 1.3 0:01.54 apache2
16301 www-data 20 0 506356 78908 41156 S 7.0 1.3 0:02.93 apache2
16102 www-data 20 0 507116 87292 48272 S 6.6 1.4 0:06.88 apache2
1343 mysql 20 0 2670112 540216 8308 S 2.7 8.8 988:08.92 mysqld
16354 www-data 20 0 503248 76144 40636 S 1.3 1.2 0:01.29 apache2
16100 www-data 20 0 507016 80436 41524 S 1.0 1.3 0:07.12 apache2
Я немного почесал голову над этим, чтобы определить, какое изменение я мог сделать, чтобы вызвать это. Веб-трафик не увеличился в течение этого периода времени (на самом деле он был ниже, чем обычно), и я могу сидеть и смотреть apachetop
, не показывающий ничего особенного, в то время как вышеупомянутый верхний
вывод продолжается.
Я попытался применить все последние исправления этим вечером в надежде, что, возможно, в недавнем обновлении был внесен какой-то временный сбой и с тех пор он был устранен, но безрезультатно.
Затем мне пришло в голову, что это, возможно, было где-то рядом в те же сроки, в которые я установил mod_security на сервере. Я' С тех пор я запускал это в режиме наблюдения. Я отключил это сегодня вечером и перезапустил apache, но, похоже, это изменение не повлияло на нагрузку.
Кто-нибудь может подсказать, как я могу определить, чем занят apache? В настоящее время это не является серьезной проблемой, но я хотел бы понять это, прежде чем это станет одним!
Оказывается, какой-то индюк в Чили несколько раз в секунду опрашивал xmlrpc.php на сайте WordPress, за которым я не следил с помощью apachetop. Блокировка неправильного IP-адреса решила проблему!
На случай, если кто-то снова придет сюда посмотреть, я использовал mod_status, чтобы разобраться в этом. В частности, с установленным и включенным mod_status я включил путь / server-status на одном из моих виртуальных хостов следующим образом (заменив
текущим общедоступным IP-адресом моего клиентского ПК. ):
<VirtualHost *:443>
ServerName myhost.com
...
<Location /server-status>
SetHandler server-status
Require ip <my-current-ip>
</Location>
...
</VirtualHost>
затем посетил https://myhost.com/server-status
, чтобы получить полное представление о веб-трафике в системе. Это довольно быстро выявило основной объем трафика, поступающего в скрипт xmlrpc.php на рассматриваемом виртуальном хосте.
Оттуда я проследил журналы доступа для этого виртуального хоста и смог увидеть схему активности и исходный IP-адрес. Затем нужно было заблокировать IP-адрес с помощью ufw следующим образом:
sudo ufw insert 1 deny from <the-bad-ip>
Примечание: использование 'insert 1' в этой команде гарантирует, что оно применяется перед любыми правилами 'default allow' в конфигурации брандмауэра, например для портов 80 и 443, которые в остальном делают фильтр почти бесполезным, как шоколадный чайник!