Установка LAMP на Ubuntu: Apache, MySQL и PHP

Установка LAMP-стека на Ubuntu: Apache, MySQL и PHP

Марина
Марина
📅 18 сентября 2026
Установка LAMP-стека на Ubuntu: Apache, MySQL и PHP

LAMP — это связка из четырёх программ, на которой работает большая часть сайтов на PHP: Linux как операционная система, Apache как веб-сервер, MySQL как база данных и PHP как язык, на котором написан сам сайт. Ставится всё это одной командой apt install apache2 mysql-server php libapache2-mod-php php-mysql, а полная настройка с проверкой каждого компонента занимает около 20 минут. Для учебного проекта и небольшого сайта хватает VPS с Ubuntu 24.04 в конфигурации 1 ядро и 1 ГБ памяти — такие тарифы начинаются от 59 ₽/мес.

Материал для тех, кто впервые арендовал сервер и хочет получить рабочую площадку под сайт на PHP: WordPress, Bitrix или самописный движок. Разберём подготовку сервера, установку всех четырёх компонентов по шагам, защиту базы и виртуальные хосты. В конце — разница между LAMP и LEMP с nginx, частые ошибки и цены на подходящие серверы.

Из чего состоит LAMP и зачем нужен каждый компонент

Аббревиатура собрана из первых букв четырёх названий. Linux — операционная система сервера, в нашем случае Ubuntu. Apache принимает запросы на порты 80 и 443 и решает, что отдать в ответ. MySQL хранит данные сайта: тексты, товары, пользователей. PHP выполняет код и превращает данные из базы в готовую HTML-страницу.

Работает это по цепочке. Запрос приходит на порт 80, Apache HTTP Server смотрит на расширение файла: картинку или CSS отдаёт с диска напрямую, а .php передаёт интерпретатору. Тот выполняет код, обращается к MySQL за данными и возвращает Apache готовый HTML. Весь цикл укладывается в 50–200 мс.

Схема существует с конца девяностых и остаётся самой предсказуемой для новичка: под неё написана документация всех популярных CMS — готовых систем управления сайтом вроде WordPress, — а девять из десяти готовых инструкций рассчитаны именно на Apache с файлом .htaccess. Альтернативу с nginx разберём отдельным разделом.

Компонент Пакет в Ubuntu За что отвечает Где лежит конфиг
Apache apache2 Принимает HTTP-запросы, отдаёт файлы /etc/apache2/
MySQL mysql-server Хранит данные сайта в таблицах /etc/mysql/
PHP php, libapache2-mod-php Выполняет код страниц /etc/php/8.3/apache2/php.ini
Связка PHP и базы php-mysql Даёт PHP доступ к MySQL отдельного конфига нет

Что подготовить до установки: сервер, доступ и домен

Перед первой командой нужны три вещи. Первая — сервер с чистой Ubuntu. Подойдёт версия 24.04 LTS: буквы LTS означают долгую поддержку, обновления безопасности выходят 5 лет, до апреля 2029 года. Версия 22.04 тоже годится, отличие в версиях пакетов: в 24.04 приезжают PHP 8.3 и MySQL 8.0, в 22.04 — PHP 8.1.

Вторая — доступ по SSH, защищённому протоколу подключения к консоли сервера. Провайдер присылает IP-адрес, логин root и пароль сразу после создания машины. Подключаются командой ssh root@203.0.113.10. Если делаете это впервые, разберитесь заранее, зачем нужны ключи вместо пароля.

Третья — домен, направленный на IP сервера A-записью. Без домена сайт тоже откроется, по адресу вида http://203.0.113.10, но выпустить сертификат не получится. Обновление DNS занимает от 5 минут до 4 часов. И последнее перед стартом: обновите пакеты командой apt update && apt upgrade -y — это займёт 1–3 минуты и избавит от половины странных ошибок.

Цепочка обработки запроса в стеке LAMP
На Ubuntu 24.04 из штатного репозитория приезжают PHP 8.3 и MySQL 8.0, на 22.04 — PHP 8.1.

Пошаговая установка LAMP на Ubuntu 24.04

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

Ориентировочное время — 15–25 минут, большая часть уходит на скачивание пакетов: на канале 100 Мбит/с это меньше минуты.

  1. Поставьте веб-сервер: apt install apache2 -y. Проверьте статус командой systemctl status apache2 — в выводе должно быть слово active (running).
  2. Откройте порты: ufw allow 'Apache Full' разрешает сразу 80 и 443. Затем включите сам фаервол — сетевой фильтр сервера — командой ufw enable.
  3. Откройте в браузере http://ваш-IP. Должна появиться страница Apache с надписью It works. Если её нет — проблема в фаерволе, а не в веб-сервере.
  4. Поставьте базу: apt install mysql-server -y. Сразу после этого выполните mysql_secure_installation — про неё в следующем разделе.
  5. Поставьте язык и модуль связки: apt install php libapache2-mod-php php-mysql -y. Пакет libapache2-mod-php встраивает интерпретатор в Apache.
  6. Перезапустите веб-сервер: systemctl restart apache2. Без этого браузер будет предлагать скачать .php-файл вместо того, чтобы его выполнить.

После шестого шага стек собран. Дальше идёт настройка: защита базы, свой виртуальный хост и проверка, что PHP видит MySQL. Пропускать эти этапы нельзя — сайт на неподготовленном стеке либо не заработает, либо будет уязвим.

Apache: корень сайта, виртуальные хосты и проверка конфига

По умолчанию Apache отдаёт файлы из каталога /var/www/html — туда попадает та самая страница It works. Для одного сайта этого достаточно: удалите заглушку, положите свои файлы, и всё заработает. Но как только сайтов становится два, нужны виртуальные хосты.

Виртуальный хост — описание одного сайта: какому домену он отвечает, из какой папки берёт файлы, куда пишет логи. Такие описания живут отдельными файлами в /etc/apache2/sites-available и включаются командой a2ensite имя-файла, а выключаются через a2dissite.

<VirtualHost *:80>
    ServerName example.ru
    ServerAlias www.example.ru
    DocumentRoot /var/www/example.ru/public
    ErrorLog ${APACHE_LOG_DIR}/example-error.log
    CustomLog ${APACHE_LOG_DIR}/example-access.log combined
</VirtualHost>

Строка DocumentRoot задаёт корень сайта, ServerName — основной домен, ServerAlias — дополнительные имена. Владельцем папки должен быть системный пользователь www-data, от которого работает Apache: chown -R www-data:www-data /var/www/example.ru. Иначе движок не сможет загружать картинки и писать кеш.

После правки конфига проверяйте синтаксис командой apache2ctl configtest — она показывает номер строки с ошибкой. Только после ответа Syntax OK применяйте изменения через systemctl reload apache2: в отличие от restart, эта команда не рвёт открытые соединения. И сразу включите модуль a2enmod rewrite, без него почти во всех CMS не работают ЧПУ-адреса — человекопонятные ссылки вида /catalog/noutbuki вместо /index.php?id=5.

MySQL: mysql_secure_installation и первая база для сайта

Сразу после установки MySQL небезопасен: в нём есть тестовая база с открытым доступом и разрешён вход без имени пользователя. Скрипт mysql_secure_installation закрывает эти дыры за пять вопросов. Запускайте его до того, как заливать сайт.

Скрипт спросит, включать ли проверку сложности паролей (можно ответить n, если сами задаёте длинные пароли), затем предложит удалить анонимных пользователей, запретить удалённый вход для root, удалить тестовую базу test и перезагрузить таблицы прав. На все четыре последних вопроса отвечайте y — процедура занимает меньше минуты.

Дальше создаём отдельную базу и отдельного пользователя под сайт. Работать от root не стоит: если сайт взломают, доступ откроется ко всем базам сервера сразу, а не к одной. Заходим в консоль командой mysql и выполняем четыре запроса.

CREATE DATABASE site_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'siteuser'@'localhost' IDENTIFIED BY 'длинный-пароль-16-символов';
GRANT ALL PRIVILEGES ON site_db.* TO 'siteuser'@'localhost';
FLUSH PRIVILEGES;

Кодировка utf8mb4 обязательна: старая utf8 хранит только 3 байта на символ и ломается на эмодзи. Запись 'siteuser'@'localhost' означает, что пользователь подключается только с самого сервера, снаружи вход закрыт. Управлять таблицами удобнее через веб-интерфейс phpMyAdmin, он ставится пакетом phpmyadmin. Если база уже есть на старом хостинге, смотрите инструкцию, как перенести базу данных MySQL дампом.

PHP: версия, модули и настройки, которые придётся менять

Проверить, что интерпретатор встал, можно командой php -v — на Ubuntu 24.04 она покажет PHP 8.3. Команда php -m выводит список модулей: там должны быть mysqli и pdo_mysql, иначе сайт не соединится с базой.

Базовый набор пакетов покрывает не всё. Любой CMS дополнительно нужны php-curl для запросов к внешним сервисам, php-gd для картинок, php-mbstring для кириллицы, php-xml и php-zip для импорта. Ставятся одной строкой: apt install php-curl php-gd php-mbstring php-xml php-zip -y.

Настройки языка лежат в файле /etc/php/8.3/apache2/php.ini. Значения по умолчанию рассчитаны на общий хостинг с PHP, и для реального сайта их почти всегда поднимают. После правки нужен именно перезапуск Apache: интерпретатор встроен в него модулем и читает настройки только при старте.

Параметр в php.ini Значение по умолчанию Разумное значение Что ломается при нехватке
memory_limit 128M 256M Белый экран при импорте и обновлении
upload_max_filesize 2M 32M Не загружаются фото и архивы тем
post_max_size 8M 32M Обрезаются большие формы
max_execution_time 30 120 Обрывается импорт каталога товаров
display_errors Off Off на боевом, On при отладке Пустая страница вместо текста ошибки

Параметр display_errors на рабочем сайте держат выключенным: тексты ошибок выдают пути к файлам и данные подключения к базе. Ошибки при этом должны писаться в лог: за это отвечают строки log_errors = On и error_log в том же php.ini.

Значения php.ini до и после правки под боевой сайт
Файл лежит в /etc/php/8.3/apache2/php.ini, и после правки нужен именно перезапуск Apache: интерпретатор встроен модулем и читает настройки только при старте.

Как проверить, что стек собрался целиком

Каждый компонент по отдельности мы уже проверили. Осталось убедиться, что они видят друг друга: Apache передаёт файл интерпретатору, а тот дотягивается до базы.

Первый тест — на PHP. Создайте файл /var/www/html/info.php со строкой <?php phpinfo(); ?> и откройте http://ваш-домен/info.php. Таблица с версией PHP и списком модулей означает, что Apache и PHP связаны корректно. Если браузер предложил скачать файл, не установлен libapache2-mod-php или не перезапущен Apache.

Второй тест — на базу. В той же таблице найдите блок mysqli, он должен быть со статусом enabled. Если блока нет, доставьте пакет php-mysql и перезапустите веб-сервер. Проверить соединение вживую можно командой mysql -u siteuser -p site_db.

Удалите info.php сразу после проверки. Этот файл показывает версии всего установленного софта и пути к каталогам — готовая карта для того, кто ищет уязвимую машину. Команда rm /var/www/html/info.php занимает секунду, а забытый файл живёт годами. Заодно закройте лишние порты — этим занимается тот самый фаервол ufw, встроенный в Ubuntu.

Чем LAMP отличается от LEMP с nginx

LEMP — та же связка, но вместо Apache в ней nginx (буква E от произношения engine-x). Меняется и способ запуска PHP: в LAMP интерпретатор встроен в процесс Apache модулем, в LEMP он работает отдельной службой php-fpm, а nginx общается с ней через сокет.

Разница ощущается на нагрузке. Apache в режиме prefork создаёт отдельный процесс на каждое соединение, и каждый занимает 15–30 МБ памяти: при 200 одновременных посетителях это до 6 ГБ, и сервер с 2 ГБ такой всплеск не переживёт. Nginx обслуживает тысячи соединений несколькими процессами по 15–25 МБ.

Обратная сторона — конфигурация. В Apache настройки уровня папки задаются файлом .htaccess, который кладут рядом с сайтом; nginx такие файлы игнорирует, все правила пишут в основном конфиге. Для WordPress, Bitrix и коробочных движков это лишний шаг.

Критерий LAMP (Apache) LEMP (nginx)
Как выполняется PHP Модуль внутри Apache Отдельная служба php-fpm
Память на 100 соединений 1,5–3 ГБ около 25 МБ на все сразу
Файл .htaccess Работает Не поддерживается
Готовые инструкции для CMS Почти всегда под Apache Нужна адаптация правил
Кому подходит Первый сайт, до 20 000 визитов в сутки Нагруженный проект, много статики

Развёрнутое сравнение с замерами есть в материале nginx или Apache. Для первого сайта берите LAMP: перейти на nginx позже можно за вечер.

Сколько ресурсов и денег нужно под LAMP-сервер

Аппетит стека определяет MySQL. База после старта занимает около 350–400 МБ памяти, Apache с десятком процессов — ещё 200–300 МБ. На тарифе с 1 ГБ это работает впритык: при импорте каталога система убивает процесс базы. Спасает файл подкачки на 2 ГБ — это участок диска, который система использует как запасную память, — и уменьшение innodb_buffer_pool_size до 128M.

Ориентиры такие. Учебный проект или визитка до 500 человек в сутки — 1 ядро, 1 ГБ памяти, 10 ГБ диска. Блог на WordPress или корпоративный сайт — 2 ядра, 2 ГБ, 20 ГБ. Магазин на Bitrix — 4 ядра, 4–8 ГБ и обязательно NVMe: на HDD выборки из базы тормозят в 5–10 раз.

Диск берите с запасом: Ubuntu со стеком занимает уже около 3,5 ГБ. В разделе каталога под веб-стек собраны 44 провайдера, ниже — стартовые тарифы.

Провайдер Стартовая цена Базовая конфигурация Тарифов Рейтинг
Cloudcore от 59 ₽/мес 1 ядро, 1 ГБ, 10 ГБ NVMe 12 3.3
Hosting-Russia от 99 ₽/мес конфигурация под заказ 3.0
HostVDS от 127 ₽/мес 1 ядро, 1 ГБ, 10 ГБ NVMe 12 3.3
RuVDS от 139 ₽/мес 1 ядро, 0,5 ГБ, 10 ГБ HDD 440 4.3
SmartApe от 145 ₽/мес 2 ядра, 2 ГБ, 100 ГБ NVMe 23 3.5
Timeweb от 180 ₽/мес 15 ГБ NVMe 77 4.3
Selectel от 200 ₽/мес 1 ядро, 1 ГБ, 10 ГБ NVMe 69 4.5

Данные проверены 04.09.2026.

Тариф за 59 ₽ подходит, чтобы пройти эту инструкцию. Под боевой сайт берите вариант с 2 ГБ памяти: разница обычно 150–300 ₽/мес. Последний штрих — бесплатный сертификат: пакет python3-certbot-apache сам пропишет строки в конфиг, подробности в инструкции про установку SSL от Let’s Encrypt. Действует он 90 дней и продлевается автоматически.

Частые ошибки при установке LAMP

Почти все проблемы новичков сводятся к десятку одинаковых ситуаций, и большинство видно в логе /var/log/apache2/error.log. Открывайте его командой tail -n 30 /var/log/apache2/error.log сразу после того, как воспроизвели ошибку: в последних строках обычно прямо написана причина.

Второй совет: меняйте по одной вещи за раз и после каждой правки выполняйте apache2ctl configtest. Когда правите пять параметров подряд, найти виновника уже сложно.

  • Забыли перезапустить Apache после установки PHP — браузер скачивает .php-файл вместо того, чтобы показать страницу.
  • Пропустили mysql_secure_installation — на сервере остаются тестовая база и анонимный доступ.
  • Работали от root и оставили владельцем файлов root — движок не может писать кеш и загружать картинки.
  • Создали базу в кодировке utf8 вместо utf8mb4 — кириллица и эмодзи превращаются в знаки вопроса.
  • Не включили a2enmod rewrite — главная страница открывается, а все внутренние адреса отдают 404.
  • Оставили файл info.php в корне сайта — вся конфигурация сервера доступна любому желающему.
  • Взяли тариф с 512 МБ памяти — MySQL периодически падает, а в логах появляется запись out of memory.

Частые вопросы

Можно ли поставить LAMP на обычный виртуальный хостинг? Нет: там стек уже установлен провайдером, вам выдают готовую панель, папку под сайт и базу. Собирать LAMP вручную требуется только на VPS или выделенном сервере, где есть root-доступ. Если своя настройка не нужна, проще взять тариф с хостингом с MySQL.

Чем MariaDB отличается от MySQL? MariaDB — ответвление от MySQL, команды и синтаксис почти полностью совпадают. Ставится она пакетом mariadb-server, остальные шаги инструкции не меняются. Для типового сайта разница незаметна: берите то, что рекомендует документация вашей CMS.

Сколько сайтов можно держать на одном LAMP-сервере? Ограничение задаёт память, а не веб-сервер. На тарифе с 2 ГБ живут 3–5 небольших сайтов, на 4 ГБ — до 10, если это визитки и блоги до 1000 посетителей в сутки. Каждому сайту делают свой виртуальный хост и свою базу.

Как обновить PHP до более свежей версии? В репозитории Ubuntu лежит одна версия на выпуск системы: в 24.04 это PHP 8.3, в 22.04 — 8.1. Чтобы поставить другую, подключают репозиторий ppa:ondrej/php и переключаются командой update-alternatives. Сначала проверьте совместимость движка: старые плагины часто ломаются на новых версиях.

Почему после установки открывается страница It works вместо моего сайта? Активен стандартный виртуальный хост 000-default. Отключите его командой a2dissite 000-default, включите свой через a2ensite и перезагрузите Apache. Если страница осталась, проверьте, что домен указывает на IP этого сервера.

Нужна ли панель управления вроде ISPmanager или FastPanel? Не обязательна, но экономит время, если вы не собираетесь изучать консоль: панель сама создаёт виртуальные хосты, базы и сертификаты в пару кликов. Плата за удобство — 200–800 ₽/мес за лицензию и 300–500 МБ памяти, которые панель занимает постоянно.

Как сделать резервную копию сайта на LAMP? Нужны две части: файлы и база. Файлы копируют архивом через tar -czf site.tar.gz /var/www/example.ru, базу выгружают дампом mysqldump -u root -p site_db > site.sql. Оба файла складывают на внешнее хранилище, а не на тот же сервер, и запускают ежедневно через cron — встроенный в Linux планировщик задач.

Итог

Рабочий LAMP собирается из пяти пакетов и шести команд: apache2, mysql-server, php, libapache2-mod-php и php-mysql плюс обязательный mysql_secure_installation. Дальше создают виртуальный хост с корнем в /var/www, базу в кодировке utf8mb4, пользователя с доступом только с localhost, поднимают memory_limit до 256M и выпускают сертификат на 90 дней. Файл info.php после проверки удаляют.

Из железа под учебный проект хватит 1 ядра и 1 ГБ, под боевой сайт — 2 ядер и 2 ГБ с NVMe. Сравнить конфигурации и цены 44 провайдеров можно в разделе VPS под веб-сервер: от 59 ₽/мес за тренировочную машину до тарифов с 8 ГБ памяти под магазин.

Поделиться:
👁 22 просмотров
Марина
Редактор · FREEHOSTING
Главный редактор FREEHOSTING. С 2020 года тестирует VDS, VPS и хостинг-провайдеров — арендует серверы, нагружает их реальными проектами и пишет честные обзоры по итогам. Помогает читателям выбирать хостинг под свои задачи: от Telegram-бота до production-сайта.