Медленная авторизация Apache DBD

Вопрос или проблема

Я пытаюсь решить проблемы с производительностью в Apache.
Загрузка веб-страницы происходит быстро, пока она не защищена авторизацией через базу данных. См. эту картинку для сравнения между статическими/динамическими страницами и публичными/защищенными страницами.

Если я вызываю тот же запрос, используя PHP mysqli, выборка происходит очень быстро… Это говорит мне о том, что проблема не в самом запросе или в подключении к базе данных, а в Apache или его модуле/драйвере DBD.

Хост-машина: экземпляр Amazon EC2
Операционная система: Amazon Linux 2023
База данных: MariaDB - локально или с использованием Amazon RDS, такие же проблемы

На сервере в продакшене используется аутентификация через форму вместе с другими конфигурациями, но для тестирования я использую машину с стандартной конфигурацией Apache, за исключением следующего, чтобы воспроизвести проблему в более простом контексте:

LoadModule dbd_module modules/mod_dbd.so
LoadModule authn_dbd_module modules/mod_authn_dbd.so

<IfModule dbd_module>
    DBDriver mysql
    DBDParams host=[localhost/127.0.0.1/AWS_RDS-DNS],port=[port],dbname=[dbname],user=[username],pass=[password]
</IfModule>

<Directory "/var/www/html/static_private">
    AuthType Basic
    AuthBasicProvider dbd
    AuthName "Restricted area"
    AuthDBDUserPWQuery [любой запрос приводит к той же проблеме с производительностью]
    Require valid-user
</Directory>

Я установил драйвер mysql для DBD, используя sudo dnf install apr-util-mysql
Многократное обновление частных страниц вызывает резкий скачок нагрузки на ЦП до 100%, в то время как для публичных страниц ЦП стабильна около 0-1%.
Спасибо!

Ответ или решение

Замедленная авторизация DBD в Apache – это распространенная проблема, с которой сталкиваются многие администраторы серверов веб-приложений. В данном случае вы описываете ситуацию, когда загрузка страницы происходит быстро, пока она не защищена с помощью авторизации на основе базы данных. Анализ ситуации показывает, что проблема, скорее всего, кроется не в самом запросе или подключении к базе данных, поскольку при вызове того же запроса с помощью PHP mysqli данные извлекаются молниеносно. Это указывает на то, что основная проблема, вероятно, находится в области Apache или его модуле/драйвере DBD.

Теория

Для начала важно понимать, как работает модуль DBD и почему он может быть причиной замедления. Apache модуль DBD (Database Driver) используется для взаимодействия с базой данных и предоставляет интерфейс для выполнения SQL-запросов. Когда используется авторизация на основе DBD, движок выполняет данные SQL-запросы для аутентификации пользователя. Этот процесс включает в себя как соединение с базой данных, так и выполнение самого запроса.

Потенциальные факторы, вызывающие замедление:

  1. Переподключение к базе данных: Каждый запрос на авторизацию может порождать новое соединение с базой данных, особенно, если не используется пул соединений.

  2. Отсутствие кэширования: Запросы к базе данных могут быть не оптимизированы для кэширования результатов. Если повторные запросы идентичны, а система не кэширует результаты прошлых запросов, то это неизбежно приведет к дополнительному времени на выполнение.

  3. Проблемы конфигурации: Использование неправильных параметров конфигурации, таких как неправильно указанный драйвер или параметры подключения, может вызвать дополнительные накладные расходы.

Пример

В представленной вами ситуации, для простоты, использовалась стандартная конфигурация Apache с некоторыми дополнительными изменениями для репликации проблемы. Проблема проявляется в том, что при обновлении защищенных страниц процессор резко увеличивает свою загрузку до 100%, в то время как публичные страницы остаются относительно ненагруженными. Это типично для ситуаций, когда каждое действие пользователя требует нового соединения и выполнения запроса, и если такие операции не оптимизированы, это может оказать значительное воздействие на производительность.

Применение

На практике необходимо предпринять ряд шагов для устранения проблемы замедления:

  1. Использование пул соединений: Включите и настройте пул соединений, чтобы повторно использовать существующие подключения к базе данных, вместо создания новых для каждого запроса авторизации. Это позволит существенно снизить нагрузку на CPU и упростить взаимодействие с базой данных.

  2. Оптимизация конфигурации Apache:

    • Проверьте параметры DBDParams, чтобы убедиться, что используется правильный хост, порт, имя пользователя и пароль.
    • Определите, поддерживает ли подключаемый драйвер pooling, и если да, включите его.
  3. Кэширование результатов запросов: Внедрите кэширование для частых запросов аутентификации. Это может быть реализовано как на стороне Apache, так и на стороне базы данных.

  4. Профилирование и диагностика: Используйте инструменты профилирования для диагностики скорости выполнения каждого этапа процесса аутентификации. Это поможет выявить конкретные узлы, замедляющие работу.

  5. Обновление программного обеспечения: Убедитесь, что все установленные модули и сервер являются последними стабильными версиями. Обновления могут содержать важные улучшения производительности и исправления ошибок.

Применение вышеупомянутых действий поможет значительно улучшить производительность вашего сервера при авторизации через DBD в Apache. Однако, следует помнить, что каждая среда уникальна, и может потребоваться адаптация решений под специфические условия и архитектуру вашего приложения и сервера.

Оцените материал
Добавить комментарий

Капча загружается...