Причин низкой производительности вашего сайта может быть много, одной из них может быть то, что Apache не справляется с нагрузкой. Ниже вы найдете готовые к использованию конфигурации для повышения производительности Apache с помощью модуля Apache MPM prefork.
Для этого просто включите приведенные ниже строки в конфигурационный файл httpd.conf apache:
1 2 3 4 5 6 7 8 9 10 | <ifmodule mpm_prefork_module=""> StartServers 2 MinSpareServers 2 MaxSpareServers 5 MaxClients 200 #должны быть настроены ServerLimit 200 #должны быть настроены MaxRequestsPerChild 100 </ifmodule> KeepAlive Off |
Некоторые пояснения приведены здесь:
StartServers - это сколько экземпляров apache должно запускаться в самом начале при запуске apache. Значение 2 работает нормально.
MinSpareServers - минимальное количество резервных серверов, которые должны быть запущены в ожидании потенциальных запросов. MinSpareServers=2 тоже работает нормально.
MaxSpareServers - максимальное количество запасных серверов, которые должны работать в ожидании потенциальных запросов, очевидно >= MinSpareServers. В моем рабочем примере MaxSpareServers=5.
MaxClients & ServerLimit. Вы можете использовать этот сценарий оболочки для определения среднего объема памяти, потребляемой одним процессом Apache. Кроме того, он покажет общее количество памяти, потребляемое всеми процессами Apache.
Debian\Ubuntu
1 | ps -ylC apache2 | awk '{x += $8;y += 1} END {print "Apache Memory Usage (MB): "x/1024; print "Average Proccess Size (MB): "x/((y-1)*1024)}' |
1 | ps -ylC httpd | awk '{x += $8;y += 1} END {print "Apache Memory Usage (MB): "x/1024; print "Average Proccess Size (MB): "x/((y-1)*1024)}' |
Вывод будет выглядеть примерно так:
1 2 | Apache Memory Usage (MB): 1372.6 Average Proccess Size (MB): 54.9041 |
Попробуйте выполнить это несколько раз, чтобы сравнить цифры; хорошие результаты будут показаны, когда сервер находится под большой нагрузкой. Теперь, когда вы знаете средний объем памяти, потребляемой Apache, и общий объем памяти вашего сервера, можно рассчитать значение, которое будет использоваться для настройки MaxClients.
Например, если в среднем один ваш процесс Apache потребляет 50MB RAM, а оперативная память сервера составляет 2GB, и вы хотите оставить 512MB для остальных процессов, то:
MaxClients = (2GB - 512MB)/50MB = 30.72 ~ 30.
ServerLimit - это то же самое, но в то время как значение MaxClient может быть изменено на ходу без необходимости перезапуска Apache, для того, чтобы новое значение ServerLimit вступило в силу, требуется перезапуск Apache. MaxClients всегда должно быть <= ServerLimit. Чтобы упростить задачу, я установил ServerLimit = MaxClients, рассчитанное по приведенной выше формуле.
По умолчанию MaxRequestsPerChild = 0, что означает, что процесс httpd никогда не завершится. Однако может случиться так, что в ваших PHP-скриптах произойдет утечка памяти (особенно если вы используете много сторонних модулей). Чтобы защитить себя от случайных утечек памяти, вы можете установить, сколько запросов должно быть обработано процессом Apache перед его завершением. В моем примере я использовал MaxRequestsPerChild = 100, и все работало нормально. Вы можете поэкспериментировать, чтобы найти значение, которое подходит вам больше.
Описание директивы KeepAlive довольно простое для сайта Apache. Если KeepAlive включена, это позволяет отправлять несколько запросов через одно TCP-соединение, что может увеличить производительность сайта до 50% для некоторых сайтов. В основном это работает для страниц с большим количеством изображений. Однако это может привести к ситуации, когда процессы никогда не умирают, что может сильно нагрузить сервер. Вместо этого можно использовать прокси-сервер для обслуживания изображений и другого статического контента.