Введение


Если сервер работает без ошибок, то стоит позвать системного администратора. Он исправит эту проблему


В каждой шутке есть только доля шутки. Стремление к совершенству у web мастеров, а тем более у системных администраторов иногда превращается в навязчивую идею (хотя здоровый перфекциони?зм приветствуется). Получить достойный результат без лишних усилий довольно просто.


На 80% хороший контент, грамотная верстка и дизайн, качественное SEO — главные составляющие успеха любого интернет проекта. Остальные 20%, это «скорость» вашего ресурса (роботы ПС давно научились проверять время отклика сервера, время загрузки страниц и безжалостно пессимизируют «медленные» по их мнению сайты ).


Вывод 1:


Грамотная настройка VPS жизненно необходима для того, чтобы ваш ресурс мог занять достойное место среди многочисленных конкурентов. Тут в полной мере работает принцип Парето: 20 % усилий дают 80 % результата, а остальные 80 % усилий — лишь 20 % результата.


Создание контента это как раз 80% усилий. Но даже если у вас будет не уникальный контент, а «copy-paste», то при прочих равных условиях преимущество в глазах Яндекс будет иметь не сайт — первоисточник, а ваш ресурс если он быстрее, что по мнению робота поисковой системы лучше удовлетворяет потребности пользователя. Вы уже наверное заметили, что любой шлак из турбо от яндекса всегда имеет преимущество перед любым, даже самым качественным контентом.


Понятно, все хотят что бы сервер работал максимально быстро. Это дает конкурентное преимущество. Но как его достичь? Изучив 100 500+ руководств разной степени бесполезности на тему настройки ОС, вебсерверов, wordpress, mysql, php вы поймете, что зачастую они дублируют друг друга, а еще чаще вводят в заблуждение и / или просто не верны.



Вывод 2:


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

Попробуем хотя бы частично решить проблему отсутствия качественной документации на тему выбора и настройки VPS.


Disclaimer


  • Автор не претендует на истину в последней инстанции (хотя уверен, что есть два мнения — его, и неправильное )
  • Все, что вы делаете, вы делаете на свой страх и риск. Поэтому, прежде чем делать какие либо изменения на сервере / сайте делайте как минимум snapshot VPS. Backup сайтов / баз данных / конфигурационных файлов делать обязательно.
  • VPS (если он не full managed вашим хостером) зона только вашей ответственности.

Приготовьтесь поработать


Если вы не уверены в том что делаете (особенно на production), то стоит «покурить» man(ы) и хорошо подумать. Не забывайте проверять и тестировать результат ваших действий.


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


Пробуйте, пробуйте и еще раз пробуйте. Итерация за итерацией. Будьте готовы к тому, что последующая итерация отладки не всегда будет показывать лучший результат.



Пузомерки


Качество оптимизации можно оценить с помощью различных сервисов, их сотни. Некоторые показатели можно посмотреть в yandex.webmaster. Например, инструмент «проверка ответа сервера» позволяет быстро оценить насколько быстро работает ваш сервер / сайт. Вот пример выдачи одного нашего сайта


<code>Ответ "https://мой-сайт" > Основной робот Яндекса
Код статуса HTTP	200 OK
Время ответа сервера	21?мс
IP сайта	***
Кодировка	UTF-8(unicode-1-1-utf-8, UTF8)
Размер страницы	140,04?КБ
Content-Type: text/html; charset=UTF-8
Vary: Accept-Encoding
Last-Modified: Sun, 12 Jan 2020 17:45:42 GMT
X-LiteSpeed-Cache: hit
Content-Encoding: gzip
Content-Length: 140378
Date: Mon, 10 Feb 2020 02:33:59 GMT
Server: LiteSpeed
Alt-Svc: quic=":443"; ma=2592000; v="43,46", 
h3-Q043=":443"; ma=2592000, h3-Q046=":443"; 
ma=2592000, h3-Q050=":443"; ma=2592000, 
h3-24=":443"; ma=2592000, h3-25=":443"; 
ma=2592000
Connection: Keep-Alive</code>

Время ответа сервера 21?мс (это основной параметр на который стоит обращать внимание при этой проверке) — это существенно меньше порога в 200 мс установленных Яндекс.


Часто в webmaster можно увидеть сообщения такого содержания:


<code>Проблемы сайта за сегодня, 10 мая
Нашлась 1 проблема
Фатальные 0
Критичные 1
Возможные проблемы 0
Рекомендации 0
Проблемы Турбо-страниц 0
Критичные Долгий ответ сервера	
При обращении к страницам сайта среднее время ответа сервера превышает 3 секунды. 
Долгая загрузка страниц затрудняет работу с сайтом. 
Проверьте ответ сервера и при необходимости свяжитесь с хостинг-провайдером. 
Если время ответа нормализовалось, сообщение о проблеме исчезнет автоматически 
после переобхода роботом долго отвечавших страниц.
Проверьте ответ сервера и при необходимости 
свяжитесь с хостинг-провайдером.
Ознакомьтесь с примерами.</code>

Игнорировать их не стоит. Имеет смысл посмотреть текущее положение дел. Возможно это ложная тревога и можно смело жать кнопку «Проверить».


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


Некоторые показатели скорости сервера и сайтов вы можете узнать в яндекс метрике. Там можно отследить такие параметры как продолжительность установки соединения, ответ сервера и другие прямо или косвенно указывающие на имеющиеся или потенциальные проблемы сервера.


Еще один инструмент который стоит использовать в работе pagespeed insights. Его рекомендации не относятся напрямую к серверу (но полезную информацию можно почерпнуть), а к оптимизации сайтов. По возможности, стоит выполнить те оптимизации которые он предлагает.


Стоит учитывать, что очень часто google «ругается»… на собственные сервисы или скрипты на сторонних ресурсах. Единственное решение этой проблемы это проксирование таких ресурсов на свой сервер. Таким же образом можно решить проблему загрузки http через https.


Даже если вы каким то чудом выполните все рекомендации google будьте готовы к тому что «пузомерки» будут показывать совсем не то, что вы ожидали.

Дело даже не в том, что «тестовые» сервера находятся в США. Сам подход к тестированию а ля Google сводится к измерению параметров сферического кота в вакууме. Если ваш сервер в России или Европе то только простые одностраничники или static html сайты могут рассчитывать на хорошую оценку.


Наличие на сайте «сторонних» скриптов, «тяжелого» видео, или iframe — тяжкий грех. А уж присутствие скриптов яндекс метрики и даже «родного» google analytics карается красной пузомеркой навечно (про пиксели соцсетей лучше вообще не упоминать). Хотя если у вас быстрый сервер с гигабитным каналом...


Кроме того, вы можете использовать инструменты разработчика в браузере и различные сторонние сервисы типа https://ping-admin.ru/free_test/ и другие.


Объективные показатели


С инструментами оценки скорости сервера мы разобрались. А как оценить реальную производительность сервера при максимальных нагрузках и вычислить сколько хостов (посетителей) способен обслужить ваш сервер?


Для этого существует масса инструментов нагрузочного тестирования, например LoadRunner Professional от Hewlett Packard. Используйте его для тестирования сервера под нагрузкой. Он поможет вам оценить реальную нагрузку которую ваш сервер способен выдержать без снижения производительности. О тестировании и результатах мы еще поговорим ниже.


Кроме того, есть масса других инструментов для этих целей: locust.io, WebLOAD, Phoronix Test Suite… Кроме того, можно использовать стандартные инструменты ОС.



Пришло время от теории перейти к практике.


Выбор хостинга VPS


Это самый трудный и ответственный вопрос на который трудно получить однозначный ответ. Возможно вам поможет статья "Какой хостинг выбрать для блога на WordPress в 2020 году". Главное, необходимо четко представлять свои потребности.


Предложение VPC пока сильно превышает спрос — это хорошо. Количество хостеров выходит за все разумные пределы. Половина «хостеров» перепродавцы чужих услуг под своим брендом.


Какой хостинг VPS вам нужен


Однозначный ответ — хороший. Надежный, быстрый, цена должна соответствовать качеству. В реальности, несмотря на обилие предложений найти подходящий VPS та еще задача.


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


Критерии выбора VPS


Первое, на что стоит обратить внимание — надежность поставщика услуг. Некоторые из вас помнят недавнюю «Санта-Барбару» Айхор, а может и стали ее жертвами.


В конце января широко известный среди любителей халявы (я тоже в их числе) cloud4box порадовал своих клиентов падением на неделю (до этого он тихо глючил и умирал почти год).


Второй важный критерий при выборе VPS — скорость. Это понятие относительное, но например «высокопроизводительное решение» от не к ночи помянутого cloud4box за 1498 рублей с очень шикарными параметрами оказался втрое медленнее простого VPS от яндекс с 3 гб ОЗУ и двумя ядрами ограниченными 20% (1300 руб).


Бесплатный сыр только в мышеловке

Но у Яндекс тоже есть «подводные камни». Парадокс в том, что Яндекс КАТЕГОРИЧЕСКИ не принимает собственые яндекс.деньги...


Вывод 3:


  • Обещать, не значит жениться (за заманчивыми обещаниями хостеров высокой производительности VPS и прочих плюшек часто скрывается банальное желание заманить клиента).

Как выбрать оптимальный вариант VPS


  1. Составьте список провайдеров из которых будете выбирать
  2. Изучите отзывы. На этом этапе отсеется много потенциально привлекательных предложений. Репутация провайдера имеет значение.
  3. Узнайте о наличии у хостера собственных дата-центров и / или проверьте есть ли он в числе клиентов дата-центра где он якобы арендует площадку. Вас ждет много открытий чудных.
  4. Уровень дата-центров тоже в центре вашего внимания.
  5. Пообщайтесь с техподдержкой. Посмотрите, как быстро она реагирует на запросы и насколько внятно отвечает. Не бойтесь задавать «каверзные» вопросы
  6. Узнайте способы оплаты и условия возврата денег. Если «не возвращаем», то можно смело говорить прощай.
  7. Важное условие — возможность простой смены тарифа (изменения размера ОЗУ, количества процессоров / ядер, дискового пространства) без переустановки / переноса сервера. Ресурсы сервера, влияющие на его быстродействие, это количество процессорной мощности (CPU), дискового пространства и оперативной памяти. От этого зависит максимально возможное количество сайтов, которые можно размещать на сервере, FTP-аккаунтов, баз данных и почтовых ящиков. Эти показатели должны лежать в широком диапазоне. Проще говоря, у вас должно быть много вариантов для выбора конфигурации выделенного виртуального сервера Если не возможно, то стоит подумать о других вариантах
  8. Поинтересуйтесь ограничениями накладываемыми на VPS.
  9. Гарантированная пропускная способность каналов от 100 Мбит. Меньше не рассматривать
  10. Если система виртуализации OVZ — однозначно шлак. Даже не стоит рассматривать.
  11. Узнайте, поддерживается ли ваша ОС. VPS/VDS предполагает пользование выделенными ресурсами сервера с максимальными привилегиями, включая установку операционной системы и программного обеспечения. Однако не любая ОС может поддерживаться серверами, а ведь от неё зависит то, какие приложения можно устанавливать на сервер
  12. Наличие удобной панели управления сервером. Она должна поддерживать «бесшовное» расширение ресурсов, возможность установки / переустановки ОС, поддерживать перезагрузку сервера и в идеале поддерживать backup или хотя бы snapshot

Количество необходимых ресурсов на VPS рассчитывайте исходя из потребностей вашего проекта с учетом роста. Для маленьких и средних проектов будет достаточно 1ГБ ОЗУ и пары ядер.


Сервер имеющий 3 ГБ оперативной памяти, пару CPU при правильной настройке способен «тащить» десяток Wordpress сайтов с 30К уников при 15-18 процентной загрузке CPU.


Давать рекомендации по выбору хостера все равно, что дуть на пожар. Но все же рискну предложить несколько вариантов:


  • domen.com.ua
  • virtualdc.ru
  • mcs.mail.ru
  • сloud.yandex.ru
  • gcorelabs.com

Совет: проверьте время отклика VPS и наличие вашего IP в Spamhaus. Выдача «паленых» IP распространенная практика среди провайдеров.


Выбор ОС для VPS


  • Debian / Ubuntu, Fedora, CoreOS, CentOS, Gentoo / Calculate — семейство linux
  • Solaris, BSD, FreeBSD, Open BSD — семейство Unix подобных

Windows и macOS Server пригоден только для для садо-мазохистов и заядлых красноглазиков.


Начинающим стоит присмотреться к Debian / Ubuntu, для «guru» — Gentoo / Calculate. Я для своих проектов использую «кальку». Но это дело привычки. Ubuntu более проста и вполне может быть хорошим выбором для VPS.


Выбор панели управления для сервера


Если выбор ОС для VPS достаточно легкая задача, то выбор панели управления сервером / сайтами весьма не тривиальная задача учитывая обилие предложений. Самые популярные панели:


  • ISPConfig
  • ISPmanager
  • Vesta
  • Plesk
  • BrainyCP
  • CPanel
  • Webmin
  • oVirt
  • SolusVM
  • VMware VSphere
  • VMmanager
  • Proxmox VE
  • Virtkick
  • Sadeem
  • Archipel
  • Virtualizor
  • Xen Orchestra
  • Feathur Control Panel
  • WebVirtMgr
  • OpenNode Cloud Platform

Все панели управления достаточно удобны и функциональны. Но я рекомендую вам обратить внимание на CyberPanel. Она единственная поддерживает Open Litespeed / Litespeed Ent «из коробки». Plesk и CPanel тоже поддерживают OLS с помощью плагинов, но эта поддержка в зачаточном состоянии.


CyberPanel


CyberPanel бесплатна и имеет много преимуществ даже перед платными конкурентами:


  • Бесплатная техподдержка
  • Простота установки (устанавливается не только панель управления, но и web сервер, сервер баз данных, ftp, dns и mail сервер, php и многое другое)
  • Весь необходимый функционал доступен «из коробки»
  • Простое обновление.
  • Поддержка Docker
  • Брандмауэр
  • Резервное копирование и восстановление в один клик
  • Встроенный файл менеджер и Web Terminal

На самом деле функции и возможности Cyberpanel гораздо шире. Ее возможности и особенности достойны отдельной статьи.


cyber panelИнтерфейс CyberPanel

Выбор Web сервера


Web серверов пожалуй не намного меньше чем панелей управления. Самые распространенные:


  • Apache
  • IIS
  • nginx
  • lighttpd
  • Google Web Server

Apache очень старый вебсервер, который умеет делать всё! Он универсален. Он не требует тщательной настройки и отладки под конфигурацию сервера или проекта. На нём почти всё просто работает почти всегда. Это универсал — делает все, но посредственно. Он хорош там, где нет нагрузки и нужна эта простота. Например для разработки сайтов, для тестов.


Apache не тянет нагрузку. Там где появляется нагрузка — она будет расти в геометрической прогрессии. Даже на очень мощных серверах сайты могут «тормозить».  Если перед ним поставить nginx (что является повсеместной идиотской практикой)  для отдачи статики — тысячи.  Но там где нагрузка в десятки тысяч посещений — apache начинает захлёбываться.  Это могут подтвердить и многочисленные бенчмарки.


Nginx более прогрессивное решение, но тоже не лишен недостатков. Главные из них — сложность отдачи динамического контента, сложность конфигурирования и отладки. Не каждый webmaster и даже системный администратор способен его правильно настроить.


Про остальные сервера можно сказать одно — оно вам не нужно, впрочем, как и nginx и Apache. Есть прекрасная быстрая и бесплатная (платная версия есть) альтернатива. Это Open LiteSpeed / LiteSpeed сервер.


OpenLiteSpeed опережает по производительности Apache минимум в 9 раз, а при выполнении PHP-скриптов выигрыш в скорости составляет 50 — 70 процентов. По сравнению с nginx OLS имеет лучшие показатели при выдаче статического контента в 5-8 раза. Здесь все зависит от конкретных настроек. По крайней мере, «из коробки» OLS работает в пять раз быстрее чем «фирменные» установки nginx из дистрибутивных пакетов от «гуру» nginx.


Open LiteSpeed / LiteSpeed сервер


Open LiteSpeed / LiteSpeed сервер имеет бесплатную и платную версию. Бесплатная версия не имеет ограничений по скорости и функционалу. В ней отсутствует (вернее присутствует опционально) поддержка некоторых новейших технологий типа http3, BGR… Но ничто не мешает добавить их самостоятельно.


Цикл разработки и распространения сервера весьма оригинален. Сначала разработчики коммерческой версии внедряют новое, наступают на все грабли, «вылизывают» код, а через некоторое время уже отлаженные функции появляется в Open LiteSpeed.


OpenLiteSpeed LSWS Enterprise
Мощный механизм кэширования Более мощный движок кэша
Совместимые с Apache правила перезаписи Полная совместимость с Apache
Совместимость с CyberPanel и DirectAdmin Совместим с cPanel, Plesk, DirectAdmin, CyberPanel и другими
Неограниченные worker Количество рабочих процессов на основе лицензии (доступна бесплатная коммерческая лицензия)
Открытый исходный код Проприетарное программное обеспечение
БЕСПЛАТНАЯ поддержка сообщества Коммерческая поддержка (бесплатно)

Архитектура сервера событийно ориентированная, поддерживает мультиплексирование соединений при помощи epoll (Linux), kqueue (FreeBSD, macOS) и /dev/poll (Solaris).


Внешние приложения и дополнения запускаются как отдельные процессы, что позволяет разгрузить основной серверный процесс и увеличить эффективность обработки одновременных соединений. Обработка CGI-скриптов производится отдельным фоновым процессом. Поддерживает HTTP/2/3. Есть возможность быстрой настройки и перестройки виртуальных хостов при помощи шаблонов


Реализованы различные функции, позволяющие создавать безопасные среды: suEXEC (выполнение скриптов с правами текущего пользователя), chroot, ограничение трафика и интенсивности запросов, правила на основе содержимого Referer, механизмы Accept-filter и sendfile.


Поддерживается два вида виртуального хостинга: IP-based и Name-based. Первый вариант реализуется за счет отдельных Listener, и такой виртуальный хост имеет свой собственный IP-адрес или порт.


Binding, позволяет привязать отдельный Listener к lshttpd, который, в свою очередь, будет фактически привязан к своему CPU.


LSAPI для suEXEC PHP предлагает три варианта использования:


  • Daemon (скорость, кеширование, эффективное использование ресурсов)
  • Worker (для узлов с ограниченными ресурсами)
  • ProcessGroup (скорость Daemon и настройки Worker).

Основные возможности и особенности OpenLiteSpeed мы рассмотрим чуть позже, а пока перейдем к практической работе по установке ОС на VPS.


Установка и настройка VPS c ОС Ubuntu или Debian


Итак, вы купили / арендовали VPS. Теперь пришло время настроить его на максимальную производительность. Рассмотрим этот процесс для сервера на базе Debian / Ubuntu. Итак ОС установлена. Пришло время настройки.


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


Вход через ssh:


<code>ssh пользователь@ip</code>

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


<code>ssh -i /home/пользователь/.ssh/имя_ключа.pem пользователь@ip</code>

Если подключение прошло успешно, то вы увидите такую картинку:


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

Пришло время обновить сервер.


<code>apt update && apt upgrade
apt install atop mc</code>

Настроим файловую систему. Так как у нас VPS и внезапное отключение электричества не грозит можно пойти на некоторое снижение надежности файловой системы. Это даст прирост скорости операций с диском на 10-15 процентов.


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


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


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

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


<code>df -h

Вывод команды:
Filesystem      Size  Used Avail Use% Mounted on
udev            2.9G     0  2.9G   0% /dev
tmpfs           597M  644K  596M   1% /run
/dev/vda2        20G  2.5G   17G  14% /
tmpfs           3.0G     0  3.0G   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           3.0G     0  3.0G   0% /sys/fs/cgroup
tmpfs           597M     0  597M   0% /run/user/0
</code>

Наш диск — /dev/vda2. Тюним его.


<code>tune2fs -o journal_data_writeback /dev/vda2</code>

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


<code>/dev/vda2       /               ext4    errors=remount-ro 0       1
/swapfile                                 none            swap    sw              0       0</code>

После редактирования:


<code>/dev/vda2  / ext4  noatime,nodiratime,noacl,data=writeback,commit=15,
barrier=0,errors=remount-ro  0       1
/swapfile                                 none            swap    sw              0       0</code>

Редактируем /etc/default/grub добавляем rootflags=data=writeback. Должно получиться так: GRUB_CMDLINE_LINUX_DEFAULT=«quiet elevator=noop fsck.repair=yes rootflags=data=writeback»


<code>mcedit /etc/default/grub</code>

<code>#до редактирования. Строку ниже удалить перед сохранением файла
GRUB_CMDLINE_LINUX_DEFAULT="quiet  elevator=noop fsck.repair=yes"
# Исправлено
GRUB_CMDLINE_LINUX_DEFAULT="quiet  elevator=noop fsck.repair=yes rootflags=data=writeback"</code>

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


<code>update-grub
reboot</code>

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


Лимиты


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


mcedit /etc/sysctl.conf


Добавим в конец файла (не забыв сохранить):


<code>fs.file-max = 130000
vm.swappiness = 0

kernel.sysrq = 0

kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296

net.core.wmem_max = 8388608
net.core.rmem_max = 8388608
net.core.somaxconn = 300000
net.core.netdev_max_backlog = 8192

net.ipv4.tcp_syncookies = 0
net.ipv4.tcp_fin_timeout = 10
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.bond0.arp_ignore = 1
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.tcp_fack = 1
net.ipv4.tcp_sack = 1
net.ipv4.tcp_mem = 8388608 12582912 16777216
net.ipv4.udp_mem = 8388608 12582912 16777216
net.ipv4.udp_rmem_min = 16384
net.ipv4.udp_wmem_min = 16384
net.ipv4.tcp_rmem = 8192 87380 8388608
net.ipv4.tcp_wmem = 8192 87380 8388608
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_max_syn_backlog = 2048
net.ipv4.tcp_keepalive_time = 180
net.ipv4.tcp_keepalive_probes = 5
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_max_tw_buckets = 1000000
net.ipv4.ip_local_port_range = 1024 65535
net.nf_conntrack_max = 1000000</code>

Почему именно так? Потому что так надо. Кто хочет разобраться (что очень похвально), тот изучит документацию. На некоторых серверах, например размещенных в яндекс.облако параметры net.* можно не устанавливать. Сервер имеет только ip v6 и «локальный» ip типа 10.10.*.* — «внешний» ip сервер получает уже на уровне кластера. Далее редактируем /etc/security/limits.conf


<code>mcedit  /etc/security/limits.conf</code>

Изменим текущие параметры на более оптимальные:


<code>*                soft    nofile          130000
*                hard    nofile          130000
root             soft    nofile          130000
root             hard    nofile          130000</code>

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


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


Установка CyberPanel проста и выполняется одной командой:


<code>sh <(curl https://cyberpanel.net/install.sh || wget -O - https://cyberpanel.net/install.sh)</code>

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


<code>Initializing...
Valid IP detected...
Checking server...
Checking OS...
Detecting Ubuntu 18.04...
Checking virtualization type...
Checking root privileges...

You are runing as root...

		CyberPanel Installer v1.94

  1. Install CyberPanel.
  2. Addons and Miscellaneous
  3. Exit.
 
  Please enter the number[1-3]: 1</code>

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


<code>CyberPanel Installer v1.94
  RAM check : 71/5960MB (1.19%)
  Disk check : 2/20GB (14%) (Minimal 10GB free space)
  1. Install CyberPanel with OpenLiteSpeed.
  2. Install Cyberpanel with LiteSpeed Enterprise.
  3. Exit.
Please enter the number[1-3]: 1</code>

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


<code>Install Full service for CyberPanel? This will include PowerDNS, Postfix and Pure-FTPd.

Full installation [Y/n]: y</code>

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


<code>Full installation selected...

Press Enter key to continue with latest version or Enter specific version such as: 1.9.4 , 1.9.5 ...etc

<p>Устанавливаем пароль. Жмем <s> и вводим свой пароль (<strong>не менее 8 символов</strong>). Повторяем ввод пароля.</p>
<pre class="wp-block-code"><code>Branch name set to v1.9.4

Please choose to use default admin password 1234567,
randomly generate one (recommended) or specify the admin password?

Choose [d]fault, [r]andom or [s]et password: [d/r/s] s

Please enter your password:
12325812

Please confirm  your password:

12325812</code>

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


<code>Do you wish to install Memcached extension and backend?
Please select [Y/n]: y

Do you wish to install Redis extension and backend?
Please select [Y/n]: y

Would you like to set up a WatchDog (beta) for Web service and Database service ?
The watchdog script will be automatically started up after installation and server reboot
If you want to kill the watchdog , run watchdog kill
Please type Yes or no (with capital Y):y</code>

Установка занимает некоторое время, от 15 до 20 минут. Если установка завершена успешно вы увидите следующую информацию:


<code>###################################################################
                CyberPanel Successfully Installed                  
                                                                   
                Current Disk usage : 7/20GB (42%)                        
                                                                   
                Current RAM  usage : 256/5960MB (4.30%)                         
                                                                   
                Installation time  : 0 hrs 17 min 7 sec                      
                                                                   
                Visit: https://193.164.16.49:8090                     
                Panel username: admin                              
                Panel password: 12325812                        
                WebAdmin console username: admin                         
                WebAdmin console password: TakewFU1f5K7OJDS                
                                                                   
            Please change your default admin password              
          If you need to reset your panel password, please run:    
        	adminPass YOUR_NEW_PASSWORD     					   
                                                                   
          If you change mysql password, please  modify file in     
         /etc/cyberpanel/mysqlPassword with new password as well   
                                                                   
              Website : https://www.cyberpanel.net                 
              Forums  : https://forums.cyberpanel.net              
              Wikipage: https://docs.cyberpanel.net                
                                                                   
            Enjoy your accelerated Internet by                  
                CyberPanel & OpenLiteSpeed					                     
###################################################################
If your provider has a network-level firewall
Please make sure you have opened following port for both in/out:
TCP: 8090 for CyberPanel
TCP: 80, TCP: 443 and UDP: 443 for webserver
TCP: 21 and TCP: 40110-40210 for FTP
TCP: 25, TCP: 587, TCP: 465, TCP: 110, TCP: 143 and TCP: 993 for mail service
TCP: 53 and UDP: 53 for DNS service
Would you like to restart your server now? [y/N]: y</code>

Сохраните логины и пароли для доступа в CyberPanel и WebAdmin и перезагрузите сервер. Вы установили CyberPanel и WebAdmin, Open LiteSpeed Server, ftp, mail,dns сервера, firewall и многое другое.


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


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


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


Настраивать OLS и хосты можно текстовыми конфигурационными файлами. На мой взгляд гораздо удобнее и нагляднее настраивать сервер из WebAdmin в браузере. он доступен по адресу ip-servera:7080/. Вы получите сообщение о том, что ваше соединение не защищено.



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


WebAdmin


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


WebAdminИнтерфейс WebAdmin

Обратите внимание на предупреждение о том, что появилась новая версия сервера.


<code>CURRENT VERSION: OpenLiteSpeed 1.6.7   New Release: 1.6.8 (current branch)</code>

Обновим сервер и выполним перезагрузку.


<code>wget https://raw.githubusercontent.com/litespeedtech/
openlitespeed/master/dist/admin/misc/lsup.sh

bash lsup.sh</code>

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


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

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


Рассмотрим базовые настройки сервера и те параметры которые прямо или косвенно влияют на производительность. На самом деле, на производительность влияет в с ё. Откроем вкладку Server Configuration > General


Server Configuration &gt; GeneralServer Configuration > General

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


  • Number of Workers (количество процессов) — по умолчанию для этого параметра установлено значение «Не установлено», что соответствует 1 ядру процессора.

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


В идеале вы должны оставить некоторые потоки процессора доступными для других процессов сервера. Установите этот параметр в соответствии с вашими потребностями (или пока оставьте по умолчанию). Увеличение количества процессов не всегда ведет к увеличению производительности.


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


меньше 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. Меньшее число означает более высокий приоритет. Определяет приоритет процессов сервера. Диапазон значений от -20 до 20. Меньшее число означает более высокий приоритет.

Этот параметр напрямую зависит от параметра nice SQL (как его установить мы еще поговорим). В идеале они должны совпадать. Оптимальное значение -10. В том случае когда SQL слишком «тяжел» лучшим решением будет дать ему больший приоритет (например установить его в -15).


  • CPU Affinity («привязка» к процессору): связывает процесс с одним или несколькими процессорами (ядрами). Для процесса всегда полезно использовать один и тот же процессор, потому что тогда процесс может использовать данные, оставленные в кэше процессора.

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


Минимальное значение равно 0, что отключит эту функцию. Максимальное значение — количество ядер на сервере. Как правило, 1 является наилучшим параметром, поскольку он обеспечивает наиболее строгое использование привязки к процессору и, таким образом, максимально использует кэш-память процессора.


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

Установите буфера, чтобы вместить все одновременные запросы / ответы, чтобы избежать swap памяти на диск. Оптимальное значение для начала 120M


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

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


Поместите каталог подкачки на отдельный диск или увеличьте максимальный размер буфера ввода-вывода (смотрите выше — Memory I/O Buffer), чтобы избежать подкачки. По умолчанию это каталог /tmp/lshttpd/swap.


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


Server Configuration &gt; Tuning

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


Server Configuration > External App — настройка lsphp

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


  • 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

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


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

Пока у вас нет ни одного хоста кроме 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:


  • max_execution_time = 300
  • max_input_time = 120
  • max_input_vars = 3000
  • memory_limit = 256M; можно увеличить при необходимости
  • post_max_size = 80M
  • upload_max_filesize = 60M

Значения PHP можно изменить глобально (на уровне сервера) и «локально» — на уровне хоста. Параметры Opcache и memory_limit лучше устанавливать на уровне хоста.


«Мерлезонский балет» — акт последний: настройка SQL сервера.


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


От правильной настройки MySQL / MariaDB зависит насколько быстро будет работать ваш сервер / сайт. Все, что вы делали раньше может «превратиться в тыкву» если оставить параметры по умолчанию. Настройки mysql можно найти в /etc/mysql/my.cnf. Перед тем как вы будете создавать базы данных или переносить существующие стоит выполнить несколько простых действий:


  • Решите какой «движок» будет по умолчанию. Если у вас таблицы MyISAM, возможно стоит перейти на Aria, но лучше использовать InnoDB.
  • Установите последнюю версию MySQL / MariaDB
  • Отредактируйте /etc/mysql/my.cnf:

<code>[mysqld]
sql-mode="NO_ENGINE_SUBSTITUTION"
tmpdir      = /dev/shm
skip-external-locking
skip_name_resolve
skip-host-cache
skip-log-bin
skip-networking
skip-innodb_doublewrite
bind-address=localhost
max_connections = 60
symbolic-links=0
sync_binlog = 0
wait_timeout = 60
interactive_timeout = 5
performance_schema = ON
low-priority-updates = 1

table_open_cache = 32000
tmp_table_size = 200M
max_heap_table_size = 200M
max_allowed_packet = 64M
thread_cache_size = 60

innodb_file_format=Barracuda
innodb_flush_log_at_trx_commit = 0
innodb_flush_method = O_DIRECT_NO_FSYNC
innodb_buffer_pool_instances = 1
innodb_buffer_pool_size = 1536M
innodb_log_file_size = 256M
innodb_file_per_table	= 1
innodb_log_buffer_size = 256M
innodb_log_file_size = 192M
innodb_log_files_in_group=2

innodb_stats_on_metadata = 0
innodb_open_files =	65536
innodb_doublewrite = 0
innodb_support_xa = 0
innodb_read_io_threads = 8
innodb_write_io_threads = 8
#innodb_io_capacity=6000
#innodb_io_capacity_max=10000
innodb_thread_concurrency = 4
innodb_checksum_algorithm=crc32
innodb_log_checksum_algorithm=crc32
table_open_cache_instances = 4

[mysqldump]
quick
quote-names
max_allowed_packet	= 64M
default-character-set = utf8mb4

[mysql]
no-auto-rehash
default-character-set = utf8mb4</code>

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


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


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


<code># Number of files limit. previously [mysqld_safe] open-file-limit
LimitNOFILE=130000

# Nice priority. previously [mysqld_safe] nice
Nice=-10</code>


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


Сохраните и перезапустите systemd командой


<code>systemctl daemon-reload</code>

Не знаю, баг это или фича, но настройки сбрасываются «по умолчанию» после обновления SQL сервера. Так что будьте внимательны.


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



— Performance Metrics — [--] Up for: 1d 8h 1m 26s (3M q [31.352 qps], 20K conn, TX: 36G, RX: 660M)
[--] Reads / Writes: 98% / 2%
[--] Binary logging is disabled
[--] Physical Memory: 2.9G
[--] Max MySQL memory: 2.4G
[--] Other process memory: 132.9M
[--] Total buffers: 2.2G global + 3.6M per thread (50 max threads)
[--] P_S Max memory usage: 80M
[--] Galera GCache Max memory usage: 0B
[OK] Maximum reached memory usage: 2.3G (79.28% of installed RAM)
[OK] Maximum possible memory usage: 2.4G (84.25% of installed RAM)
[OK] Overall possible memory usage with other process is compatible with memory available
[OK] Slow queries: 0% (0/3M)
[OK] Highest usage of available connections: 18% (9/50)
[OK] Aborted connections: 0.02% (5/20914)
[--] Skipped name resolution test due to skip_networking=ON in system variables.
[OK] Query cache efficiency: 45.7% (2M cached / 6M selects)
[OK] Query cache prunes per day: 49
[OK] Sorts requiring temporary tables: 0% (221 temp sorts / 39K sorts)
[OK] No joins without indexes
[OK] Temporary tables created on disk: 1% (1K on disk / 98K total)
[OK] Thread cache hit rate: 99% (9 created / 20K connections)
[OK] Table cache hit rate:94% (48K open / 59K opened)
[OK] Open file limit used: 0% (71/130K)
[OK] Table locks acquired immediately: 100% (662K immediate / 662K locks)



— InnoDB Metrics — [--] InnoDB is enabled.
[--] InnoDB Thread Concurrency: 4
[OK] InnoDB File per table is activated
[OK] InnoDB buffer pool / data size: 1.5G/987.1M
[OK] InnoDB log file size / InnoDB Buffer pool size: 192.0M * 2/1.5G should be equal 25%
[OK] InnoDB buffer pool instances: 1
[--] InnoDB Buffer Pool Chunk Size not used or defined in your version
[OK] InnoDB Read buffer efficiency: 99.99% (151459597 hits/ 151477187 total)
[OK] InnoDB Write log efficiency: 96.88% (540590 hits/ 557984 total)
[OK] InnoDB log waits: 0.00% (0 waits / 17394 writes)



— AriaDB Metrics — [--] AriaDB is enabled.
[OK] Aria pagecache size / total Aria indexes: 128.0M/1B
[OK] Aria pagecache hit rate: 99.5% (8M cached / 46K reads)


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


Теперь все базовые настройки закончены. Можно использовать сервер. Собственно говоря тема настройки sql неисчерпаема. Например, можно «проапгрейдится» до TokuDB, запустить несколько экземпляров(инстансов) sql сервера, вынести его на другой сервер и наконец создать кластер из нескольких WEB серверов и SQL с репликацией, приклеить Load Balancer...


Заключение


Ваш сервер полностью готов к работе. Повторю еще раз: Сервер имеющий 3 ГБ оперативной памяти, пару CPU при правильной настройке способен «тащить» десяток Wordpress сайтов с 30К уников при 15-18 процентной загрузке CPU. Это при том, что мой лимит VPS от яндекс 20% CPU. То есть, сервер использует 15-18 процентов от тех «жалких» 20%.


Если нагрузка увеличится до 100-120К уников, то сервер «съест» 70-80 процентов CPU. До некоторого момента,  такой системе без разницы — обработать 1 запрос,  10 запросов или 1000  — нагрузка будет почти одинаковой, сервер и сайты на нем практически не замечают роста.


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


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


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


И это при том, что «за бортом» остались такие технологии как Redis, LSMCD (в девичестве memcache(d)). Кроме того, осталось за кадром использование связки серверного cache + LiteSpeed Cache и PageSpeed Module не говоря уже о Reverse Proxy. Это будет домашним заданием для вас и темами статей для меня.


Теперь вы можете создавать / переносить сайты. Это легко делать в CyberPanel.


Update: Кроме «серверных» оптимизаций еще есть над чем поработать на уровне сайтов. Например, в Wordpress.


На уровне сервера тоже есть простор для оптимизации, например, можно перекомпилировать ядро, php, OLS и прочее с «экстремальными» параметрами и получить еще 20 — 30 процентов ускорения.