Прискорення і оптимізація PHP-сайту. Які технології варто вибирати при налаштуванні сервера під PHP



Ця стаття допоможе відповісти на питання власників, розробників і системних адміністраторів PHP-сайтів:



  • Як оптимізувати сайт і прискорити його роботу?
  • З якою швидкістю буде і може працювати сайт, у відповідності з тими технологіями на яких він буде запущений?
  • Які технології слід використовувати налаштовуючи сервер або VPS?





Типова проблема:
У якийсь момент сайт починає відкриватися і працювати дуже повільно. Буває, що хостингова компанія блокує сайт за перевищення навантаження або перевитрата ресурсів. Що ж робити в такій ситуації?

Може бути, сайт став користуватися дуже високою відвідуваністю або був встановлений якийсь ресурсномісткий модуль, відбувається атака або сайт заражений вірусом. Так чи інакше, але у всіх цих випадків є дещо спільне і це проблема всіх сайтів на всіх хостингах.

І якщо говорити про сервери для PHP, то такою проблемою є спосіб виконання php коду, рівно як і інші значущі налаштування оточення на сервері.
Не залежно від того, чи є проблема у вашому коді або її немає, висока у вас відвідуваність чи ні, від налаштувань сервера залежить дуже багато. Що б все сказане не звучало порожніми словами і була написана ця стаття.

У цьому огляді я протестую сайт тільки що встановлений на одному з найпоширеніших движків управління контентом Drupal 7.33.

Для тіста обрана лише одна складова php-хостингу. Ми будемо тестувати web-сервери Nginx та Apache2, модулі mod_php іphp-fpmверсії php php53 та php56, подивимося, як впливають оптимізатори apc та opcache на швидкість роботи сайту.


Звичайно, ці параметри лише частина налаштувань від яких залежить швидкість сайту. Але ми навмисно обмежуємося цим, що б не робити огляд нескінченним.




Дано:


  • Операційна система Centos 6.7
  • Сервер баз даних: MariaDB 10.21
  • Всі сесії сайтів зберігаються в memcache, щоб прибрати вплив швидкості установки сесії на швидкість роботи сайту.
  • На всіх тестах як frontend виступає web-сервер 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

Самий типовий для хостингів варіант. 90% популярних хостинг-провайдерів використовують цей варіант. Хоч php53 давно не підтримується розробниками, але в інтернеті дуже багато сайтів, досі працюють на цій версії.



Такий варіант не тільки дуже повільний, але і швидко падає під невеликим навантаженням через брак робочих процесів Apache2, або через брак оперативної пам'яті на сервері.




3. Балансування і статика через Nginx, динамічна частина Apache2 + mod_php56 без оптимізатора opcache

Цей варіант створений як рішення для сучасних сайтів. Його пропонують хостінги, які прагнуть надавати свіжу версію PHP. Згідно поширеній думці, ця версія PHP повинна бути більш швидкою і безпечною, ніж попередні.



На жаль, далеко не всі сайти можуть повноцінно працювати з цією версією. Майже кожна нова версія 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 менш підданий атаці «повільних з'єднань»
  • php56 без оптимізатора — повільніше ніж php53 без оптимізатора
  • php56 c opcache — значно швидше php53 c apc
  • mod_php дуже швидко займає всю доступну пам'ять сервера і втрачає продуктивність на навантаженнях
  • php-fpm витрачає пам'ять значно ефективніше, безпечніше і гнучкіше в налаштуваннях. У ряді випадків він швидше і без високих навантажень.
  • Тест має вузьку специфіку, тут ми побачили особливості роботи движка Drupal, інші можуть вести себе інакше, але загальна тенденція буде такою ж.





І головне — від конфігурації вашого сервера або хостинга, залежить швидкість вашого сайту. Підібравши правильну архітектуру, ви можете отримати п'ятикратне збільшення швидкості роботи сайту.




Якщо у вас виникнуть питання, проблеми або потрібна порада:
Мої контакти в профілі


Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.