Назад | Перейти на главную страницу

Влияют ли настройки Apache + mod_wsgi httpd.conf для django на mysql?

У меня есть сайт django, использующий Apache и mod_wsgi. С последних 4-5 дней я продолжаю получать этот тип ошибки по электронной почте администратора.

OperationalError: (1040, 'Too many connections')

Я установил django-debug-toolbar, и у меня в среднем 100–150 запросов для каждой страницы и время отклика менее 300 мс. Не думаю, что перегружаю свой MySql-сервер. С другой стороны, это произошло через некоторое время после того, как я попытался перенастроить свой httpd.conf настройки.

Мой сайт получает 800-1000 посещений в день.

Это мои httpd.conf настройки

KeepAlive Off
Listen 13646
MaxSpareThreads 15
MinSpareThreads 8
MaxClients 20
ServerLimit 20
SetEnvIf X-Forwarded-SSL on HTTPS=1
ThreadsPerChild 5
MaxRequestsPerChild 1000000
StartServers 20
WSGIDaemonProcess <project> processes=7 threads=12 python-path=<path>
WSGIProcessGroup <project>
WSGIRestrictEmbedded off
WSGILazyInitialization On

Любая помощь будет принята с благодарностью.

PS. Я использую общий хостинг. У меня есть 512 МБ ОЗУ для моего хостинг-плана. 300 МБ из них бесплатны.

Несколько комментариев о вашей конфигурации.

  1. MaxSpareThreads и MinSpareThreads действительно должны быть кратными ThreadsPerChild. Если это не так, с некоторыми комбинациями значений вы можете заставить Apache циклически переключаться между созданием новых процессов, потому что он думает, что они ему нужны, и затем решает в следующий момент убить их снова, потому что затем он передумает и считает их избыточными. Итак, измените MinSpareThreads на 5.

  2. MaxClients утверждает, что может иметь не более 20 одновременных запросов через все дочерние рабочие процессы Apache. Тем не менее, процессы демона mod_wsgi, которым они проксируют, могут обрабатывать 7 * 12 = 84. Таким образом, у вас слишком много ресурсов для процесса / потоков демона, потому что дочерние рабочие процессы Apache никогда не смогут обрабатывать более 20 запросов одновременно. Лучшая конфигурация, использующая меньше памяти, - это процессы = 4 и потоки = 5.

  3. StartServers, установленный на 20, является слишком высоким, если вы действительно используете рабочий MPM. Технически StartServers не может быть больше, чем MaxClients / ThreadsPerChild для рабочего MPM. Итак, установите StartServers на 2.

  4. MaxRequestsPerChild устанавливается произвольно высоким, и с учетом пропускной способности вашего запроса вы также можете установить для него нормальное значение по умолчанию, равное 0, что означает сохранение процессов, а не их повторное использование при некотором максимальном количестве запросов. Поскольку веб-приложение Python работает в режиме демона mod_wsgi, в любом случае не должно быть необходимости повторно использовать дочерний рабочий процесс Apache.

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