Debian vps оптимизация процессов

Обновлено: 04.07.2024

Как обеспечить более высокую производительность VPS сервера, который работает на Nginx + PHP + Mysql? В этой статье приведен чеклист основных настроек, которые позволят существенно оптимизировать работу сервера. Настройка займет не более 10 минут и не требует ничего, кроме редактирования конфигурационных файлов.

Примеры настроек приведены для операционной системы Debian 7 и VPS сервера с 1 процессором и 512Мб оперативной памяти.

Nginx

Настройки выполняются в файле /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:

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-сокеты
    • APC модуль
    • key_buffer
    • innodb_buffer_pool_size
    • innodb_flush_log_at_trx_commit = 0
    • query_cache_size
    • innodb_flush_method = O_DIRECT
    • thread_cache_size

    Источники

    Приведенные статьи содержат более подробное описание данных настроек, а также дополнительные методы оптимизации серверной части.

    Как обеспечить более высокую производительность VPS сервера, который работает на Nginx + PHP + Mysql? В этой статье приведен чеклист основных настроек, которые позволят существенно оптимизировать работу сервера. Настройка займет не более 10 минут и не требует ничего, кроме редактирования конфигурационных файлов.

    Примеры настроек приведены для операционной системы Debian 7 и VPS сервера с 1 процессором и 512Мб оперативной памяти.

    Nginx

    Настройки выполняются в файле /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:

    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-сокеты
      • APC модуль
      • key_buffer
      • innodb_buffer_pool_size
      • innodb_flush_log_at_trx_commit = 0
      • query_cache_size
      • innodb_flush_method = O_DIRECT
      • thread_cache_size

      Источники

      Приведенные статьи содержат более подробное описание данных настроек, а также дополнительные методы оптимизации серверной части.

      В автоматическом режиме был установлен Debian 7.0 x86-64 Wheezy и VPS была готова к работе.
      64 битная сиcтема была выбрана лишь для моих личных нужд, а вам же советую, на этом VPS, ставить x86.

      Начало


      После создание сервера вам на e-mail, прописанный при регистрации, должно прийти письмо вида:

      Виртуальный сервер: vps3456
      Конфигурация: 1xAMD-Opteron/128Mb/10Gb/1xIPv4@100
      Операционная система: Debian 7.0 x86-64 Wheezy

      Доступ к серверу по протоколу ssh2:
      IP: 93.189.xx.xx
      порт: 22
      пользователь: root
      пароль: xxxxxxxxxxx

      С уважением,
      техническая поддержка

      на что получаем диалог системы безопасности ключей:

      Соглашаемся и пишем yes.
      Поздравляю, вы в системе.
      Давайте обновимся:

      Не сидим под root-ом!

      По умолчанию нам предлагается сидеть под root-ом, что не очень хорошо по соображениям безопасности.

      1. создаем пользователя под которым будем работать(самый простой способ):

      где user — имя пользователя
      Далее мы увидим диалог что-то вроде:

      Пишем сложный пароль(который вы не забудете!) и заполняем данные которые считаем нужными, или просто нажимаем enter.

      2. Разрешаем user выполнение sudo
      Добавляем user в специальную группу sudo:

      где собственно user — имя пользователя.
      Всё, можем выходить и логинится под user

      и в дальнейшем уже использовать sudo если нужны привилегии root-а

      Немного обезопасим SSH

      Практически сразу после запуска сервера заметил подозрительную активность в ану.. на порту 22. По всей видимости китайские порно-сканеры разнюхали и начали брутить пароли.
      Самый простой выход — сменить порт ssh с 22 на любой другой.
      1. Для этого откроем файл конфигурации ssh сервера:

      Ищем строку «Port 22» и заменяем её на «Port 354» где 354 любое число в пределах от 1 до 65535
      На всякий случай посмотрим открытые порты:

      и выберем любой не из этого списка.
      Скажу сразу, порты 80, 443, 3306, 22, 21, 8080 — советую не использовать.
      2. Дальше, ограничим тип адресов для подключения(IPv6 либо IPv4). Если у вас на сервере не используется IPv6, то дописываем файл /etc/ssh/sshd_config:

      3. Запретим авторизацию под root, ищем в файле PermitRootLogin и выставляем no. Если данного параметра нет, дописываем:

      4. Разрешаем подключение только по определенным логинам, дописываем файл /etc/ssh/sshd_config:

      где список пользователей пишется через пробел.

      5. Запрещаем попытку входа с пустым паролем. Ищем PermitEmptyPasswords и выставляем no

      6. Сохраняем и перезапускаем ssh демон:

      Для начала всё, можем перелогиниваться с новыми параметрами($ ssh user@93.189.xx.xx -p 354), далее в статье мы еще вернемся к вопросу безопасности.

      Установка SWAP

      Как оказалось в автоматическом режиме не был выставлен swap, а при таком объеме памяти — это критично.
      Внимание! Это мой конкретный случай, проверить есть ли swap можно так:


      Создаем, с помощью dd, файл необходимого размера для swap области, где /swap — это имя и путь файла, а count=1024K его размер, в данном случае — 512 Мб
      (обычная формула swap = озу * 1.5, но это не наш случай):


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


      После окончания операции на экране появится что-то вроде:


      Следующим шагом активируем только что созданный SWAP файл:


      Далее нужно подредактировать файл fstab для подключения swap при следующей загрузке системы:

      Вот и всё, своп готов.
      Проверяем командой:

      и получить должны:

      Установка и расширенная настройка NGINX

      В качестве frontend-а(Фронтэнд) мы будем использовать всеми известный nginx.
      Если вы не будете использовать сервер для web-приложений — эту часть можно пропустить.

      В стандартном репозитории конечно есть уже nginx, но хотелось бы версию посвежее и без плясок.
      1. Изменяем файл /etc/apt/sources.list:

      и дописываем в самый низ:

      В случае если у вас debian отличный от 7, то вместо wheezy пишем его кодовое имя.

      2. Обновляем источники пакетов и устанавливаем nginx:

      3. Добавляем в начало файла nginx.conf новые параметры

      4. Ищем worker_processes и выставляем количество по количеству ядер процессора, в нашем случае 1.

      5. Ищем директиву events и приводим к виду:

      7. Редактируем /etc/nginx/conf.d/sitename.conf или же (ubuntu) /etc/nginx/sites-available/sitename.conf где sitename будет имя вашего сайта:

      Приводим к такому виду:

      Далее в статье мы вернемся к этим настройкам.

      Ковыряем системные переменные, защищаемся от некоторых видов атак

      Данные параметры дают некоторую масло-масленность и в некоторых случаях повышают нагрузку.
      Редактируем /etc/sysctl.conf

      Дописываем в конец

      Теперь можно перезагрузится

      Ускоряем общую работу системы

      Prelink и Preload. Prelink для создание статичных адресов библиотек, Preload это небольшое приложение, которое следит за файлами наиболее часто используемых приложений, и загружает их в память, когда система простаивает.
      1. Установка Prelink:

      Редактируем файл /etc/default/prelink:

      Измените строку с PRELINKING=unknown на PRELINKING=yes
      Запускаем:

      2. Установка Preload:

      Все, больше ничего не требуется

      Настраиваем брандмауэр(фаерволл)

      Далее будут очень сомнительные конфигурации. Настраиваем число подключений с одного IP адреса.
      Спасает при некоторых видах DOS атак и брутфорса.

      Данное правило ограничивает больше 20-ти подключение к 80 порту(web) за 15 секунд с 1 ip адреса.
      (кстати, подобное правило уже установлено на уровне nginx, но сжирает огромное количество ресурсов)


      Где 354 порт вашего ssh сервера. Правило ограничивает количество подключений, не более 4-х подключений за 1 минуту. На деле у меня не получалось авторизовать более 1 раза за минуту.
      Далее это правило вы дальше можете адаптировать под себя и другие сервисы.

      После рестарта системы все правила обнулятся, по этому делаем следующее:
      создаем и редактируем файл /etc/network/if-up.d/00-iptables

      сохраняем и делаем файл исполняемым:

      Сохраняем правила в файл:

      Всё, правила настроены и сохранятся после перезагрузки системы.

      На этом первая часть заканчивается, вышло свободное время.

      В следующей части расскажу проксирование nginx до node.js, установку и настройку node.js, установка и подключение php-fpm к nginx. + некоторые советы по скорости и безопасности без лишних плясок.

      P.S. Это мой первый пост на Хабре и один из первых опытов расширенной настройки debian. Буду рад выслушать критику и исправления.

      upd: Благодарю за критику, поправки, советы и отзывчивость хабралюдей. Следующую статью дополню вашими советами.
      upd 19.04.16: Немного подрадактировал статью, исправил ошибки и кое-где дополнил. Проверил на debian 8.1 — работает. Новая статья откладывается на n-ое время…

      Обновление и настройка ПО на сервере

      Выбор и настройка VPS на максимальную производительность

      Терминал сервера

      Файловая система

      Существует три разных варианта журналирования файловой системы ext4:

      • Journal Mode (медленный, наиболее безопасный)
      • Ordered Mode (средняя скорость, безопасный, опция по умолчанию)
      • Writeback Mode (быстрый, относительно безопасный)

      Узнаем имя диска на виртуальной машине:

      Открываем /etc/fstab, вносим изменения. Добавляем noatime, nodiratime, noacl, data=writeback, commit=15, barrier=0. Файл до редактирования:

      Обновляем загрузчик, перезагружаем систему:

      Перемонтируйте в RW и проверьте конфигурацию на ошибки, особенно fstab.

      Подключаемся к серверу, продолжаем настройку. Значения параметров определяющих быстродействие измените на оптимальные. Установите лимиты открытия файлов, потребления ресурсов:

      Лимиты

      Внесем изменения в файл /etc/sysctl.conf

      Перезагружаем сервер, изменения вступили в силу. Можно обойтись без перезагрузки, но так надежнее. Система полностью готова к развертыванию Web сервера.

      Установка Cyberpanel и Web сервера Open LiteSpeed

      Снова выбираем пункт 1

      Отвечаем y(yes) на предложение полной установки:

      Жмем для установки последней версии:

      Устанавливаем пароль. Вводим сложный пароль (8 символов минимум). Повторяем ввод пароля.

      Устанавливаем memcahed,redis, сторожевой таймер:

      Есть все, что нужно для создания нового сайта, переноса существующего. Вы можете даже организовать свой виртуальный хостинг и продавать услуги по размещению сайтов.

      Уже сейчас сервер полностью функционален, минимум впятеро быстрее Apache и Nginx. Можно начать работать, но я предлагаю заняться настройкой и тюнингом OLS, SQL и PHP.

      Настройка и оптимизация Open LiteSpeed

      SSL not connected

      Жмем <Advanced>. Подтверждаем согласие продолжить использовать небезопасное соединение. (Не составляет труда установить ssl сертификат, но это можно сделать и позже). Вводим логин и пароль (они у вас были созданы на этапе создания сервера).

      Проблема доступа в WebAdmin

      Если вы не можете получить доступ к консоли, вам необходимо разрешить соединение на порт 7080 в firewall. Сделать это можно в Cyberpanel.

      Или в терминале:

      WebAdmin

      Пришло время познакомиться с интерфейсом и возможностями WebAdmin. Несмотря на кажущуюся сложность на самом деле все просто, функционально и логично.

      Интерфейс WebAdmin

      Интерфейс WebAdmin

      Следите за появлением новых версий
      Обратите внимание на предупреждение о том, что появилась новая версия сервера: CURRENT VERSION: OpenLiteSpeed 1.6.7 New Release: 1.6.8 (current branch). Обновим сервер и выполним перезагрузку.

      Сервер обновлен, можно продолжить настройку.

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

      Server Configuration > General

      Server Configuration > General

      Для достижения максимальной производительности необходимо установить / изменить некоторые параметры:

      Установите максимальное значение этого значения не более, чем количество ядер / потоков процессора, которые поддерживает ваш сервер.

      Соблюдайте баланс

      Необходимо оставить некоторые потоки процессора доступными для других процессов сервера.

      Установите этот параметр в соответствии с вашими потребностями (или пока оставьте по умолчанию).

      Увеличение количества процессов не всегда ведет к увеличению производительности.

      Простое правило расчета количества процессов:

      1. меньше 4 cpu threads = 1/2
      2. 6-12 cpu threads = 1/3
      3. 13-16 cpu threads = 1/4
      4. 17-24 cpu threads = 1/6
      5. 25-32+ cpu threads = 1/8
      • Priority (приоритет серверных процессов) : Очень важный параметр. Определяет приоритет процессов сервера. Диапазон значений от -20 до 20. Меньшее число означает более высокий приоритет.

      Если процесс перемещается на другой ЦП, кэш-память ЦП не используется, и возникают дополнительные накладные расходы ресурсов CPU.

      • Memory I/O Buffer: Задает максимальный размер буфера, который используется для хранения тела запроса и его динамически генерируемого ответа. Когда этот лимит будет достигнут, сервер начнет создавать временные файлы подкачки.

      Установите буфера, чтобы вместить все одновременные запросы / ответы, чтобы избежать сброса памяти на диск. Оптимальное значение для начала 120M (при условии, что у вас >= 2 Гб ОЗУ).

      • Swapping Directory: Определяет каталог в который следует поместить файлы подкачки.

      Теперь можно заняться тюнингом OLS. Переходим во вкладку Server Configuration > Tuning и приводим параметры вашего сервера к тем, что приведены ниже.

      Server Configuration > Tuning

      Следующая вкладка требующая нашего внимания Server Configuration > External App

      Изменяем некоторые настройки (возможно вам в зависимости от нагрузки на сервер придется их не раз корректировать):

      • Max Connections = 45 (при не нагруженном сервере можно уменьшить до 30)
      • Environment:

      PHP_LSAPI_CHILDREN=45 (ВСЕГДА совпадает с Max Connections )
      LSAPI_AVOID_FORK=200M

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

      • Priority = -5. Диапазон значений от -20 до 20. Меньшее число означает более высокий приоритет. Процесс внешнего приложения не может иметь более высокий приоритет, чем веб-сервер.
      • Memory Soft Limit (bytes) = 2047M
      • Memory Hard Limit (bytes) = 2047M
      • Process Soft Limit = 1400
      • Process Hard Limit = 1500

      Первоначальная настройка параметров сервера завершена. Теперь можно настроить хосты (сайты).

      Настройка сайтов в Open LiteSpeed

      У вас нет ни одного хоста кроме Example. Когда вы создадите свой первый сайт (это легко сделать в CyberPanel), то вам потребуется изменить некоторые параметры.

      Вкладка Virtual Host ваш_домен > General:

      • Enable Compression = Yes
      • Enable Expires = Yes
      • Expires By Type = image/=A604800,text/css=A604800,application/x-javascript=A604800,application/javascript=A604800,font/=A604800,application/x-font-ttf=A604800

      Virtual Host ваш_домен External App:

      • Max Connections = 30 (при не нагруженном сайте можно уменьшить до 20)
      • Environment: PHP_LSAPI_CHILDREN=30 (ВСЕГДА совпадает с Max Connections, но должно быть МЕНЬШЕ этого значения на сервере)
      • Memory Soft Limit (bytes) = 2047M
      • Memory Hard Limit (bytes) = 2047M
      • Process Soft Limit = 1400
      • Process Hard Limit = 1500

      Устанавливать эти параметры необходимо для каждого хоста. Настройка сервера / хостов этим не исчерпывается. Но для дальнейшего функционирования они не принципиальны (пока). Теперь можно перейти к настройке PHP и SQL.

      Настройка PHP

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

      Правки в php.ini надо вносить для конкретной версии. Пример: файл php.ini для версии 7.4 будет находиться /usr/local/lsws/lsphp74/etc/php/7.4/litespeed.

      Изменения в php. ini:

      Настройка MySQL / MariaDB server

      Данные параметры оптимальны для VPS с 3 гб оперативной памяти и двумя CPU. Для серверов с большим количеством оперативной памяти и CPU некоторые значения стоит изменить. Если используются NVMe диски то можно включить задокументированные параметры.

      Нам осталось только изменить (увеличить) приоритет mysql и увеличить лимит на открытие файлов. Раньше это можно было сделать параметром nice и open_file_limits в my.cnf. В новых версиях это не работает.

      Часть настроек теперь находится в /lib/systemd/system/. Отредактируйте файлы mariadb.service и mariadb@.service:

      Проблема настроек SQL server
      Это тот самый случай, когда сделали (перенесли настройки), а задокументировать забыли… Вот все и гадают, почему nice или не работает, или вызывает ошибку при запуске сервера БД.

      Сохраните и перезапустите systemd:

      В идеале, если вы все сделали правильно, mysqltuner должен выдавать вот такую информацию:

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

      Заключение

      Нагрузка на сервер растёт не линейно, а по отрицательной экспоненте.

      Когда сервер настроен оптимально дальнейший рост нагрузки замедляется, потому как происходит наложение и совмещение функций — code reuse например, кэши процессора, памяти, программ работают эффективно.

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

      Читайте также: