Наилучшим решением для устранения перечисленных проблем является создание двухуровневой системы Front-End + Back-End для обработки запросов.
Front-End – публичная часть проекта, обеспечивающая прием запросов от пользователей, трансляцию запросов к Back-End и выдачу непосредственного содержимого пользователю.
Back-End – исполнительная часть системы, которая обеспечивает выполнение PHP-скриптов, формирование контентных страниц и работу бизнес-логики приложений.
Front-end
Front-Еnd исполняет все запросы, которые возможно обработать самостоятельно без обращения к Back-End. Графические файлы и таблицы стилей с веб-сервера запрашиваются только в соответствии с политикой кеширования. После этого файлы хранятся в кэш Front-End и отдаются пользователям без обращения к Back-End.
Наиболее эффективна конфигурация, когда Front-End непосредственно напрямую с диска считывает статические файлы и не нагружает Back-End запросами.
Желательно, чтобы только для получения PHP-страниц Front-End обращался к Back-End серверу для получения страницы и при необходимости ожидал освобождения Back-End процессов.
В качестве Front-End сервера можно использовать:
NGINX -
http://sysoev.ru/nginx/
SQUID -
http://www.squid-cache.org/
OOPS -
http://www.oops-cache.org/
или любой аналогичный продукт.
Наилучшие практические результаты получены при использовании NGINX.
Если вы используете кэширующий прокси-сервер в качестве Front-End, обязательно настраивайте время кэширование документов. Графические файлы и таблицы стилей, XML файлы и другие статические объекты с веб-сервера должны запрашиваются только в соответствии с политикой кэширования. После этого файлы хранятся в прокси-сервере и отдаются пользователям без обращения к Back-End и Apache. Рекомендуется настраивать время кеширования для графических файлов на 3-5 дней. Пример настройки кэширования через файл .htaccees в корне веб-сервера:
ExpiresActive on
ExpiresByType image/jpeg "access plus 3 day"
ExpiresByType image/gif "access plus 3 day"
Внимание! Для работы этого примера необходимо, чтобы веб-сервер позволял переопределение переменных через файл .htaccess и модуль mod_expires был установлен.
В некоторых случаях на Front-end политика кеширования настраивается независимо от настроек Back-end.
Таким образом, Front-end будет кешировать все графические изображения. Запросы к контентным страницам не будут кешироваться и будут перенаправляться к Back-end.
Back-End
Back-end представляет собой обычный веб-сервер Apache, который исполняет PHP-приложения.
Back-end готов исполнять запросы на графические и статические документы, если вы используете кеширующий прокси-сервер для Front-End.
Но очень важно, чтобы число таких запросов было минимальным и 99% запросов приходилось на выполнение именно PHP-страниц.
Конфигурируя Back-End, можно добиться значительного выигрыша в производительности и стабилизировать систему по расходу памяти.
В большинстве случаев Back-End представляет собой обычный веб-сервер Apache, работающий на нестандартном порту, к примеру, на порту 88, и отвечающий только на запросы с localhost или IP адреса прокси-сервера.
Совет администратору. Лучше использовать несколько внутренних IP адресов типа 127.0.0.2, 127.0.0.3 и т.д. с 80м портом, иначе возможны нежелательные редиректы на неработающий порт у Front-end.
Рассмотрим процесс обработки запроса пользователя к обычной странице сайта.
Запрос принимается Front-End, например, по адресу
http://www.hostbizua.com на 80 порту, транслируется веб-серверу Apache по адресу
http://127.0.0.2:80/ Запрос исполняется веб-сервером Apache. Ответ принимается прокси-сервером, и соединение между прокси-сервером и Apache сервером закрывается, память высвобождается. Прокси-сервер передает готовую сформированную страницу посетителю по медленному каналу. Получив страницу, браузер посетителя посылает последовательно серию запросов на графические элементы и таблицу стилей. Все запросы принимаются прокси-сервером и обрабатываются без обращений к Back-end.
Как показала практика, такая конфигурация в несколько раз разгружает машину, уменьшает объемы потребляемой памяти, значительно ускоряет время обработки запросов и позволяет больше памяти выделить для работы базы данных. Такая конфигурация так же позволяет значительно разгрузить сервер при обработке большого числа закачиваемых файлов, например, музыки, дистрибутивов программных продуктов, презентаций и других физических объектов.
Стабилизируем Back-end по расходу оперативной памяти
Для стабилизации системы по расходу памяти и минимизации числа запущенных процессов Back-end можно рекомендовать в настройках Apache установить параметр MaxClients в значении 5-50.
Число необходимо подбирать исходя из системных ресурсов и нагрузки. Наличие лимита по числу возможных процессов позволит поставить жесткий лимит по потреблению памяти и исключить выход машины из строя при стрессовых нагрузках.
Наличие лимита позволяет включить Persistent соединение к базе и уменьшить расходы на соединение и число работающих процессов базы данных.
Так же рекомендуется подбирать параметры управления процессами в соответствии с установленным лимитом MaxClients. Например, если MaxClients = 20, тогда:
MinSpareServers 20
StartServers 20
MaxClients 20
©