Список вопросов
Как зайти в Даркнет?!
25th January, 01:11
5
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
893
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
912
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
905
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6085
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4350
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4395
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
DDoS — как уменьшить нагрузку на php?
Просмотров: 428
 
Ответов: 10
Задача
Недавно спрашивал о настройке кеша на 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?
die();
1) У вас вобще nginx установлен, или статику апачь отдает?
2) include() интерпретирует ваш cache/ID.html, поэтому его нужно заменить на readfile.
3) Если nginx такие установлен, readfile тоже не айс, используйте заголовок X-Accel-Redirect для передачи nginx ссылки на файл, который ему нужно будет отдать.
Но судя по тому, что у вас CGI, nginx всетаки не стоит. Так что первое, что нужно было сделать — перевести php на нормальный протокол. Если есть возможность — FastCGI, если нет, на Apache+mod_php.
Достаточно простой и действенный и универсальный метод — в коде 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;
}
в таком случае все новые пользователи будут видеть ссылку «Для входа на сайт перейдите по ссылке», а после ее нажатия получать куку и заходить на сайт.
{
setcookie('mycookie','some_cookie_text',time()+60*60*24*300,"/",".адрессайта.домен");
echo 'Для входа на сайт перейдите по ссылке';
exit;
}
Первое это позаботьтесь, чтобы слезть с php-cgi — это ужасно!
Apache + mod_php настроить просто и производительность возрастёт.
Второе, поставьте eAccelerator, увеличит от 2-10 раз скорость php так как не надо будет постоянно пересобирать в опкод.
Ну и DDoS надо файрволом закрывать, или хотя бы iptables просмотрев диапазоны ip адресов
это всё левак.
у вас две проблемы:
1. ddos — с ней борются не программисты в php, а в том же iptables админы, они лучше нас должны это зхнать.
2. оптимизация с кэшированием в файл идея хорошая, но её основная идея — не поднимать apache + php. если уж поднялась эта тяжёлая связка, то оптимизация будет относительно спичечная. вам нужно одно правило в реврайте
ReqriteCond /var/www/.../%{REQUEST_FILENAME} !-f
RewriteRule ^(.*).html create_cache.php?id=$1
собстенно проверяется существование файла, в случае его отсутствия будете генерировать, в случае наличия отдастся просто, легко и очень быстро обычный html
Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться