Задать вопрос

DDoS — как уменьшить нагрузку на php?

Задача


Недавно спрашивал о настройке кеша на php. Нужно это было, чтоб уменьшить нагрузку на MySQL, т.к. идет DDoS на сайте (по 40к коннектов за раз).

На скорую руку сделал этот кэш. При первом заходе на страничку c ID = 1500 — берет её из БД, кидает копию страницы на хард под именем 1500.html. Сверху в коде стоит проверка — если существует файл 1500.html, делает

include('cache/ID.html');
die();


Нагрузка на MySQL дейтвительно упала, но теперь в топе куча процессов php-cgi с большим процентом нагрузки. Соответственно, сайт лежит.

P.S. Фильтрами на уровне ОС от ддос отбиться не получается. Какой-то там хитрый ддос.

Вопрос


Я так понимаю, php парсит index.php и отсюда идет нагрузка. Может я как-то не так разместил проверку на существование файла 1500.html?

Как лучше сделать, чтоб при наличии кеша странички на харде была минимальная нагрузка на php?
  • Вопрос задан
  • 3517 просмотров
Подписаться 6 Оценить 1 комментарий
Пригласить эксперта
Ответы на вопрос 10
homm
@homm
На помощь, как всегда приходит nginx:
sysoev.ru/nginx/docs/http/ngx_http_core_module.html#try_files
Ответ написан
homm
@homm
1) У вас вобще nginx установлен, или статику апачь отдает?
2) include() интерпретирует ваш cache/ID.html, поэтому его нужно заменить на readfile.
3) Если nginx такие установлен, readfile тоже не айс, используйте заголовок X-Accel-Redirect для передачи nginx ссылки на файл, который ему нужно будет отдать.

Но судя по тому, что у вас CGI, nginx всетаки не стоит. Так что первое, что нужно было сделать — перевести php на нормальный протокол. Если есть возможность — FastCGI, если нет, на Apache+mod_php.
Ответ написан
Комментировать
kozyabozya
@kozyabozya
а зачем вам заботиться за посещамостью топиков под ДДОСом?
Ответ написан
@Ajex
Достаточно простой и действенный и универсальный метод — в коде html устанавливаете яваскриптом любую куку. В index.php в самом начале добавляете банальный код

if (!isset($_COOKIE['mycookie'])) {exit;}

как вариант можете в добавок к exit добавить функцию добавления ипа в черный список фаерволла(можно временный через ipset), в случае если кто-то пришел не через куку.
Правда нужно немного переделать структуру сайта так, чтобы первый раз пользователь заходил на хтмл страницу, которая будет ставить куку, а уж потом по ссылке на пхп.
Если это невозможно, тогда как-то так:

if (!isset($_COOKIE['mycookie']))
{
setcookie('mycookie','some_cookie_text',time()+60*60*24*300,"/",".адрессайта.домен");
echo 'Для входа на сайт перейдите по ссылке';
exit;
}

в таком случае все новые пользователи будут видеть ссылку «Для входа на сайт перейдите по ссылке», а после ее нажатия получать куку и заходить на сайт.
Ответ написан
MpaK999
@MpaK999
Буду!
Первое это позаботьтесь, чтобы слезть с php-cgi — это ужасно!
Apache + mod_php настроить просто и производительность возрастёт.
Второе, поставьте eAccelerator, увеличит от 2-10 раз скорость php так как не надо будет постоянно пересобирать в опкод.

Ну и DDoS надо файрволом закрывать, или хотя бы iptables просмотрев диапазоны ip адресов
Ответ написан
Комментировать
Ещё в прошлом вопросе хотел вам сказать, что раз вызывается php в принципе, то это уже не статика. Но сходу не смог придумать учёта посещаемости каждого топика, кроме как через периодический парсинг логов.
Ответ написан
Bkmz
@Bkmz
Не зря я сегодня написал: http://bkmz.org/425/zashtita-ot-ddos-iptables
Ответ написан
Комментировать
Riateche
@Riateche
«include('cache/ID.html');» — дурацкая идея, нормальное чтение файла и его вывод будет лучше. А еще лучше хранить эту страницу в памяти, а не в файле.
Ответ написан
AmdY
@AmdY
PHP и прочие вебштучки
это всё левак.
у вас две проблемы:
1. ddos — с ней борются не программисты в php, а в том же iptables админы, они лучше нас должны это зхнать.
2. оптимизация с кэшированием в файл идея хорошая, но её основная идея — не поднимать apache + php. если уж поднялась эта тяжёлая связка, то оптимизация будет относительно спичечная. вам нужно одно правило в реврайте
ReqriteCond /var/www/.../%{REQUEST_FILENAME} !-f
RewriteRule ^(.*).html create_cache.php?id=$1
собстенно проверяется существование файла, в случае его отсутствия будете генерировать, в случае наличия отдастся просто, легко и очень быстро обычный html
Ответ написан
Комментировать
Посмотрите, пожалуйста, доклад про Varnish + Redis + JavaScript в Новосибирске на Devpoint 2. Я там рассказывал как побеждали такую проблему малыми ресурсами, может поможет…
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы