Автор Тема: Ошибки в работе форума, которые надо исправить Кузьмичу  (Прочитано 99100 раз)

0 Пользователей и 2 Гостей просматривают эту тему.

Оффлайн Small music tower

  • Ветеран форума
  • ******
  • Сообщений: 4129
  • я только учусь
я же говорю - ловушки.

Онлайн Kuzmitch

  • Администратор
  • *****
  • Сообщений: 3069
  • Пиши интересно, будь мужиком!
    • Twitter
Как ловушки помогут от того, что одновременно на сервер приходит 40.000 клиентов с разных IP-адресов? Ловушки нужны чтобы перенаправлять и запутывать сканеры, которые в лучшем случае ходят на сайты с одной подсети.

Оффлайн Small music tower

  • Ветеран форума
  • ******
  • Сообщений: 4129
  • я только учусь
После того, как сработала ловушка, нужно как-то временно отбрасывать пакеты с этого адреса.
Не обязательно на долго - минут на 5-10. Таким образом, они не смогут генерировать трафик.

Онлайн Kuzmitch

  • Администратор
  • *****
  • Сообщений: 3069
  • Пиши интересно, будь мужиком!
    • Twitter
Тут есть проблема - это разные IP-адреса, я проверял логи. С каждого адреса в сутки по 2-3 запроса. Они не повторяются.

Оффлайн Small music tower

  • Ветеран форума
  • ******
  • Сообщений: 4129
  • я только учусь
40 тысяч клтентов делают всего по 2-3 запроса в сутки. И поэтому сайт лежит часами?

Онлайн Kuzmitch

  • Администратор
  • *****
  • Сообщений: 3069
  • Пиши интересно, будь мужиком!
    • Twitter
Перечитай все что выше написано, я думаю, разберешься.

... и добавил:

Ладно, не разберешься. Подскажу:



На форум приходит 40000 адресов течение 15 минут, это можно свободно посмотреть внизу на главной странице форума, а скорее всего и больше, так как клиенты начинают отваливаться по таймауту из-за перегруженности сервера. Эта нагрузка может продолжаться часами - никакой rate limiter не поможет, потому что с одного адреса делается один запрос и дальше с этого IP тишина на длительный срок.
« Последнее редактирование: Мая 04, 2026, 20:25:52 от Kuzmitch »

Оффлайн Small music tower

  • Ветеран форума
  • ******
  • Сообщений: 4129
  • я только учусь
Ну значит нужно делать выбор в пользу зарегистрированных пользователей.
Например, когда нагрузка превысила 60% - разрешать доступ только зарегистрированным пользователям.
« Последнее редактирование: Мая 04, 2026, 20:33:58 от Small music tower »

Оффлайн Gaia

  • Завсегдатай
  • ***
  • Сообщений: 269
  • void()
Для определения, зарегистрирован ли пользователь, серверу придется делать дополнительную работу.
И, сюрприз, даже пообщаться с клиентом, ожидая от него ответов  ;D
 
Поэтому, какой порог не делай, при достаточном количестве запросов это все ляжет.

« Последнее редактирование: Мая 04, 2026, 22:22:11 от Gaia »

Оффлайн Small music tower

  • Ветеран форума
  • ******
  • Сообщений: 4129
  • я только учусь
Цитировать
smf 2.0.19 насколько много ресурсов нужно потратить, чтобы определить, что обращение идёт от анонимного пользователя

Для SMF 2.0.19 проверка того, является ли пользователь анонимным, — это одна из самых «дешевых» и быстрых операций. Ресурсов на это тратится ничтожно мало.Вот как это работает технически:Глобальная переменная: SMF при загрузке страницы всегда инициализирует массив $user_info.Проверка ID: Статус гостя определяется по значению $user_info['is_guest']. Если ID пользователя равен 0, движок считает его анонимным.Затраты: Это обычная проверка булевого значения или сравнение чисел в оперативной памяти. Процессор тратит на это доли микросекунды, так как данные уже подгружены из сессии или куки в начале выполнения скрипта.В коде это выглядит так:phpif ($user_info['is_guest']) {
   // Это аноним (гость)
}

... и добавил:

Итог: С точки зрения нагрузки на сервер, эта операция практически бесплатна. Вам не нужно делать дополнительные запросы к базе данных каждый раз, когда вы хотите это проверить, так как статус гостя кэшируется в памяти на время выполнения скрипта.Хотите узнать, как лучше всего ограничить функционал для таких пользователей без вреда для производительности?

... и добавил:

Цитировать
а можно ли сделать уже на уровне веб сервера, чтобы даже до движка не доходило

Да, это можно сделать на уровне веб-сервера (Nginx или Apache). Это позволит отсекать запросы от анонимов еще до того, как запустится PHP-интерпретатор и база данных, что значительно сэкономит ресурсы при бот-атаках.

... и добавил:

Цитировать
можно ограничить анонимов только при превышении нагрузки более 60%

Цитировать
Да, это технически возможно, но такая логика не является стандартной для веб-серверов «из коробки», так как Nginx или Apache обычно не следят за нагрузкой CPU в реальном времени для принятия решений по каждому запросу.Для реализации такой «умной» блокировки есть три основных пути:
1. Использование Nginx + Lua (OpenResty) — Самый эффективныйЭто профессиональный способ. Модуль lua-nginx-module позволяет выполнить небольшой скрипт прямо в процессе обработки запроса.Логика: Скрипт раз в несколько секунд читает /proc/loadavg, и если значение выше порога, ставит флаг. Если флаг стоит и у пользователя нет куки SMF — сервер отдает 503 или 403.Плюс: Практически нулевая нагрузка на систем
.2. Использование внешнего «предохранителя» (Bash-скрипт)Если вы не хотите ставить Lua, можно использовать обычный Bash-скрипт, который будет работать по крону (раз в минуту) или в цикле.Логика: Скрипт проверяет нагрузку. Если она > 60%, он подменяет один конфигурационный файл Nginx на другой (где включена блокировка анонимов) и делает nginx -s reload.Минус: Задержка в реакции (до 1 минуты) и лишние перезагрузки конфига.
3. На уровне PHP (SMF) — Самый простой в реализацииХотя вы хотели «до движка», иногда проще и безопаснее сделать это в самом начале index.php форума. Это все равно сэкономит ресурсы БД, так как проверка будет идти до тяжелых запросов.Пример кода для вставки в начало index.php:php$load = sys_getloadavg();
// Если средняя нагрузка за последнюю минуту > 2.0 (для 4-ядерного это ~50%)
// И пользователь — гость (куки нет)
if ($load[0] > 2.0 && empty($_COOKIE['SMFCookie11'])) {
    header('HTTP/1.1 503 Service Unavailable');
    die('Сервер перегружен. Пожалуйста, войдите в аккаунт или зайдите позже.');
}
« Последнее редактирование: Мая 04, 2026, 23:25:45 от Small music tower »

Онлайн Kuzmitch

  • Администратор
  • *****
  • Сообщений: 3069
  • Пиши интересно, будь мужиком!
    • Twitter
Пообщаться с нейронкой это конечно полезно, вот только у тебя ответ на второй вопрос противоречит первому, и ты этого даже не понимаешь. Поясню - тебе нейронка говорит, что запросы будут отсекаться до обращения к php и базе данных, при этом выше говорит, что для того чтобы определить анонимный ли пользователь, надо выполнить команду и заполнить переменные сессии SMF. Перестань тратить время на то, в чем не разбираешься.

Оффлайн Small music tower

  • Ветеран форума
  • ******
  • Сообщений: 4129
  • я только учусь
Ты анализировал какие именно страницы запрашиваются?
Страница логина тоже?
На нее проверку можно не делать и(или) ограничить количество попыток.

Ну а с другой стороны, если ты такой умный сам и помощь тебе не нужна, ну и ладно.  ;D

Онлайн Kuzmitch

  • Администратор
  • *****
  • Сообщений: 3069
  • Пиши интересно, будь мужиком!
    • Twitter
Ты анализировал какие именно страницы запрашиваются?
Страница логина тоже?
На нее проверку можно не делать и(или) ограничить количество попыток.

Ну а с другой стороны, если ты такой умный сам и помощь тебе не нужна, ну и ладно.  ;D

Нет, не страница логина. Просто открытые страницы форума, с разных тем. Я же пишу давно, что если бы там была понятная система я бы все давно уже решил. И да, я не просил помощи, и не собирался давать ни логи не детали - просто ставлю в известность, что есть проблемы и я делаю все возможное, чтобы их решить.