Чекліст з оптимізації VPS на PHP

Як забезпечити більш високу продуктивність VPS сервера, який працює на Nginx + PHP + MySQL? У цій статті наведено чекліст основних налаштувань, які дозволять суттєво оптимізувати роботу сервера. Налаштування займе не більше 10 хвилин і не потребує нічого, крім редагування файлів конфігурації. Приклади налаштувань наведені для операційної системи Debian 7 та VPS сервера з 1 процесором та 512Мб оперативної пам'яті.

Налаштування виконуються у файлі/etc/nginx/nginx.conf, а також у налаштуваннях віртуального хоста (зазвичай у папці/etc/nginx/sites-enabled)

Кількість воркерів

Кількість воркерів nginx'a має збігатися з кількістю ядер:

Cache-Control заголовки

Встановлення заголовків Cache-Control дозволить суттєво розвантажити Ваш сервер від повторних звернень до файлів, які не змінюються (або змінюються рідко, наприклад css/js/jpg/png/gif):

Access log

Зайві дискові операції через запис логів нам не потрібні, відключаємо:

Unix socket'и

Включаємо unix-сокети для роботи з PHP:

Налаштування виконуються у файлі конфігурації fpmphp-fpm.conf, який у нашому випадку знаходиться тут/etc/php5/fpm/pool.d/www.conf.

Unix socket'и

Переконуємось, що php-fpm працює з unix-сокетами, а не з tcp:

Встановлюємо розширення APC – внутрішній кеш PHP, який дозволить суттєво заощадити ресурси парсеру PHP:

Налаштування MySQL

Усі налаштування MySQL виконуються у файліmy.cnf, який зазвичай знаходиться тут/etc/my.cnf.

key_buffer

Якщо Ви використовуєте лише MyISAM таблиці, встановлюйте це значення 30%. 40% усієї доступної оперативної пам'яті на сервері:

innodb_buffer_pool_size

Якщо ви використовуєте лише InnoDB таблиці, встановлюйте це значення максимально можливим (80% доступної пам'яті). У нашому випадку встановлюємо:

Увага, встановлювати таке знання можна лише значно зменшивши '''key_buffer'''. Тобто. між цими двома налаштуваннями необхідно зробити вибір, який залежить від типу використовуваних таблиць (MyISAM чи InnoDB).

innodb_flush_log_at_trx_commit

Значного прискорення запису для таблиць innoDB можна досягти встановленням цього параметра в 0, коли буфер запису скидатиметься на диск не після кожної операції, а раз на секунду:

innodb_flush_method

Встановлення цієї опції O_DIRECT дозволяє уникнути подвійного кешування (вона вимикає операційний кеш для файлів даних MySQL):

thread_cache_size

Ця опція визначає розмір кешу для створених тредів. Підбирається експериментально, але краще стартове знання збільшити до 16:

query_cache_size

Включаємо внутрішній кеш MySQL:

Значення варто збільшувати за необхідності. Не слід забувати, що кеш перестає працювати ефективно на таблицях, які часто оновлюються.

Як резюме — короткий список із виділеними найбільш важливими налаштуваннями:

  • Nginx
  • worker_processes
  • expires maxдля статики
  • access_log off
  • unix-сокети
  • PHP
  • APCмодуль
  • MySQL
  • key_buffer
  • innodb_buffer_pool_size
  • innodb_flush_log_at_trx_commit = 0
  • query_cache_size
  • innodb_flush_method = O_DIRECT
  • thread_cache_size
  • Наведені статті містять детальніший опис даних налаштувань, а також додаткові методи оптимізації серверної частини.

    Хардкорна конфа за С++. Ми запрошуємо лише профі.

    Читають зараз

    Моніторинг PostgreSQL + php-fpm + nginx + диск за допомогою Zabbix

    Установка php5.5+php-fpm+mysql+nginx на Mac OS X Mavericks

    Налаштування Nginx + LAMP сервера в домашніх умовах Частина 2: Налаштування backend: PHP + MySQL

    Запитання та відповіді

    У чому проблема коду? Чому дані не додаються до бази даних?

    Як працює System.Data.Common на c#?

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

    Що скажете про завантаження картинок?

    Є вразливості у PHP-Lua та регулярок?

    Коментарі 21

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

    Переглянув офіційну документацію, насправді навіть так: The optimal value depends on many factors including (але не обмежений до) номера CPU cores, number of hard disk drives that store data, and load pattern. Коли один є в ліжку, налаштувати його на кількість наявних CPU-коресів буде бути хорошим запуском (Визначення “auto”буде вірно в autodetect it).