Оптимизация работы web-сервера nginx+php-fpm

 Оптимизация работы web-сервера nginx+php-fpm
Попросили оптимизировать скорость работы сайта на VDS (nginx, php-fpm,mysql). Эту заметку написал больше для себя, оптимизирую работу веб серверов не часто, что-то могу забыть.

Начинаем с самого элементарного, создаем нагрузку на сайт с любого другого компьютера посредством программы siege (50 одновременных подключений):
sudo apt-get install siege
siege -c 50 site.ru
На сервер открываем htop и смотрим нагрузку. Видим, что в основном сервер нагружает php-fpm а также медленно ворочается mysql. Для php-fpm проверяем, что тип пула dynamic, корректируем количество дочерних процессов (pm.max_children) в зависимости от количества памяти, проверяем, что работа идет через сокет (а не через порт) и включаем opcache. В целом этих мер должно быть достаточно. Далее - оптимизация СУБД.
Переходим к mysq. Чтобы не углубляться в настройки параметров, мы воспользуемся инструментами анализа логов сервера, которые дают рекомендации по изменению настроек. Но в любом случае, на не оптимизированной mysql нужно, как минимум, увеличить настройки хранения индексов (key_buffer_size, innodb_buffer_pool_size), настройки хранения временных таблиц (tmp_table_size, max_heap_table_size). Узнаем на какие значения изменить эти параметры. Устанавливаем mysqltuner. Запускаем  (указав имя и пароль mysql) и следуем инструкциям по оптимизации. Тут нужно учесть, что аптайм mysql сервера должен быть не менее суток. После внесения изменений в конфиграционный файл mysql ждем пару дней и запускаем  mysqltuner повторно и подтюниваем. И так несколько раз.
sudo apt-get install mysqltuner
mysqltuner

Второй инструмент, также неплох:
wget http://www.day32.com/MySQL/tuning-primer.sh
sh tuning-primer.sh
Еще замеченный момент - при тестировании сайта, на определенном количестве одновременных подключений сайт стопарится и выдает 404 ошибку. То есть, любой пользователь сможет запустить что-то типа siege -c 500 site.ru и положить сайт. Нас это совсем не устраивает. Самое простое, что можно сделать - ограничить файрволом количество одновременных подключений на 80 порт с одного хоста, скажем до 10:
iptables -I INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 10 -j REJECT
Этого правила достаточно для ограничения запросов с одного IP. От массивного DDoS нас это, конечно, не спасет, но хоть какая-то защита.

Третий момент, смотрим статистику размера и скорости сайта, например, через www.webpagetest.org. В моем случае видно, что на главной странице фоном в нескольких блоках вставлены видеофайлы, которые занимают более 85% от общего веса сайт. Непорядок. Меняем видео на картинки, либо, если это невозможно - скачиваем видео к себе, пережимаем в меньший битрейт и заливаем обратно. В моем случае, достаточно было пережать файлы из FullHD в HD для уменьшения размера в 5 раз. Внешне качество картинки не изменилось.

Руководство не претендует на полноту освещения темы, но этих начальных мер было достаточно для ускорения работы сайта. Остается добавить, что для более детального тюнинга нужно также вылавливать долгие запросы к mysql (log_slow_queries), смотреть нагрузку на диск и т.п.

Комментариев нет:

Отправить комментарий