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-ое время…Обновление и настройка ПО на сервере
Терминал сервера
Файловая система
Существует три разных варианта журналирования файловой системы 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
Жмем <Advanced>. Подтверждаем согласие продолжить использовать небезопасное соединение. (Не составляет труда установить ssl сертификат, но это можно сделать и позже). Вводим логин и пароль (они у вас были созданы на этапе создания сервера).
Проблема доступа в WebAdmin
Если вы не можете получить доступ к консоли, вам необходимо разрешить соединение на порт 7080 в firewall. Сделать это можно в Cyberpanel.
Или в терминале:
WebAdmin
Пришло время познакомиться с интерфейсом и возможностями WebAdmin. Несмотря на кажущуюся сложность на самом деле все просто, функционально и логично.
Интерфейс WebAdmin
Следите за появлением новых версий
Обратите внимание на предупреждение о том, что появилась новая версия сервера: CURRENT VERSION: OpenLiteSpeed 1.6.7 New Release: 1.6.8 (current branch). Обновим сервер и выполним перезагрузку.Сервер обновлен, можно продолжить настройку.
Настройка сервера
Server Configuration > GeneralДля достижения максимальной производительности необходимо установить / изменить некоторые параметры:
Установите максимальное значение этого значения не более, чем количество ядер / потоков процессора, которые поддерживает ваш сервер.
Соблюдайте баланс
Необходимо оставить некоторые потоки процессора доступными для других процессов сервера.
Установите этот параметр в соответствии с вашими потребностями (или пока оставьте по умолчанию).
Увеличение количества процессов не всегда ведет к увеличению производительности.
Простое правило расчета количества процессов:
- меньше 4 cpu threads = 1/2
- 6-12 cpu threads = 1/3
- 13-16 cpu threads = 1/4
- 17-24 cpu threads = 1/6
- 25-32+ cpu threads = 1/8
- Priority (приоритет серверных процессов) : Очень важный параметр. Определяет приоритет процессов сервера. Диапазон значений от -20 до 20. Меньшее число означает более высокий приоритет.
Если процесс перемещается на другой ЦП, кэш-память ЦП не используется, и возникают дополнительные накладные расходы ресурсов CPU.
- Memory I/O Buffer: Задает максимальный размер буфера, который используется для хранения тела запроса и его динамически генерируемого ответа. Когда этот лимит будет достигнут, сервер начнет создавать временные файлы подкачки.
Установите буфера, чтобы вместить все одновременные запросы / ответы, чтобы избежать сброса памяти на диск. Оптимальное значение для начала 120M (при условии, что у вас >= 2 Гб ОЗУ).
- Swapping Directory: Определяет каталог в который следует поместить файлы подкачки.
Теперь можно заняться тюнингом OLS. Переходим во вкладку 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 например, кэши процессора, памяти, программ работают эффективно.
Даже при таких далеко не экстремальных настройках вы скорее упретесь в ограничение пропускной способности сети, чем исчерпаете хотя бы половину ресурсов сервера.
Читайте также: