Ускорение и оптимизация PHP-сайта. Какие технологии стоит выбирать при настройке сервера под PHP
Эта статья поможет ответить на вопросы владельцев, разработчиков и системных администраторов PHP-сайтов:
- Как оптимизировать сайт и ускорить его работу?
- С какой скоростью будет и может работать сайт, в соответствии с теми технологиями на которых он будет запущен?
- Какие технологии следует использовать настраивая сервер или VPS?
Типичная проблема:
В какой-то момент сайт начинает открываться и работать слишком медленно. Бывает, что хостинговая компания блокирует сайт за превышение нагрузки или перерасход ресурсов. Что же делать в такой ситуации?
Может быть, сайт стал пользоваться слишком высокой посещаемостью или был установлен какой-то ресурсоёмкий модуль, совершается атака или сайт заражен вирусом. Так или иначе, но у всех этих случаев есть кое-что общее и это проблема всех сайтов на всех хостингах.
И если говорить о серверах для PHP, то такой проблемой является способ исполнения php кода, ровно как и другие значимые настройки окружения на сервере.
Не зависимо от того, есть ли проблема в вашем коде или её нет, высокая у вас посещаемость или нет, от настроек сервера зависит очень многое. Что бы все сказанное не звучало пустыми словами и была написана эта статья.
В этом обзоре я протестирую только что установленный сайт на одном из самых распространённых движков управления контентом Drupal 7.33.
Для теста выбрана лишь одна составляющая php-хостинга. Мы будем тестировать web-серверы Nginx и Apache2, модули mod_php и php-fpm, версии php php53 и php56, посмотрим, как влияют оптимизаторы apc и opcache на скорость работы сайта.
Конечно, эти параметры лишь часть настроек от которых зависит скорость сайта. Но мы умышлено
ограничиваемся этим, что бы не делать обзор бесконечным.
Продолжение этой статьи: Сравнение скорости исполнения кода Drupal для PHP 5.3-5.6 и 7.0. «Битва оптимизаторов кода» apc vs xcache vs opcache
Так же вы можете прочитать другие мои публикации на тему «Идеального» кластера
- «Идеальный» кластер. Часть 3.1 Внедрение MySQL Multi-Master кластера
- «Идеальный» кластер. Часть 2.2: Высокодоступный и масштабируемый web-сервер, лучшие технологии на страже вашего бизнеса
- О виртуальном кластере на hetzner
- Frontend: NGINX + Keepalived (vrrp) на CentOS
- HAPRoxy для Percona или Galera на CentOS. Его настройка и мониторинг в Zabbix
- Zabbix 2.2 верхом на nginx + php-fpm и mariadb
Дано:
- Операционная система Centos 6.7
- Сервер баз данных: MariaDB 10.21
- Все сессии сайтов хранятся в memcache, чтобы убрать влияние скорости установки сессии на скорость работы сайта.
- На всех тестах в качестве frontend выступает web-server nginx 1.93. В случае с Apache2, Nginx выступает в качестве балансировщика, а также для отдачи статики. В конфигурациях без использования Apache2 — непосредственным web-сервером является Nginx
- Конфигурация Nginx и MariaDB содержат множество оптимизаций, направленных на достижение максимальной производительности, но для всех участников теста эти настройки одинаковые и поэтому их влиянием следует пренебречь
- Параметры opcache и apc взяты из рекомендаций Bitrix, так как они оптимальны и универсальны для большинства сайтов
Как будем тестировать?
В локальной сети есть сервер zabbix и его задачи каждую минуту:
- Открывать главную страницу испытуемого сайта, дожидаться определенного содержимого на странице, убеждаться, что ответ от сервера — код 200.
- Следующим шагом идет авторизация в админку сайта, это происходит отправкой соответсвующего POST запроса. Сверка текста и кода ответа на странице с заложенным эталоном. Этот шаг касается почти всех подсистем web-сервера, и во многом его скорость зависит от скорости взаимодействия с базой данных
- Последним шагом является выход из админки сайта, сверка кода ответа и текста на странице выхода
- По итогам каждого шага, zabbix будет скрупулезно замерять и записывать скорость рендеринга php-кода в html понятный браузеру и демонстрировать нам графики полученных результатов
- Для каждого испытуемого будут записываться значения в течение одного часа и в качестве результата будет выступать средние значения за этот час
- Тестирование будет происходить внутри локальной сети, так что влияние на результат скорости интернет-соединения исключено
- Для удобства восприятия, все результаты показываю в порядке возрастания. Т.е. самый первый результат — это самый медленный. Все конфигурации были вынесены под условный номер, это позволит лучше ориентироваться в результатах
- Верхние графики — скорость генерации кода, чем выше значение, тем лучше. Нижние графики — время ответа сервера и чем ниже значение, тем лучше
- Тестируемые сайты живут своей жизнью, в них происходят регулярные операции с базами данных и выполняются задания по расписанию, именно поэтому кривая на графиках может иметь взлеты и падения
Тестирование:
1. Nginx + php-fpm56 без оптимизатора opcache
По архитектуре — это один из самых передовых вариантов. По производительности — наибольшее разочарование.
Производительность оставляет желать лучшего, но нагрузку такой вариант будет выдерживать гораздо лучше чем вариант №2 с Apache2. Так же, такой вариант будет расходовать оперативную память существенно эффективнее.
2. Apache2 + mod_php53 без оптимизатора apc
Cамый типичный для хостингов вариант. 90% популярных хостинг-провайдеров используют этот вариант. Хоть php53 давно не поддерживается разработчиками, но в интернете очень много сайтов, до сих пор работающих на этой версии.
Такой вариант не только очень медленный, но и быстро падает под небольшой нагрузкой из-за нехватки рабочих процессов Apache2, либо из-за нехватки оперативной памяти на сервере.
3. Балансировка и статика через Nginx, динамическая часть Apache2 + mod_php56 без оптимизатора opcache
Этот вариант создан как решение для современных сайтов. Его предлагают хостинги, которые стремятся предоставлять свежую версию PHP. Согласно бытующему мнению, эта версия PHP должна быть более быстрой и безопасной, чем предыдущие.
К сожалению, далеко не все сайты могут работать полноценно c этой версией. Почти каждая новая версия PHP перестает поддерживать некоторые устаревшие и «небезопасные» функции, нарушая работу «старого» кода.
Сам по себе php56 без оптимизатора довольно медленный, а mod_php склонен падать и занимать всю память на сервере под нагрузкой.
4. Nginx + php-fpm53 без оптимизатора apc
Достаточно передовая конфигурация, для тех кто не желает иметь проблемы из-за ошибок с оптимизатором кода. При этом используется «совместимая» версия интерпретатора PHP, а также из связки убирается ресурсоемкий Apache2.
5. Балансировка и статика через Nginx, динамическая часть Apache2 + mod_php53 + apc
Еще одна распространенная вариация. Очень многие хостинги применяют именно её, при этом либо используют по умолчанию, либо дают возможность включать оптимизатор в своих панелях управления.
Обычно Apache2 оставляют для работы .htaccess-правил, таких как преобразование ссылок и ЧПУ.
Получаем прирост скорости в 3,5 раза, по сравнению с вариантом без использования оптимизатора.
Сам по себе Apache (при использовании его собственного модуля mod_php) расходует для свой работы гораздо больше ресурсов, чем вариант с php-fpm. Apache2 склонен падать, если в одном из его модулей случается сбой или заполнять собой всю оперативную память сервера.
6. Nginx + php-fpm53 + apc
Отличный вариант для сайтов на старых движках, не требующих сложных .htaccess
Именно такой вариант я использую, когда необходимо поднять устаревший сайт, добиться от него удовлетворительной скорости и надежной работы при высоких нагрузках.
7. Балансировка и статика через Nginx, динамическая часть Apache2 + php-fpm53 + apc
Вариант для устаревших сайтов со сложными .htaccess. Например — старые инсталляции Bitrix.
Это идеальный вариант для устаревших сайтов. Данная конфигурация устойчива к высоким нагрузкам, совместима и достаточно производительна.
Отлично подходит, когда нужны правила .htaccess и дополнительные модули Apache2.
Из недостатков — устаревшая и не обновляемая версия php, но если нет выбора — это самый лучший вариант. Отлично подходит для старой версий Bitrix, Joomla и других распространенных CMS не самых свежих версий.
8. Балансировка и статика через Nginx, динамическая часть Apache2 + mod_php56 + opcache
Достаточно производительная, но ресурсоёмкая конфигурация со всеми недостатками mod_php.
Достаточно быстро, но под нагрузкой у сервера может закончится память, а скорость существенно упадет.
9. Nginx + php-fpm56 + opcache
Самый производительный вариант.
Это самый лучший вариант для всех современных сайтов. Хорошо держит нагрузку, показывает самый лучший результат с точки зрения производительности. Именно такой вариант я использую, когда стоит задача оптимизировать производительность сайта и увеличить скорость его работы.
Единственный недостаток — это то, что мы не сможем использовать .htaccess и все правила mod_rewrite нужно переписать на синтаксис Nginx.
Также не будут работать модули Apache2. Если таковые используются, то этот вариант не подойдёт.
10. Балансировка и статика через Nginx, динамическая часть Apache2 + php-fpm56+ opcache
Самый лучший вариант для сайтов, где нужен .htaccess. Идеально подходит для свежих версий Bitrix.
Хорошо держит нагрузку за счет php-fpm. Активно использую этот вариант для большинства сайтов.
Главная страница тестового сайта | |||
Номер конфигурации | Архитектура | Средняя скорость загрузки кб. | Средний отклик мс. |
1 | Nginx + php-fpm56 без оптимизатора opcache | 77,04 | 103,6 |
2 | Apache2 + mod_php53 без оптимизатора apc | 78,79 | 103,98 |
3 | Apache2 + mod_php56 без оптимизатора opcache | 78,85 | 102,38 |
4 | Nginx + php-fpm53 без оптимизатора apc | 81,55 | 97,88 |
5 | Apache2 + mod_php53 + apc | 303,37 | 29,36 |
6. | Nginx + php-fpm53 + apc | 312,33 | 24,73 |
7. | Apache2 + php-fpm53 + apc | 339,63 | 23,32 |
8. | Apache2 + mod_php56 + opcache | 484,96 | 16,91 |
9. | Nginx + php-fpm56 + opcache | 546,34 | 14,08 |
10. | Apache2 + php-fpm56+ opcache | 571,14 | 13,78 |
Авторизация в админке тестового сайта | |||
Номер конфигурации | Архитектура | Средняя скорость загрузки кб. | Средний отклик мс. |
1 | Nginx + php-fpm56 без оптимизатора opcache | 67,51 | 239,01 |
2 | Apache2 + mod_php53 без оптимизатора apc | 64,61 | 257,51 |
3 | Apache2 + mod_php56 без оптимизатора opcache | 66,75 | 242,42 |
4 | Nginx + php-fpm53 без оптимизатора apc | 68.79 | 233.15 |
5 | Apache2 + mod_php53 + apc | 173,81 | 94,26 |
6. | Nginx + php-fpm53 + apc | 173,3 | 91,3 |
7. | Apache2 + php-fpm53 + apc | 182,1 | 90,5 |
8. | Apache2 + mod_php56 + opcache | 218,35 | 77,55 |
9. | Nginx + php-fpm56 + opcache | 252,83 | 62,25 |
10. | Apache2 + php-fpm56+ opcache | 262,8 | 60,85 |
Выход из админки тестового сайта | |||
Номер конфигурации | Архитектура | Средняя скорость загрузки кб. | Средний отклик мс. |
1 | Nginx + php-fpm56 без оптимизатора opcache | 41,01 | 184,49 |
2 | Apache2 + mod_php53 без оптимизатора apc | 42,42 | 188,97 |
3 | Apache2 + mod_php56 без оптимизатора opcache | 42,06 | 188,37 |
4 | Nginx + php-fpm53 без оптимизатора apc | 45,48 | 169,15 |
5 | Apache2 + mod_php53 + apc | 190,1 | 41,87 |
6. | Nginx + php-fpm53 + apc | 185,92 | 41,24 |
7. | Apache2 + php-fpm53 + apc | 202,78 | 39,21 |
8. | Apache2 + mod_php56 + opcache | 315,56 | 26,23 |
9. | Nginx + php-fpm56 + opcache | 373,19 | 20,43 |
10. | Apache2 + php-fpm56+ opcache | 381,21 | 20,57 |
В качестве итогов:
- В реальной жизни, все варианты с Apache2 могут быть медленней, так как в своих тестах я умышленно передал отдачу статики Nginx. Это сделано, чтобы исключить влияние скорости отдачи статики на результаты замера скорости работы интерпретатора PHP. Одной из наиболее слабой стороной Apache2 и при этом сильной Nginx — является скорость отдачи статики. Особенно, это заметно на высоких нагрузках. Кроме того, Nginx менее подвержен атаке «медленных соединений»
- mod_php очень быстро занимает всю доступную память сервера и теряет производительность на нагрузках
- php-fpm расходует память значительно эффективнее, безопаснее и гибче в настройках. В ряде случаев он быстрее и без высоких нагрузок.
- Тест имеет узкую специфику, тут мы увидели особенности работы движка Drupal, другие могут вести себя иначе, но общая тенденция будет такой же.
И главное — от конфигурации вашего сервера или хостинга, зависит скорость вашего сайта. Подобрав верную архитектуру, вы можете получить пятикратное увеличение скорости работы сайта.
Если у вас возникнут вопросы, трудности или потребуется совет:
Мои контакты в профиле