Данный материал является серией статей, вы можете ознакомиться с остальными частями по следующим ссылкам: https://habr.com/ru/company/nixys/blog/645451/ - первая часть https://habr.com/ru/company/nixys/blog/646023/ - вторая часть Статья является обучающим материалом для начинающих администраторов, а также для разработчиков, которые хотели бы познакомиться с миром администрирования проектов. Если вы являетесь опытным администратором, можете смело пропускать данный материал. Целью серии статей является описание подготовки работы сервера со стеком LEMP (Linux, Nginx, MySQL, PHP), отмечу, что  в качестве PHP интерпретатора здесь используется Apache2, а не PHP-FPM, так как показывает практика многим разработчикам по прежнему необходим файл.htaccess, работу с которыми PHP-FPM из коробки не поддерживает.  Со своей стороны мы переносим правила из файла .htaccess в Nginx при необходимости установки PHP-FPM, однако это также занимает определенное время, зачастую разработчикам проще и быстрее внести нужные правила для текущих площадок именно в .htaccess файл.  Также статьи описывают развертывание стэка и поднятие на нем работающих площадок. Инструкция подойдет для небольших Bitrix проектов, а тажке для проектов развернутых под любой популярной CMS. Не смотря на то, что тема уже достаточно подробно отражена в сети, мы решили подробно описать общие стандарты администрирования с нуля, поскольку регулярно получаем большое количество базовых вопросов от людей, так или иначе, связанных с нашей сферой. Целью статей не является показать как развернуть идеальное окружение, а лишь указать на нюансы в работе и защитить начинающих специалистов от базовых ошибок при настройке. Во второй частье статьи будут отражены такие темы как: Базовая настройка NginxБазовая настройка Apache2Базовая настройка MySQL После базовой настройки основных компонентов сервера, пора начинать настраивать веб-сервера, начнем с Nginx. Пакет уже находится в стандартных репозиториях Debian, поэтому выполняем простую установку: Nginx в нашей конфигурации будет являться точкой входа http/https трафика и обрабатывать статичные данные. После установки начинаем конфигурировать веб-сервер, для этого переходим к файлу /etc/nginx/nginx.conf  и приводим его к следующему виду: Пробегусь по основным изменениям, которые мы добавляем относительно стандартной конфигурации: Данная строка повышает приоритет процессов Nginx в системе. Это нужно для того, чтобы при высокой нагрузке приоритет обработки отдавался процессам Nginx, что позволит отображать статичные данные площадки Повышаем количество соединений одного рабочего процесса для увеличения количества запросов в обработке. Данный параметр можно не изменять, в случае если у вас слабый сервер.   Обязательно включаем сжатие передаваемых данных: Также хочется отметить следующий формат логов: Здесь мы задаем два формата логов для Nginx. Формат логов Nixys будет являться основным, и использоваться для всех виртуальных хостов по умолчанию. Подключенные с ним логи выглядят следующим образом: Представление логов подобным образом крайне удобно при анализе, разложим строку лога для понимания: 31.31.192.22 – IP адрес клиента site.ru  - название виртуального хоста 18/Dec/2021:06:26:50 +0500 – время поступления запроса 200 – код ответа, полученный в результате выполнения запроса 0.028 – время обработки запроса Nginx (0.028)   - время обработки запроса со стороны, которой Nginx передал запрос (при необходимости). В нашем случае здесь будет отражено время, за которое Apache2 обработал соединение. 13069   - это размер переданных данных в байтах "Mozilla/5.0 (compatible; InterfaxBot/1.0; email:swabuse@interfax.ru)" – user-agent, переданные клиентом. Со своей стороны мы считаем данный формат логирования наиболее удачным, так как он позволяет максимально проанализировать ситуацию в случае возникновения проблем в работе площадки. После внесения этих изменений необходимо перечитать файлы веб-сервера. При любой операции reload или restart сервиса Nginx необходимо обязательно протестировать конфигурацию на наличие ошибок с помощью команды nginx -t, многие администраторы вначале работы забывают об этом, что может привести к простоям в работе проекта: Если все ок, то перечитываем конфигурацию веб-сервера: И обязательно проверяем статус: Обратите внимание, что после перезапуска любой службы необходимо обязательно проверить статус ее работы! На этом базовую настройку Nginx можно считать завершенной. Переходим к настройке Apache2. Устанавливаем необходимые пакеты: Если вы все делали по статье, то Apache2 сразу после установки не запустится и выдаст ошибку: Дело в том, что веб-сервер по умолчанию работает на том же порту, что и запущенный Nginx. Поэтому нам потребуется изменить стандартный 80 порт веб сервера на 81. Для этого редактируем файл /etc/apache2/ports.conf и меняем порт:  В нашем случае Apache2 работает с модулем mpm_prefork, поэтому включаем модуль командой: После нам потребуется задать параметры работы воркеров, данные параметры вы можете конфигурировать как угодно, в зависимости от нагрузки проекта; они расположены в файле /etc/apache2/mods-enabled/mpm_prefork.conf, базовая настройка выглядит следующим образом: Для того, чтобы каждый раз при проверке синтаксиса Apache2 не всплывало сообщение о том, что имя сервера не объявлено, объявляем его в файле apache2.conf Где MAIN_DOMAIN_NAME это имя основной площадки сервера. Вам также потребуется привести default виртуальный хост веб-сервера к виду: Изменять порт, на котором работает default виртуальный хост необходимо в соответствии с /etc/apache2/ports.conf. В дальнейшем вы увидите, что логи каждой площадки будут расположены в отдельной директории, однако логи стандартного виртульного хоста будут расположены согласно этим настройкам в /var/log/apache2. Также очень важно настроить корректное отображение внешнего IP адреса клиентов в логах apache2, для этого потребуется активировать следующие модули с помощью команд:  Если после этого в логах apache2 площадки фигурирует 127.0.0.1, то необходимо также внести следующие изменения в формат логов: Далее потребуется настроить безопасность веб-сервера, для этого вносим изменения в файл /etc/apache2/conf-available/security.conf: А также глобально запрещаем доступ к каталогам .svn, .git, .hg: Последним штрихом в настройке веб-сервера будет установка прав на директорию с apache2: После выполнения всех этих действий необходимо проверить синтаксис Apache2: После перезапустить веб-сервер: И как обычно, проверить статус работы: Первоначальную настройку Apache2 можно также считать завершенной.   Переходим к установке и настройке MySQL, в нашем случае это будет версия 5.7. Перед началом установки добавляем ключ репозитория командой: После добавляем нужный репозиторий в пакетный менеджер apt, для этого в конец файла /etc/apt/sources.list дописываем строки вида Обратите внимание на то, что наш сервер базируется на системе Debian 10 (buster), в случае если вы устанавливаете MySQL на другую версию дистрибутива Debian или Ubuntu, то потребуется учесть название дистрибутива в списке репозиториев. После выполняем обновление доступных пакетов в репозиториях и устанавливаем MySQL: Установка запросит дважды ввести пароль от пользователя root. Возможно потребуется модуль для работы с python, устанавливаем его командой: После установки приступаем к базовой настройке. По умолчанию ulimit (максимальное) ограничение для открытых файлов в системе для процесса составляет 1024, что очень мало, особенно для работы СУБД, увеличим лимит файлов до 8192 через systemctl: Вставляем следующий текст: Перечитываем лимиты и перезагружаем MySQL: Указываем кодировку СУБД по умолчанию, в нашем случае это UTF8, для этого вносим изменения в файл /etc/mysql/my.cnf: По умолчанию MySQL слушает только локальный IP адрес 127.0.0.1. В случае если необходимы подключения к СУБД извне, потребуется открыть порт 3306 на уровне фаервола сервера, а также указать MySQL слушать все интерфейсы сервера Для этого параметру bind-address указываем следующее значение: Здесь же в файле my.cnf указываем базовые параметры для работы СУБД: Данные параметры могут быть скорректированы под нужды проекта. Для таблиц innodb задаем хранение в отдельных файлах, чтобы избежать возможных проблем, связанных с ростом файла ibdata1: И задаем буфер для innodb обычно он равен 60-80% оперативной памяти сервера. Например, для сервера с количеством оперативной памяти 4GB можем выделить на буфер 3GB оперативной памяти: Значение также можно скорректировать по мере необходимости. В качестве безопасности, ограничиваем доступ к MySQL для пользователей системы: Перезапускаем СУБД и проверяем статус работы: Для того, чтобы каждый раз при входе в консоль MySQL не указывать пароль от root пользователя, создаем файл в домашней директории root и задаем ему права безопасности: Созданный файл должен иметь следующее содержание: Где MYSQL_ROOT_PASSWORD, это пароль от пользователя root. Теперь для подключения к консоли MySQL от root достаточно просто ввести команду mysql: На этом базовую настройку MySQL можно считать завершенной. Для оптимизации mysql вы можете использовать утилиту mysqltuner. Она есть в стандартных репозиториях. Суть ее в том, что с помощью скриптов анализируются параметры и текущие показатели mysql. В случае, если наблюдаются неоптимизированные параметры, утилита предложит изменить их. Ниже пример вывода анализа mysqltuner: В последней третьей статье будут описаны: Установка и настройка PHP Процесс создания и настройки виртуальных хостов для веб-серверов. Выдача SSH и FTP доступов для площадки Настройка почтовых записей таким образом, чтобы почта отправляемая с сервера не попадала в СПАМ. В комментариях к предыдущей статье я увидел много критики касательно содержания и уровня материала. Я не соглашусь с тем, что статьи подобного уровня ненужны сообществу. Как показывает практика нашей компании, очень много клиентов еще не готовы и контейнеризации своего проекта, в связи с чем спрос на информацию подобного плана еще высок. Данный материал не панацея, а лишь базовая инструкция, которая должна прояснить базовые моменты и указать администратору на особенности, которые нужно или не нужно делать в начале пути. Спасибо за внимание!   DevOps-инженер