Created by AIImproved by people

Riqli · living documents · updated continuously

Where AI knowledge meets human practice.

Share with friends
Linux-серверы, базы данных (MySQL/PostgreSQL) и веб-серверы (Apache/Nginx). Hard skill. (Linux. MySQL. PostgreSQL. Веб-серверы. Дистанционное образование; Образовательные услуги курсы и тренинги; Образовательные услуги частная школа; Управление человеческими ресурсами и знаниями; подготовка бортпроводников бизнес авиации.)
sections

Введение

contents

Аннотация.

Современная цифровая инфраструктура любой организации, от небольшого стартапа до крупного предприятия, немыслима без надёжной связки «операционная система — база данных — веб-сервер». Эта фундаментальная триада, состоящая из Linux-серверов, систем управления базами данных, таких как MySQL и PostgreSQL, и веб-серверов Apache и Nginx, является основой для работы подавляющего большинства веб-приложений, сайтов и корпоративных сервисов. Данный курс решает ключевую проблему разрозненности знаний, предоставляя целостную картину администрирования и настройки этих компонентов в их тесной взаимосвязи. Курс ориентирован на инженеров, администраторов и разработчиков, которые стремятся не просто запустить сервер, а построить отказоустойчивую, производительную и безопасную систему, способную выдерживать высокие нагрузки. Мы закроем пробелы в понимании того, как именно Linux управляет ресурсами, как базы данных оптимизируют запросы и как веб-серверы эффективно распределяют нагрузку, чтобы вы могли принимать обоснованные архитектурные решения.

contents

Цель курса.

После прохождения курса вы сможете самостоятельно проектировать, разворачивать, настраивать и сопровождать промышленный стек на базе Linux, MySQL/PostgreSQL и Apache/Nginx, обеспечивая его высокую доступность, производительность и безопасность в соответствии с современными стандартами и лучшими практиками.

contents

Результаты обучения.

  • Знать: архитектуру и принципы работы операционной системы Linux, систем управления базами данных MySQL и PostgreSQL, веб-серверов Apache и Nginx; основные команды администрирования, утилиты мониторинга и диагностики; модели безопасности и методы разграничения доступа на всех уровнях стека.
  • Уметь: устанавливать и настраивать Linux-серверы (включая сетевые интерфейсы, файловые системы и службы); выполнять базовую и продвинутую настройку MySQL и PostgreSQL (конфигурационные файлы, пользователи, привилегии, резервное копирование); конфигурировать виртуальные хосты, балансировку нагрузки и кеширование в Apache и Nginx; настраивать взаимодействие между веб-сервером и базами данных.
  • Владеть: навыками диагностики и устранения типовых проблем производительности (медленные запросы, утечки памяти, высокая нагрузка CPU), методами оптимизации конфигурации на основе профиля нагрузки, и инструментами автоматизации развертывания и мониторинга инфраструктуры.
contents

Для кого этот курс.

Этот курс предназначен для системных администраторов, желающих систематизировать и углубить свои знания в области управления серверным стеком. Он будет крайне полезен разработчикам (бэкенд-инженерам), которые хотят лучше понимать среду выполнения своих приложений, чтобы писать более производительный и эффективный код, а также для DevOps-инженеров, отвечающих за разработку и поддержку инфраструктуры как кода. Обучение также будет полезно студентам технических специальностей и всем, кто стремится войти в профессии, связанные с администрированием и эксплуатацией высоконагруженных систем.

Курс не предназначен для полных новичков, не имеющих базовых навыков работы с командной строкой, или для тех, кто ищет поверхностный обзор без практического применения. Программа предполагает наличие начального опыта работы с любой операционной системой семейства Unix или завершения базового курса по Linux. Мы не рассматриваем управление графическим интерфейсом или обслуживание персональных компьютеров — наш фокус исключительно на промышленных серверных решениях и сервисах дистанционного обучения.

sections

Модуль 1. Фундамент инфраструктуры: Операционная система Linux

contents

Выбор дистрибутива Linux для серверных сред: Debian vs RHEL-семейство

Путь к созданию надёжной серверной инфраструктуры начинается с выбора правильного фундамента — дистрибутива операционной системы. На рынке корпоративных серверов доминируют два основных семейства: Debian (включая Ubuntu Server) и Red Hat Enterprise Linux (RHEL) (и его производные, такие как CentOS Stream, Rocky Linux и AlmaLinux). Каждое из этих семейств имеет свою философию, набор инструментов и подходы к управлению пакетами, что напрямую влияет на стратегию администрирования. Debian и его производные используют систему управления пакетами APT и утилиту dpkg, а также предлагают огромный репозиторий программного обеспечения, что делает его привлекательным для экспериментов и проектов, требующих широкого выбора ПО. RHEL-подобные дистрибутивы, напротив, делают ставку на стабильность, предсказуемость и долгосрочную поддержку, используя пакетный менеджер DNF (преемник YUM) и формат пакетов RPM. Выбор между ними часто определяется корпоративными стандартами, требованиями к сертификации и личной предрасположенностью администратора. Для новичков и проектов с меньшими требованиями к контролю часто рекомендуется Ubuntu Server LTS, в то время как для критически важных систем в финансовом и государственном секторах предпочтение отдается RHEL с его системой сертификации. На практике, знание основных отличий позволяет легко адаптироваться к работе в любой среде, так как основные концепции Linux-серверов универсальны, а различия касаются в основном синтаксиса команд управления пакетами и расположения конфигурационных файлов. Настоятельно рекомендуется ознакомиться с официальной документацией выбранного дистрибутива, например, для Ubuntu — Ubuntu Server documentation, а для RHEL — RHEL documentation.

contents

Первоначальная настройка сервера: SSH, сеть, брандмауэр и обновления

После установки операционной системы, первый и наиболее важный этап — это обеспечение её безопасного и управляемого состояния. Базовую настройку принято начинать с удаленного доступа по протоколу SSH (Secure Shell). Критически важным действием является отключение аутентификации по паролю для пользователя root и создание отдельной учётной записи с правами суперпользователя (через sudo). Это защищает сервер от атак методом подбора паролей. Далее необходимо настроить сетевые интерфейсы, присвоив серверу статический IP-адрес или настроив DHCP-резервирование, а также прописать корректные DNS-серверы. Конфигурация сети в Linux обычно осуществляется через файл /etc/netplan/ (в Ubuntu) или /etc/sysconfig/network-scripts/ifcfg-* (в RHEL). Следующим шагом является настройка брандмауэра. Для этих целей используется утилита ufw (Uncomplicated Firewall) в Ubuntu или firewalld в RHEL. Правила должны разрешать входящие соединения только для SSH (порт 22), а также для будущих служб: HTTP/HTTPS (порты 80, 443). Все остальные порты должны быть закрыты. Завершающим этапом начальной настройки является обновление системы: синхронизация списка пакетов и установка критических обновлений безопасности. В дистрибутивах семейства Debian это делается командами sudo apt update && sudo apt upgrade -y, а в RHEL — sudo dnf update -y. Регулярное обновление системы — это базовая практика защиты от известных уязвимостей. Практический совет: настройте автоматическую отправку уведомлений об обновлениях или используйте инструменты централизованного управления, например, unattended-upgrades для Ubuntu, чтобы не пропустить важные патчи безопасности.

contents

Управление службами и процессами: systemd и основные утилиты

В современных Linux-серверах основным менеджером инициализации и служб является systemd. Он не только запускает службы при загрузке, но и управляет ими на протяжении всего времени работы. Понимание работы systemd — ключ к контролю над серверным стеком. Каждая служба описывается файлом юнита (например, nginx.service), который определяет, как её запускать, от каких других служб она зависит и в каком окружении она должна работать. Основной инструмент для взаимодействия с systemd — это утилита systemctl. Ключевые команды: systemctl start <service>, systemctl stop <service>, systemctl enable <service> (для автозапуска), systemctl status <service> для проверки состояния. Для просмотра логов служб используется команда journalctl -u <service> -f, которая выводит логи в реальном времени. Помимо управления службами, администратору необходимо уметь анализировать процессы, работающие в системе. Классические утилиты, такие как top (и её улучшенная версия htop), позволяют видеть список процессов, потребление CPU и памяти. Команда ps auxf покажет дерево процессов с родительскими и дочерними элементами. Для поиска процессов по имени используется pgrep <name>. Глубокое понимание того, как systemd управляет зависимостями и как отслеживать состояние системных служб, является неотъемлемым навыком для диагностики проблем. Например, если веб-сервер не запускается, первым делом следует проверить его статус через systemctl status и изучить логи, чтобы найти конкретную ошибку конфигурации. Анти-паттерн: игнорирование статусов служб и попытка перезапуска без анализа логов часто приводит к повторяющимся сбоям и потере времени.

contents

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

Эффективное управление дисковым пространством критически важно для серверных баз данных и веб-серверов, которые генерируют и хранят большие объемы данных. Современным стандартом управления блочными устройствами является LVM (Logical Volume Manager). LVM предоставляет абстракцию над физическими дисками, позволяя создавать гибкие логические тома (Logical Volumes) из групп физических томов (Volume Groups). Главное преимущество LVM — это возможность расширять том без остановки работы системы. Например, если журналы или данные базы данных начали заполнять раздел, вы можете быстро расширить логический том, добавив в группу физический диск или раздел, и увеличить файловую систему на лету. Типичные команды: pvcreate для инициализации физического тома, vgcreate для создания группы томов, lvcreate для создания логического тома, и lvresize для изменения размера. Для работы с файловыми системами часто используется ext4 — стабильная, проверенная временем журналируемая файловая система, или XFS, которая отличается высокой производительностью при работе с большими файлами и часто рекомендуется для баз данных. Для ограничения дискового пространства, используемого пользователями или группами, применяются дисковые квоты. Квоты настраиваются для конкретных файловых систем с помощью утилит quotacheck, edquota и quotaon. На практике, для баз данных часто выделяют отдельные логические тома с приоритетом на производительность, а для веб-серверов — тома с акцентом на гибкость расширения. Важно: всегда планируйте структуру томов и квоты на этапе проектирования системы, чтобы избежать ситуаций, когда нехватка места приводит к остановке критических служб, таких как MySQL или PostgreSQL.

sections

Модуль 2. Реляционные базы данных: MySQL и PostgreSQL

contents

Архитектурные основы MySQL и PostgreSQL: сравнение и критерии выбора

Выбор между MySQL и PostgreSQL — одно из самых частых архитектурных решений при проектировании бэкенда. Понимание их фундаментальных различий критически важно для успеха проекта. MySQL исторически позиционируется как быстрое и легковесное решение, оптимизированное для чтения, с широкой поддержкой в хостинг-среде. Его архитектура предполагает использование нескольких механизмов хранения (storage engines), среди которых доминирует InnoDB. InnoDB обеспечивает поддержку транзакций (ACID), внешних ключей и блокировок на уровне строк, что делает MySQL пригодным для приложений с высокой нагрузкой и высокими требованиями к целостности данных. PostgreSQL, напротив, является объектно-реляционной СУБД с богатой функциональностью, строгим соответствием стандартам SQL и мощной поддержкой расширений. Его конёк — это сложная аналитическая обработка, работа с геоданными (через расширение PostGIS) и нестандартными типами данных (JSONB, массивы). PostgreSQL предлагает более совершенную систему многоверсионности (MVCC), которая позволяет избежать проблем с блокировками при смешанной нагрузке. Критерии выбора: если ваш проект требует высокой скорости для простых запросов, широкой доступности, простоты репликации и вы используете преимущественно веб-технологии, MySQL может быть отличным выбором. Если же вам нужна строгая целостность данных, сложные аналитические запросы, поддержка пользовательских типов или географические данные, PostgreSQL будет более правильным решением. Важно помнить, что оба движка способны работать с огромными нагрузками, и решение часто зависит от компетенций команды и специфики задач, например, для курсов дистанционного образования со сложными отчетами предпочтительнее PostgreSQL.

contents

Установка и базовая настройка MySQL/PostgreSQL на Linux

Установка MySQL и PostgreSQL в среде Linux — это рутинная, но ответственная задача, от корректности выполнения которой зависит вся последующая работа. Процесс обычно начинается с установки из стандартных репозиториев дистрибутива с помощью менеджера пакетов. Для установки MySQL в Ubuntu используются команды sudo apt install mysql-server, а в RHEL — sudo dnf install mysql-server. После установки необходимо запустить службу и выполнить скрипт безопасной установки (sudo mysql_secure_installation), который удаляет тестовые базы данных, запрещает удаленный доступ к root и устанавливает пароль для администратора. Установка PostgreSQL происходит аналогично: sudo apt install postgresql postgresql-contrib. Важной особенностью является то, что PostgreSQL не устанавливает пароль для пользователя postgres по умолчанию, и для входа в систему необходимо использовать одноименного пользователя ОС (sudo -u postgres psql). После установки крайне важно настроить файлы конфигурации, которые находятся в /etc/mysql/ и /etc/postgresql/. Основные параметры, требующие внимания: bind-address (какой сетевой интерфейс слушает сервер), max_connections (максимальное число подключений), port и параметры буферизации данных (например, innodb_buffer_pool_size для MySQL или shared_buffers для PostgreSQL). Некорректные значения этих параметров — частая причина проблем с производительностью. Например, слишком маленький innodb_buffer_pool_size заставляет MySQL постоянно обращаться к диску, катастрофически замедляя работу. Рекомендуется выделять под буфер пула до 60-70% доступной оперативной памяти для выделенных серверов баз данных.

contents

Управление пользователями, правами доступа и безопасность баз данных

Безопасность данных — это краеугольный камень администрирования баз данных. В системах управления базами данных, таких как MySQL и PostgreSQL, управление доступом строится на принципе минимальных привилегий: каждый пользователь должен иметь только те права, которые необходимы ему для выполнения своих задач. В MySQL управление привилегиями осуществляется через таблицу user в базе данных mysql, а также с помощью команд GRANT и REVOKE. Создание пользователя происходит командой CREATE USER 'user'@'host' IDENTIFIED BY 'password';, а назначение прав — GRANT ALL PRIVILEGES ON db.* TO 'user'@'host';. Важно различать права на глобальном уровне, на уровне базы данных и на уровне таблицы. PostgreSQL предлагает более детальную и гранулярную систему привилегий, основанную на ролях (roles). Роль может быть отдельным пользователем или группой. Управление осуществляется через команды CREATE ROLE user WITH LOGIN PASSWORD 'password'; и GRANT CONNECT ON DATABASE db TO user;. В PostgreSQL также существует концепция схем (schemas), которые позволяют логически группировать объекты и управлять доступом на уровне схемы. Ключевые рекомендации по безопасности: никогда не используйте пользователя root или postgres для подключения приложений; создавайте для каждого приложения отдельного пользователя с правами только на чтение/запись в свою базу данных; обязательно используйте защищённые (не легко подбираемые) пароли. Также критически важно настроить файл хостов pg_hba.conf в PostgreSQL или параметры привилегий в MySQL, чтобы ограничить, какие хосты могут подключаться к серверу баз данных. Это предотвратит несанкционированный доступ извне.

contents

Резервное копирование и восстановление: стратегии и инструменты

Стратегия резервного копирования является важнейшим элементом эксплуатации любой базы данных. Регулярные и проверяемые бэкапы — это последняя линия обороны в случае сбоя оборудования, ошибки разработчика или кибератаки. Для MySQL основным инструментом для логического бэкапа является утилита mysqldump. Она создает SQL-скрипт, который содержит все команды для воссоздания структуры и данных базы. Команда для бэкапа: mysqldump -u [user] -p[password] [database] > backup.sql. Однако для больших баз данных логический бэкап может занимать много времени и замедлять работу сервера. В таких случаях используются физические бэкапы с помощью Percona XtraBackup, который позволяет создавать «горячие» копии файлов данных без остановки сервера. В PostgreSQL основным средством создания логических бэкапов является pg_dump (pg_dump -U postgres dbname > db.sql). Для физического копирования файлов данных используется инструмент pg_basebackup, который является основой для создания реплик и может выполняться в фоновом режиме. Восстановление из бэкапа производится обратными командами: в MySQL — mysql -u [user] -p[password] [database] < backup.sql, в PostgreSQL — psql -U postgres dbname < db.sql. Критически важным аспектом является стратегия периодичности: рекомендуется выполнять полный бэкап ежедневно и сохранять журналы транзакций (WAL в PostgreSQL, binlog в MySQL) для точечного восстановления (PITR — Point-In-Time Recovery). Это позволяет восстановить базу данных на любой момент времени до сбоя. Всегда проверяйте ваши бэкапы на возможность восстановления на тестовом сервере — это единственный способ убедиться в их работоспособности.

contents

Оптимизация запросов и индексация для повышения производительности

Самый частый узкий горлышек в производительности веб-приложений — это медленные запросы к базе данных. Главный инструмент для решения этой проблемы — правильное использование индексов. Индексы — это структуры данных, которые позволяют базе данных быстро находить нужные строки без полного сканирования таблицы. В большинстве случаев столбцы, участвующие в условиях WHERE, JOIN и ORDER BY, должны быть проиндексированы. Однако чрезмерное количество индексов замедляет операции вставки и обновления данных. В MySQL для анализа запросов используется оператор EXPLAIN перед запросом: EXPLAIN SELECT * FROM users WHERE email = 'user@example.com';. Анализ его вывода показывает, используется ли индекс (key) и сколько строк сканируется (rows). В PostgreSQL есть аналогичный оператор EXPLAIN, а также более детальный EXPLAIN ANALYZE, который выполняет запрос и предоставляет фактическую информацию о времени выполнения. Помимо индексов, важна сама структура запросов: избегайте SELECT *, запрашивайте только необходимые столбцы; старайтесь использовать объединения (JOIN) вместо подзапросов, когда это возможно; используйте агрегирующие функции эффективно. Огромное влияние на производительность оказывает и конфигурация сервера. Например, увеличение размера кэша (innodb_buffer_pool_size для MySQL, shared_buffers для PostgreSQL) позволяет хранить больше данных в оперативной памяти, сокращая дисковые операции ввода-вывода. Рекомендация: регулярно анализируйте медленные логи (slow query log) вашей СУБД, чтобы находить и оптимизировать самые проблемные запросы. Практический пример: добавление простого индекса на столбец last_login в таблице пользователей может ускорить выборку по нему в сотни раз.

sections

Модуль 3. Веб-серверы: Apache и Nginx

contents

Архитектура веб-серверов: Apache (процессная модель) против Nginx (асинхронной модели)

Архитектурное различие между Apache и Nginx определяет их применение в современных высоконагруженных системах. Apache — это классический веб-сервер, который исторически использовал процессную или поточную модель обработки запросов. Это означает, что для каждого входящего подключения создаётся новый процесс или поток. При большом количестве одновременных соединений (например, десятки тысяч) это приводит к огромным накладным расходам на переключение контекста и потребление памяти, что может быстро истощить ресурсы сервера. Несмотря на это, Apache остаётся крайне гибким и мощным благодаря модульной архитектуре, которая позволяет динамически загружать и выгружать модули (например, модули для разных языков программирования). Nginx, напротив, построен на асинхронной, событийно-ориентированной архитектуре. Вместо создания отдельного процесса на каждое соединение, Nginx использует один (или несколько) рабочих процессов, которые не блокируются при обработке запросов, а используют очереди событий. Это позволяет ему эффективно обрабатывать десятки и сотни тысяч одновременных соединений с минимальными затратами памяти, что делает его бесспорным лидером для высоконагруженных проектов, таких как стриминговые платформы и крупные онлайн-сервисы. Выбор между ними часто сводится к компромиссу: Apache прост в настройке и имеет богатую экосистему модулей, идеален для сложной логики доступа и аутентификации, в то время как Nginx обеспечивает непревзойдённую производительность и скорость работы со статическим контентом, а также выступает в качестве мощного обратного прокси. На практике, классическая связка «Nginx впереди Apache» позволяет сочетать их сильные стороны: Nginx отдаёт статику и проксирует запросы к Apache для динамической обработки.

contents

Настройка виртуальных хостов: хостинг нескольких сайтов на одном сервере

Виртуальные хосты (Virtual Hosts) — это технология, позволяющая запускать несколько веб-сайтов или приложений на одном физическом или виртуальном сервере. Это основа для эффективного использования ресурсов, особенно в облачных средах и в курсах по управлению человеческими ресурсами для разработчиков. В Apache настройка виртуальных хостов выполняется в файлах конфигурации, которые обычно находятся в /etc/apache2/sites-available/. Для каждого сайта создается свой файл, например, example.com.conf, который содержит директивы <VirtualHost *:80> и <VirtualHost *:443> для HTTPS. Внутри указываются ServerName (доменное имя), DocumentRoot (путь к папке с файлами сайта) и логи. Для активации хоста используется команда a2ensite. В Nginx аналогичный механизм реализован через блоки server {} в файлах, расположенных в /etc/nginx/sites-available/. Активация происходит через создание символической ссылки в sites-enabled или с помощью директивы include. В Nginx также важна директива server_name, которая определяет, какой домен обрабатывает данный блок. При использовании SSL/TLS для защищенных соединений, в конфигурацию добавляются параметры ssl_certificate и ssl_certificate_key. Критическая практика: после изменения конфигурации всегда проверяйте её синтаксис перед перезагрузкой. Для Apache это делается командой apachectl configtest, а для Nginxnginx -t. Это предотвращает ситуации, когда ошибка в конфигурации приводит к остановке всего веб-сервера. Анти-паттерн: использование одного виртуального хоста для множества приложений, так как это усложняет управление, разграничение прав и безопасность.

contents

Настройка обратного прокси и балансировки нагрузки в Nginx и Apache

Обратное проксирование — это ключевая архитектурная практика, когда веб-сервер принимает запросы от клиентов и перенаправляет их внутренним серверам. Это обеспечивает дополнительный уровень безопасности, скрывая внутреннюю инфраструктуру, и позволяет гибко распределять нагрузку. Nginx является эталонным инструментом для этих задач. Его настройка выполняется с помощью директивы proxy_pass внутри блока location. Например, чтобы проксировать все запросы на бэкенд-приложение, работающее на порту 8080, используется конструкция: proxy_pass http://localhost:8080;. Для балансировки нагрузки Nginx предлагает модуль upstream, где можно объявить группу серверов-бэкендов: upstream backend { server 10.0.1.2:80; server 10.0.1.3:80; }. Затем в proxy_pass указывается имя этой группы: proxy_pass http://backend;. Nginx поддерживает несколько алгоритмов балансировки, включая round-robin (по умолчанию), least-connected и ip-hash. Apache также умеет работать как обратный прокси через модули mod_proxy и mod_proxy_balancer. Настройка осуществляется с помощью директив ProxyPass и ProxyPassReverse. Для балансировки используется директива <Proxy balancer://...>. Важнейшим аспектом настройки является правильная передача заголовков клиента, таких как X-Forwarded-For, чтобы приложения знали реальный IP-адрес пользователя. Эта конфигурация критична для корректного логирования, анализа и работы сессий. Рекомендация: для статических файлов (CSS, JS, изображений) лучше настроить прямой отдачу статики через веб-сервер, не проксируя запросы к бэкенду, что многократно увеличит скорость загрузки.

contents

Кеширование на уровне веб-сервера для повышения производительности

Кеширование — это один из самых эффективных способов снизить нагрузку на сервер и ускорить доставку контента пользователям. Современные веб-серверы предлагают мощные инструменты для кеширования статических и даже динамических данных. Nginx предоставляет модуль proxy_cache, который позволяет кешировать ответы от проксируемых серверов. Настройка включает объявление зоны кеша: proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=1g;. Затем зона активируется в блоке location или server с помощью proxy_cache my_cache;. Nginx также отлично справляется с микро-кешированием, когда ответ кешируется на короткий промежуток времени (1-5 секунд), что позволяет сгладить пиковые нагрузки. В Apache функционал кеширования реализован через модули mod_cache, mod_cache_disk и mod_cache_socache. Конфигурация может быть более сложной, но также эффективной. Помимо серверного кеширования, веб-серверы используются для настройки клиентского кеширования через заголовки HTTP. Например, директива expires 1d; в Nginx или аналогичная ExpiresDefault в Apache указывает браузеру кешировать статические ресурсы на сутки, радикально сокращая количество повторных запросов. Критическое дополнение — это поддержка сжатия. Включение gzip или brotli сжатия уменьшает размер передаваемых данных на 60-80%, что значительно улучшает время загрузки для пользователей с медленным интернетом. В Nginx это делается с помощью gzip on; и gzip_types text/plain text/css application/json ...;. Все эти настройки являются частью повседневной практики инженера по эксплуатации для обеспечения высокой производительности образовательных услуг и других онлайн-платформ.

sections

Модуль 4. Связка и взаимодействие компонентов

contents

Установка и настройка связки LAMP (Linux, Apache, MySQL, PHP) и LEMP (Linux, Nginx, MySQL, PHP)

Классические стеки LAMP и LEMP являются основой для большинства веб-приложений, включая популярные системы управления контентом, электронные платформы для дистанционного образования и веб-сайты. Установка и правильная настройка этой связки — базовый навык администратора. Стек LAMP начинается с установки веб-сервера Apache и интерпретатора PHP. В Ubuntu это делается через sudo apt install apache2 php libapache2-mod-php. Затем устанавливается база данных (например, MySQL или PostgreSQL) и модуль для связи PHP с СУБД (php-mysql или php-pgsql). Важно настроить обработку PHP-файлов в Apache через модуль php7.x и указать индексный файл (DirectoryIndex index.php index.html). В стеке LEMP вместо Apache используется Nginx. Поскольку Nginx не имеет встроенного модуля для обработки PHP, необходимо установить и настроить PHP-FPM (FastCGI Process Manager). Установка: sudo apt install nginx php-fpm php-mysql. В конфигурации виртуального хоста Nginx добавляется блок location ~ \.php$, который передаёт запросы на PHP-FPM через сокет или TCP-порт (обычно /run/php/php7.4-fpm.sock). Важнейшим отличием является то, что PHP в связке с Nginx работает как отдельный сервис, что даёт больше гибкости в настройке, например, можно использовать разные версии PHP для разных виртуальных хостов. Для обоих стеков критически важно настроить права доступа: файлы сайта должны принадлежать пользователю веб-сервера (www-data), а права на каталоги (например, для загрузки файлов) должны быть строго ограничены, чтобы предотвратить веб-шелы и другие атаки. Этот фундаментальный процесс подробно описан в официальной документации на LAMP на Ubuntu.

contents

Конфигурирование пулов процессов PHP-FPM для работы с Nginx

При использовании стека LEMP, ключевым компонентом, отвечающим за обработку динамического контента, является PHP-FPM. Это менеджер процессов PHP, который принимает запросы от Nginx и обрабатывает их. Его гибкость заключается в возможности создавать отдельные пулы процессов для разных веб-сайтов или приложений. Каждый пул описывается в файле конфигурации /etc/php/7.4/fpm/pool.d/ (например, www.conf). В конфигурации пула можно настроить такие параметры, как pm (менеджер процессов), pm.max_children (максимальное число дочерних процессов), pm.start_servers, pm.min_spare_servers и pm.max_spare_servers. Правильная настройка этих параметров критически важна для производительности и стабильности. Например, тип менеджера dynamic автоматически регулирует количество процессов в зависимости от нагрузки, что подходит для большинства сценариев. Если нагрузка предсказуема, можно использовать static менеджер, который устанавливает фиксированное число процессов. pm.max_children — это самый важный параметр; он определяет, сколько запросов может обрабатываться одновременно. Если его значение слишком мало, то при пиковой нагрузке часть запросов будет ждать в очереди, что замедлит ответ. Если слишком велико — это может привести к исчерпанию оперативной памяти. Рекомендуется начинать с расчёта: (объем RAM - объем памяти для ОС и служб) / средний объем памяти на один PHP-процесс (около 10-30 МБ). Также стоит настроить время выполнения скриптов (max_execution_time) и лимиты на размер загружаемых файлов (upload_max_filesize). Для повышения производительности всегда стремитесь использовать сокеты Unix вместо TCP-портов для связи Nginx и PHP-FPM, так как это уменьшает задержки. Отслеживание состояния пулов осуществляется через веб-страницу статуса, которую можно включить в конфигурации.

contents

Настройка SSL/TLS и организация HTTPS на серверах Apache и Nginx

Шифрование трафика с помощью протокола HTTPS является сегодня не просто рекомендацией, а строгим требованием для любого веб-проекта, особенно если он обрабатывает личные данные пользователей, как это происходит в сферах управления человеческими ресурсами и здравоохранения. Настройка HTTPS включает в себя получение и установку цифровых сертификатов. Современный стандарт — это бесплатные и автоматические сертификаты от Let's Encrypt, которые получаются через агент Certbot. Установка сертификата в Nginx и Apache универсальна: в конфигурации виртуального хоста для порта 443 добавляются директивы ssl_certificate и ssl_certificate_key, указывающие на файлы сертификата и приватного ключа. Пример для Nginx:

server {
    listen 443 ssl;
    server_name example.com;
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    # ... остальная конфигурация
}
Важно не просто включить HTTPS, но и настроить его правильно, используя современные стандарты безопасности. Это включает в себя настройку безопасных шифров (ssl_ciphers), протоколов (отключение TLSv1.0 и TLSv1.1 в пользу TLSv1.2 и TLSv1.3), а также включение HSTS (HTTP Strict Transport Security), который заставляет браузеры всегда использовать HTTPS. Для автоматического перенаправления пользователей с HTTP на HTTPS, добавляется отдельный блок serverNginx) или директивы RewriteRuleApache). Обязательным шагом является настройка автоматического продления сертификатов, так как их срок действия составляет 90 дней. Certbot позволяет автоматизировать этот процесс через cron-задачу или встроенные хуки. Критический совет: после изменения конфигурации и перезагрузки сервера всегда проверяйте свой сайт на SSL Labs Test, чтобы убедиться в отсутствии уязвимостей и получить оценку A+.

contents

Настройка веб-сервера для работы с базой данных: строки подключения и пулы соединений

Соединение между веб-приложением и базой данных — это критический путь, требующий тщательной настройки как на уровне кода, так и на уровне инфраструктуры. Центральным элементом является строка подключения (DSN — Data Source Name), которая содержит все необходимые параметры: тип СУБД, хост, порт, имя базы данных, пользователя и пароль. Для MySQL строка может выглядеть так: mysql:host=localhost;dbname=myapp;charset=utf8mb4, а для PostgreSQL: pgsql:host=localhost;port=5432;dbname=myapp;user=app_user;password=secret. Критически важным аспектом является управление пулами соединений. Создание нового подключения к базе данных — это дорогостоящая операция, которая может занимать десятки миллисекунд и потреблять ресурсы. Пулы соединений решают эту проблему, создавая заранее определённое количество подключений и переиспользуя их для обработки запросов. В большинстве современных веб-фреймворков и в самом PHP (начиная с версии 8.1) есть встроенная поддержка пулов. В Apache с mod_php пул обычно работает на уровне процесса, а в связке Nginx и PHP-FPM — на уровне пула воркеров. Параметры пула, такие как max_connections в настройках СУБД и максимальное количество рабочих процессов в PHP-FPM, должны быть согласованы. Например, если PHP-FPM настроен на 100 дочерних процессов, а MySQL допускает только 50 подключений, это приведёт к ошибкам «Too many connections». Также важно настраивать тайм-ауты: как для подключения к базе данных, так и для выполнения запросов, чтобы избежать зависших сессий. Размещение соединения с базой данных в локальной сети через выделенный сервер баз данных является передовой практикой, которая повышает безопасность и производительность, так как уменьшает задержки на передачу данных.

sections

Модуль 5. Мониторинг, производительность и диагностика проблем

contents

Мониторинг системных ресурсов: CPU, память, диск и сеть в Linux

Представление о том, как и когда система испытывает перегрузку, — это основа эффективного администрирования. Мониторинг системных ресурсов позволяет предупреждать сбои и оптимизировать производительность. В Linux существует набор утилит, которые каждый администратор должен знать. Утилита top и её более продвинутая версия htop показывают нагрузку на процессор, потребление памяти и активные процессы в реальном времени. Команда vmstat предоставляет информацию о системных процессах, памяти, обмене (swap), вводе-выводе и прерываниях. Это незаменимый инструмент для поиска проблем с вводом-выводом или утечками памяти. Для мониторинга дискового пространства используется df -h, а для анализа использования дискового пространства и файлов — du -sh *. Потребление сетевого трафика можно отслеживать с помощью iftop или nethogs, которые показывают, какие процессы и адреса потребляют трафик. Критически важным является мониторинг нагрузки (load average), который показывает среднее количество процессов в очереди на выполнение. Высокое значение load average может указывать на нехватку процессорных ресурсов или большую очередь на ввод-вывод. Все эти инструменты позволяют получить моментальный снимок состояния системы. Для постоянного мониторинга используются более сложные системы, такие как Prometheus и Grafana, которые собирают метрики со временем и визуализируют их. Рекомендация: настройка оповещений (alerts) на основе критических значений, например, при заполнении диска на 90% или превышении 80% использования CPU.

contents

Анализ логов веб-сервера и базы данных для выявления аномалий

Логирование — это «глаза и уши» администратора, позволяющие увидеть, что происходило в системе в прошлом. Анализ логов — первый шаг в расследовании инцидентов и поиске узких мест. Логи веб-серверов (Apache и Nginx) обычно находятся в /var/log/apache2/access.log и /var/log/nginx/access.log, а ошибки — в error.log. Access log содержит информацию о каждом запросе: IP-адрес клиента, временная метка, метод запроса, URL, статус ответа (код HTTP) и количество переданных байт. Анализ этого лога позволяет выявить популярные страницы, самые медленные запросы и попытки злонамеренного доступа (например, по кодам 404 или 403). Инструмент goaccess позволяет просматривать логи в реальном времени в интерактивном веб-интерфейсе. Логи баз данных не менее важны. В MySQL для этих целей используется slow query log, который нужно включить в конфигурации. В PostgreSQL аналогичную функцию выполняют параметры log_min_duration_statement. Анализируя медленные запросы, вы можете понять, какие операции требуют оптимизации. Для централизованного сбора и анализа логов часто используются стеки ELK (Elasticsearch, Logstash, Kibana) или EFK (Elasticsearch, Fluentd, Kibana), которые позволяют собирать логи со всех серверов в одном месте, строить дашборды и быстро искать информацию по сложным запросам. Практический совет: всегда устанавливайте инструмент logrotate для ротации логов, чтобы они не заполнили всё дисковое пространство. Типовой файл /etc/logrotate.d/nginx позволяет управлять архивацией и удалением старых логов.

contents

Диагностика и решение проблем с производительностью: стратегия поиска узких мест

Когда веб-приложение начинает работать медленно, крайне важно иметь системную методологию для определения первопричины. Первым делом нужно установить, где именно возникает задержка: на уровне сети, веб-сервера, PHP-обработчика или базы данных. Ключевой инструмент для этого — curl с параметром -w, который позволяет измерить время выполнения запроса на стороне клиента. Если проблема на стороне сервера, проверяется загрузка CPU и дисковый ввод-вывод с помощью top и iostat. Если CPU загружен на 100%, это указывает на неэффективные алгоритмы в коде приложения или недостаток ресурсов, которые можно решить увеличением количества воркеров в PHP-FPM или масштабированием. Если дисковый ввод-вывод чрезвычайно высок, проблема, скорее всего, в базе данных — это могут быть неоптимизированные запросы, недостаток индексов или недостаточный размер буферного пула. В этом случае анализ slow query log является обязательным. Иногда проблема кроется во внешних факторах, таких как медленный DNS-резолвинг, или в том, что один из бэкенд-сервисов работает нестабильно. Для тестирования сети используются утилиты ping и traceroute. Протокол HTTP/2 и его мультиплексирование также могут повысить производительность. Важно вести документацию по инцидентам, чтобы в будущем быстрее решать похожие проблемы. Анти-паттерн: попытка решить проблему, увеличив ресурсы сервера без анализа, часто приводит лишь к временному облегчению, в то время как корневая проблема остаётся нерешенной, и после роста нагрузки снова даёт о себе знать.

sections

Модуль 6. Автоматизация и современные практики

contents

Автоматизация развертывания с помощью Ansible: инфраструктура как код

Современное администрирование Linux-серверов всё чаще отходит от ручного управления к парадигме «инфраструктура как код» (IaC). Ansible — это один из самых популярных инструментов для автоматизации, который использует декларативный язык YAML для описания желаемого состояния системы. В отличие от сложных агентных систем, Ansible работает по протоколу SSH, что делает его очень простым в освоении. Основной строительный блок Ansible — это плейбук (playbook), который описывает последовательность задач, выполняемых на целевых хостах. Например, плейбук может содержать задачи: «Установить пакет nginx», «Скопировать файл конфигурации my-site.conf», «Перезапустить службу nginx». Это позволяет гарантировать, что все серверы в инфраструктуре настроены идентично, и исключает человеческий фактор. С помощью Ansible можно автоматизировать развертывание всего стека LEMP или LAMP на сотнях серверов за считанные минуты. Также Ansible используется для управления конфигурациями, развертывания приложений и организации оркестровки. Ключевым понятием является инвентарь (inventory), где описываются все управляемые хосты и группы. Для безопасного хранения паролей и ключей используются Ansible Vault. Рекомендация: хранить все плейбуки в системе контроля версий, например, Git, чтобы иметь историю изменений и возможность отката. Это критически важно для поддержки дистанционного образования и других сервисов, где время простоя недопустимо.

contents

Виртуализация и контейнеризация: Docker для изоляции сервисов

Традиционная модель «одна ОС — одно приложение» устарела. Контейнеризация, лидером которой является Docker, революционизировала способы упаковки, поставки и запуска приложений. Контейнеры обеспечивают легковесную изоляцию процессов, используя ресурсы ядра хост-системы, что позволяет запускать несколько изолированных приложений на одном сервере. Для администратора стека это даёт огромные преимущества: приложение и его зависимости (библиотеки, версии, конфигурации) упаковываются в неизменяемый образ (Docker image). Это решает проблему «у меня на локальной машине всё работает» и гарантирует, что код будет выполняться одинаково в средах разработки, тестирования и производства. В контексте нашего стека, можно запустить каждый сервис (веб-сервер, PHP-FPM, базу данных) в отдельном контейнере. Это позволяет, например, легко обновлять MySQL или PostgreSQL, просто запустив новый контейнер с новой версией, без риска повредить другие части системы. Для координации нескольких контейнеров, составляющих одно приложение, используется Docker Compose, который позволяет описать всю архитектуру в одном docker-compose.yml файле. Однако стоит помнить, что контейнеризация требует переосмысления традиционных подходов к логированию, мониторингу и управлению состоянием (хранить данные БД вне контейнера, в томах). Важно: контейнеры не являются полноценной заменой виртуальным машинам, если требуется полная изоляция ядра; но они отлично подходят для микросервисной архитектуры и CI/CD пайплайнов.

contents

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

Когда количество контейнеров и серверов перерастает возможности ручного управления, на помощь приходят системы оркестрации, флагманом среди которых является Kubernetes (k8s). В отличие от Docker, который управляет отдельным контейнером на одной машине, Kubernetes управляет кластером машин, автоматизируя развертывание, масштабирование и управление контейнерами в огромном масштабе. Основная абстракция Kubernetes — это Pod, который является минимальной единицей, содержащей один или несколько контейнеров, разделяющих сеть и хранилище. Контроллеры (например, Deployment) управляют состоянием подов, обеспечивая нужное количество реплик и автоматически перезапуская контейнеры при сбоях. Kubernetes также предлагает мощный механизм для управления сетевым трафиком (Ingress), который может выступать в роли того же Nginx, распределяя нагрузку между подами. С помощью Kubernetes можно реализовать стратегии «сине-зеленого» развертывания и канареечных релизов, постепенно переключая трафик на новую версию приложения, что минимизирует риски. Настройка Kubernetes для боевых нагрузок требует отдельной экспертизы, однако его использование становится стандартом для крупных проектов и сервисов, таких как платформы для управления человеческими ресурсами, где критически важны высокая доступность и возможность горизонтального масштабирования. Для локальной разработки и обучения часто используется Minikube или kind (Kubernetes in Docker).

contents

Современные подходы к мониторингу и визуализации: Prometheus и Grafana

Традиционные утилиты командной строки предоставляют лишь моментальный снимок, тогда как для эксплуатации сложных систем необходим непрерывный сбор метрик. Prometheus и Grafana стали отраслевым стандартом для этой задачи. Prometheus — это система мониторинга и оповещения, которая собирает метрики (например, CPU, memory, количество запросов, время ответа) с ваших серверов и служб с заданным интервалом (pull-модель). Он хранит данные во временных рядах (TSDB) и предоставляет мощный язык запросов PromQL для их анализа. Например, запрос rate(http_requests_total[5m]) покажет скорость запросов в секунду за последние 5 минут. Grafana же выступает в роли слоя визуализации, который подключается к Prometheus (и многим другим источникам данных) и позволяет создавать красивые, информативные дашборды. С помощью Grafana можно в реальном времени видеть нагрузку на все компоненты: веб-серверы, базы данных и приложения. Самое важное, что Prometheus позволяет легко настраивать Alertmanager для отправки оповещений в Telegram, Slack или по email при наступлении определённых событий, например, если нагрузка на сервер MySQL превышает критический порог в течение 5 минут. Эта связка даёт администратору полную картину происходящего в инфраструктуре и позволяет оперативно реагировать на проблемы, ещё до того, как они повлияют на конечных пользователей.

sections

Вопросы и ответы для самопроверки


questions

Какой параметр в конфигурации Nginx используется для проксирования запросов к внутреннему серверу?

answersCorrect

Директива proxy_pass

explanations

Директива proxy_pass является основным инструментом в Nginx для настройки обратного прокси. Она определяет URL, на который будут перенаправляться запросы, соответствующие определённому блоку location. Например, proxy_pass http://localhost:8080; перенаправляет трафик на приложение, запущенное локально на порту 8080.

answersWrong

Директива fastcgi_pass

answersWrong

Директива proxy_redirect

answersWrong

Директива rewrite


questions

Какая команда используется для создания резервной копии базы данных PostgreSQL?

answersCorrect

pg_dump -U postgres dbname > backup.sql

explanations

Утилита pg_dump является стандартным инструментом для создания логической резервной копии в PostgreSQL. Команда выгружает структуру и данные указанной базы данных в SQL-скрипт, который затем можно использовать для восстановления. Параметр -U указывает имя пользователя для подключения к серверу.

answersWrong

mysqldump -u root -p dbname > backup.sql

answersWrong

pg_basebackup -D /backup

answersWrong

tar -czvf backup.tgz /var/lib/postgresql


questions

Какой инструмент является основным для управления сервисами в современных Linux-дистрибутивах?

answersCorrect

systemd и утилита systemctl