заблокировать неверный запрос сервера, используя минимальные накладные расходы сервера

Наш веб-сервер иногда получает множество запросов на файл (сервер обмена), которого нет на нашем веб-сервере (apache):

автообнаружение/autodiscover.xml

Как я могу отвечать на эти запросы так, чтобы нагрузка на наш сервер была минимальной?

(Когда эти запросы происходят, использование памяти VPS резко возрастает и превышает выделение ОЗУ.)

Я хочу, чтобы сервер отвечал с наименьшими накладными расходами, говоря им, чтобы они ушли; этого файла здесь нет; остановка; плохой запрос (вы поняли.)

Прямо сейчас сервер возвращает страницу с ошибкой 404, что означает, что наша установка WordPress вызвана. Он возвращает нашу пользовательскую страницу ошибки 404 WordPress. Это связано с большими накладными расходами, которых я хотел бы избежать.

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

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

Я поместил это в наш файл htaccess, но он не делает то, что я хочу:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^autodiscover/autodiscover.xml$ "-" [forbidden,last]
</IfModule>

Что-то не так с этим правилом?

Могу ли я или должен использовать наш файл htaccess по-другому, чтобы делать то, что я хочу? Есть ли лучший способ сделать это, чем использовать htaccess? Можем ли мы вернуть что-то другое, кроме ответа 404? Возможно, ответ 400 или 403? Как бы мы это сделали? Мы находимся на сервере VPS, к которому у меня нет прямого доступа.


person hommealone    schedule 20.11.2017    source источник
comment
Я также не понимаю, почему он возвращает страницу 404. Поскольку RewriteRule использует запрещенный флаг, не должен ли он возвращать ответ 403? Означает ли это, что правило написано неправильно и не применяется, или что-то еще в файле htaccess переопределяет это? (После этого в файле находится стандартный код WordPress mod_rewrite.)   -  person hommealone    schedule 22.11.2017
comment
Хотя у меня пока нет возможности блокировать запросы до того, как они попадут в Apache, я все же хотел бы попытаться блокировать их до того, как они разожгут WordPress. Я пробовал следующие варианты: ` ‹IfModule mod_rewrite.c› RewriteEngine On RewriteRule ^autodiscover/autodiscover.xml$ - [запрещено,последнее] ‹/IfModule› ` (без кавычек на дефисе), а также это: ` ‹IfModule mod_rewrite .c› RewriteEngine On RewriteRule ^autodiscover/autodiscover.xml$ - [запрещено,последнее] ‹/IfModule› `   -  person hommealone    schedule 27.11.2017
comment
Извиняюсь! Я превысил время редактирования комментария! Хотя у меня пока нет возможности блокировать запросы до того, как они попадут в Apache, я все же хотел бы попытаться блокировать их до того, как они разожгут WordPress. Я пробовал следующие варианты: ` ‹IfModule mod_rewrite.c› RewriteEngine On RewriteRule ^autodiscover/autodiscover.xml$ - [F,L] ‹/IfModule› ` (без кавычек на дефисе), а также это: ` ‹IfModule mod_rewrite .c› RewriteEngine On RewriteBase / RewriteRule ^autodiscover/autodiscover.xml$ — [F,L] ‹/IfModule› ` Но WordPress по-прежнему срабатывает с пользовательской страницей ошибки 404 нашей темы.   -  person hommealone    schedule 27.11.2017
comment
Я также пытался создать каталог автообнаружения и поместить туда файл htaccess со строками mod_rewrite (и используя только ^autodiscover.xml$ в качестве моего регулярного выражения), но даже с этим я все еще получаю WordPress с нашей страницей 404, когда я делаю запрос. Кто-нибудь может объяснить, почему все эти попытки использования перезаписи htaccess не работают?   -  person hommealone    schedule 27.11.2017


Ответы (2)


«Нет прямого доступа» означает, что вы не можете установить программное обеспечение?

Я настоятельно рекомендую настроить nginx в качестве обратного прокси-сервера, но если об этом не может быть и речи из-за отсутствия локального администратора: используйте такой сервис, как CloudFlare, и используйте правила страницы (которые запускают для вас обратный прокси-сервер и многое другое).

Вы не хотите, чтобы что-то ненужное достигало apache, если вы запускаете mpm перед разветвлением (что вы, вероятно, делаете из-за mod_php), поскольку он будет порождать множество процессов для обработки параллельных клиентов, и он относительно медленно запускается. Кроме того, как только шторм закончится, они снова будут убиты (в зависимости от ваших настроек для MaxSpareServers).

Что касается MaxSpareServers и способа, по крайней мере, сдержать ущерб, который это наносит:

ЕСЛИ (а может, и нет) вы запускаете mpm_prefork от apache (MPM = многопроцессорные модули, в основном то, что использует «движок» apache; большинство настроек PHP с mod_php запускают mpm_prefork), apache нужен дочерний элемент для обработки каждого параллельного запроса.

Теперь, когда одновременно поступает 100 запросов, apache создаст 100 (или меньше, если MaxRequestWorkers установлено ниже 100) дочерних процессов для их обработки. Это ОЧЕНЬ дорого, потому что каждый из этих обработанных файлов должен запускаться и будет занимать память) и может привести к отказу в работе сервера во всех смыслах и целях, поскольку ваш VPS начинает переключаться и все замедляется.

Как только этот шторм запросов закончится, apache останется со 100 дочерними процессами и начнет удалять некоторые из них, пока не достигнет того, что было установлено как MaxSpareServers. Если запасных серверов нет, новые запросы должны будут ждать в очереди, пока дочерний процесс не обработает их. Для пользователей это в основном «сервер не отвечает».

Если вы не можете поставить что-то перед apache, можете ли вы изменить (или попросить кого-нибудь изменить) конфигурацию apache? У вас будет некоторый успех, если вы ограничите MaxRequestWorkers, то есть максимальное количество дочерних apache, которые могут появиться (и, следовательно, максимальное количество параллельных запросов, которые могут быть обработаны). Если вы это сделаете, сервер по-прежнему будет казаться невосприимчивым во время высокой нагрузки, но это не повлияет на систему так сильно, так как ваши процессы не начнут использовать SWAP вместо ОЗУ и станут ужасно медленными.

person janh    schedule 20.11.2017
comment
Правильно, не могу настроить nginx, потому что мы не можем установить программное обеспечение. Cloudflare для предотвращения этих запросов до того, как они попадут на наш сервер, несомненно, тоже хорошая идея, но это также может быть невозможно. Извините, но ваше объяснение о MaxSpareServers выше моего понимания. - person hommealone; 22.11.2017
comment
Это было слишком долго для комментария, поэтому я отредактировал свой ответ, добавив дополнительную информацию о том, как работает префорк mpm в apache и какую роль играет MaxSpareServers. - person janh; 22.11.2017
comment
Большое спасибо за это подробное объяснение. Могу ли я определить, запускает ли наш VPS mpm_prefork от apache, например, с помощью php phpinfo()? - person hommealone; 23.11.2017
comment
Да. Раздел «Загруженные модули» в phpinfo() будет содержать prefork. - person janh; 23.11.2017
comment
Похоже, у нас нет модуля prefork. Существуют ли другие альтернативные модули, которые делают подобные вещи, которые мы могли бы использовать вместо них? - person hommealone; 27.11.2017
comment
Возможно. Какой модуль вы запускаете? Вы вообще запускаете apache (вам не обязательно)? - person janh; 27.11.2017
comment
Да, мы используем Apache. Когда я ищу вывод phpinfo(), я не нахожу ссылки на prefork. Я гуглил другие альтернативные модули, но также не нашел ссылок на worker, event или ITK. - person hommealone; 28.11.2017

Любая попытка запретить доступ к файлу, будь то с помощью запрета или запретного флага [F], приводит к тому, что WordPress срабатывает и отвечает страницей с ошибкой 404.

Чтобы избежать этого, я создал пользовательскую страницу ошибки 421 (которая показалась наиболее подходящей), поместил ее за пределы каталога WordPress и использовал перенаправление htaccess с имени файла плохого запроса на пользовательскую страницу ошибки.

Redirect /autodiscover/autodiscover.xml /path/to/error-421-autodiscover-xml.php

Это возвращает пользовательскую страницу ошибки (всего 1 КБ) без вызова WordPress. Создание пользовательской страницы ошибок, относящейся к одному файлу с файлом плохого запроса в имени файла кода ошибки, должно помочь идентифицировать эти вызовы в наших файлах журнала.

Если вы использовали сервер Exchange в другом месте для электронной почты, то может быть уместно перенаправить с веб-сервера на сервер Exhange с помощью htacess на веб-сервере. Подходящим правилом htaccess может быть:

RedirectMatch 302 (?i)^/autodiscover/(.*)$ https://mail.example.com/autodiscover/$1

См.: https://glennmatthys.wordpress.com/2013/10/14/redirect-autodiscover-urls-using-htaccess/

@janh, безусловно, прав в том, что механизм перехвата запроса еще до того, как он попадет на наш сервер Apache, был бы идеальным, но это выходит за рамки того, что мы можем сделать прямо сейчас.

(Похоже, файл /autodiscover/autodiscover.xml используется серверами Exchange для перенаправления трафика на почтовый сервер. По данным нашей веб-хостинговой компании, серверы Apache нередко получают запросы на этот файл. Некоторые из эти запросы могут исходить от вредоносных ботов, ищущих доступ к почтовому серверу; некоторые могут исходить от неправильно настроенных почтовых клиентов смартфонов или других неверных запросов, предназначенных для сервера Exchange.)

person hommealone    schedule 04.12.2017