Настройка сервера

Краткий гайд про то, как можно настраивать nginx, php-fpm и mysql для оптимального потребления ресурсов сервера.

В прошлом году я рассказал про антипаттерн, который приводит к плохому быстродействию сайтов и является одной из самых частых проблем быстродействия проектов. Второй такой причиной является отсутствие настройки целиком или плохие настройки программного обеспечения. Многие программы по-умолчанию настроены так, чтобы работать на очень слабых по современным меркам серверах, и не могут использовать все доступные мощности. Если максимально использовать ядра процессора и свободную оперативную память, сервер может выдерживать очень серьёзные нагрузки. Этот пост о том, как можно настроить nginx, php-fpm и mysql-совместимую базу данных, чтобы выжать максимум из железа.

Настройка Nginx

Веб-сервер Nginx обладает огромным количеством настроек и с нуля во всех разобраться довольно сложно. Я советую вам взять за основу структуру конфига с уже заданными неплохими значениями от проекта H5BP.

Данный репозиторий содержит не только хорошие настройки для большинства серверов, но и предлагает хорошую структуру конфигурационных файлов, которая позволяет избежать многочисленного повторения строчек и копипасты.

Если вы хостите php сайты, то вам необходимо добавить примерно такой кусочек, который можно назвать php.conf:

Имейте в виду, что следует продумать, какие именно php файлы вы хотите исполнять, и, возможно, ограничить их одним файлом или директорией.

Для современных CMS и фреймворков, которые используют паттерн FrontController, вам нужно направлять все запросы на файл index.php. Ниже вариант конфига для WordPress и пара вариантов для фреймворков:

Вот два сайта, которые служат хорошим источником информации про nginx:
http://nginx.org/en/docs/
https://www.nginx.com/resources/wiki/

Настройка PHP-FPM

Настройка php-fpm — самая простая вещь. Задача заключается в том, чтобы посчитать, какое максимальное количество процессов запустить на вашем сервере. Математика следующая:

pm.max_children = (Общее количество свободной RAM — Резерв для системы) / Размер памяти для одного процесса.

Важный нюанс! Под общим количеством свободной памяти имеется в виду не физическая память, а то, сколько осталось памяти после того, как вы вычли память для базы, redis, memcache и прочего. Учитывайте, что на эти системы может уйти гигабайты памяти в зависимости от настроек. Тут следует подумать, что важнее — больше память для хранения и быстрого извлечения данных или же большое количество php процессов наготове.

Узнать средний размер потребления памяти для php процесса можно так:

500 мегабайт мы оставляем в резерв системе, тоже довольно гибкая цифра, её можно увеличить, если кажется, что 500 мегабайт недостаточно для нормальной работы.

Чаще всего я встречал использование динамического процесс менеджера, как наиболее гибкий вариант. Ниже я привожу пример конфигурации для сервера с 16 ГБ памяти. С учетом базы данных и прочего софта, у нас остаётся 6 ГБ свободной памяти, а команда показала, что в среднем наш процесс потребляет 90 мегабайт.

Новые настройки войду в силу после перезагрузки сервиса.

Настройка MySql

Настройки mysql-совместимой базы содержатся в файле my.cnf. Ниже опции, которые имеет смысл отредактировать:

Как узнать, сколько наш диск может операций в секунду:

В таблице результатов нас интересует среднее между read iops и write iops, значение в конфигурации для базы не должно превышать цифры в результатах.

После любых изменений, следует промониторить потребление процессоров и память, быстродействие. Иногда, приходится корректировать цифры, потому что расчётные значения могут не соответствовать реальным цифрам. Также не забывайте, что проверять следует на реальной нагрузке, цифры при спящем трафике могут разительно отличаться от полноценной дневной нагрузки. Самый просто способ — команда top, более продвинутые и удобные способы мониторинга — сервисы вроде NewRelic или Nginx Amplify

Надеюсь, это информация поможет вам при настройке вашего сервера.

Что такое SSL и зачем нужен HTTPS

Что такое SSL, HTTPS, зачем всё это нужно и как можно сделать такое на своём сайте? Ответы на эти вопросы в моём новом посте.

Зачем нужен HTTPS сейчас

Раньше, страницы с безопасной передачей данных в интернете встречались довольно редко — это были страницы оплаты, входа или регистрации. Сейчас зеленый замочек слева от адресной строки есть у каждого популярного сайта. Формально, он символизирует, что передача данных между вашим компьютером и сервером сайта происходит в зашифрованным виде, и никто не может на пути между этими двумя точка узнать номер вашей карточки или логин с паролем. За последние три года, передача данных через безопасный протокол HTTPS стал де факто стандартом в современном интернете.

Любопытно, что с ростом популярности протокола, появились причины его использовать, не связанные напрямую с факторами безопасностью. Вот некоторые из них:

  1. Многие продвинутые возможности API взаимодействия с браузером требуют HTTPS, например, использование камеры, запись звука, использования оффлайн возможностей.
  2. Посещаемость сайта. Гугл заявил, что доступность безопасного протокола является одним из фактором поисковой выдачи, а популярные браузеры хотят в будущем помечать небезопасные сайты специальной отметкой, что будет отпугивать аудиторию.
  3. Многие технические возможности или их реализации, например, использование нового протокола передачи данных HTTP/2 или Websockets в некоторых старых браузерах, требуют обязательного использования шифрования.
  4. Ваш сайт становится безопаснее — больше в него нельзя врезать рекламные блоки или контент с небезопасных сайтов.

SSL, TSL

Однако факт общения с сайтом через HTTPS не означает того, что вашим данным обеспечена безопасность. Дело в том, что есть разные варианты криптографических протоколов, и новые продолжают разрабатываться до сих пор. Например, все SSL протоколы уже считаются устаревшими и не отвечают современным требованиями безопасности — известно, как их можно обойти. Их заменили более новые TSL протоколы. Кроме этого, необходимо произвести настройку веб-сервера таким образом, чтобы максимально использовать все возможности безопасности. Проект SSLTest позволяет оценить, насколько современные и безопасные варианты протоколов и опции используются на сайте. На момент написания этой заметки, этот сайт имеет высшую оценку от SSLLabs — A+. Ниже фрагмент конфига веб-сервера Nginx, который позволяет получить такую оценку:

Прогресс не стоит на месте, изобретаются новые шифры и находятся новые уязвимости; со временем этот конфиг устареет, поэтому перед использованием обязательно убедитесь в его актуальности.

Let’s encrypt

Наверное, одним из серьёзных факторов роста популярности HTTPS стала доступность приобретения сертификатов. Цена в 400 долларов за сертификат — довольно дорого, но теперь есть отличный способ получать сертификаты совсем бесплатно. Некоммерческая организация Let’s encrypt создала автоматизированный сервис по выдаче сертификатов, поэтому теперь вопрос цены отпал. Ложка дёгтя — такие сертификаты действительны только три месяца, поэтому их надо часто генерировать заново.

Есть большое множество клиентов для сервиса, я перепробовал несколько и мне больше всего понравился вариант на языке Ruby. Вот как выглядит генерация сертификата для одного домена в командной строке:

Первая команда сгенерирует вам ключ, вторая команда получит сертификат, если осталось меньше 20 дней до окончания срока действия сертификата текущего или если его нет. Нужно подставить свои пути к ключу, который сгенерировали первой командой, путь к доступной из интернета корневой директории сайта (в современных фреймворках такие директории обычно называют public, web, webroot) и ключ для сохранения всех данных. Последнюю команду можно использовать как задачу для Cron и автоматически обновлять сертификаты.

Я советую эту книгу для полного понимания того, как работает шифрование. Надеюсь, эта информация поможет вам сделать ваши проекты безопаснее и удобнее.