Разбираем установку и базовую настройку LAMP на Ubuntu 24.04. Вы узнаете, как подготовить систему, установить компоненты (Apache, MySQL, PHP) и оптимизировать их работу для современных веб-приложений.
Введение
LAMP-стек — проверенная временем платформа для веб-разработки, объединяющая четыре ключевых компонента: Linux как операционную систему, Apache в роли веб-сервера, MySQL для управления базами данных и PHP для создания динамических страниц.
Подготовка сервера
Перед установкой компонентов стека необходимо подготовить операционную систему, поэтому начнём с обновления:
sudo apt update && sudo apt upgrade -y
apt update запрашивает актуальные данные о пакетах из репозиториев, apt upgrade обновляет установленные пакеты до последних версий, флаг -y автоматически подтверждает действия.
Далее установите обязательные компоненты:
sudo apt install -y software-properties-common
software-properties-common добавляет поддержку PPA-репозиториев (потребуется для PHP).
Ограничьте доступ к серверу, настроив файрвол:
sudo ufw allow ssh
sudo ufw enable
Так вы разрешаете SSH-подключения (обязательно перед активацией файрвола!) и включаете файрвол с сохранением правил после перезагрузки.
Убедитесь, что правила применены корректно:
sudo ufw status verbose
Ожидаемый вывод:
Важно:
- Всегда разрешайте SSH до включения UFW, чтобы не потерять доступ к серверу.
- Для продакшен-сред рекомендуется сменить порт SSH по умолчанию.
- Команды выполняются под sudo — это гарантирует необходимые привилегии.
Установка компонентов LAMP
Apache
Перейдём к установке Apache — веб-сервера, который является основой LAMP-стека. Выполните команду установки:
sudo apt install -y apache2
Что происходит при установке:
- пакет apache2 и его зависимости скачиваются из репозиториев Ubuntu;
- автоматически создаются:
- системная служба /lib/systemd/system/apache2.service;
- конфигурационные файлы в /etc/apache2/;
- корневая веб-директория /var/www/html/;
- сервис apache2 автоматически запускается после установки.
Затем разрешите веб-трафик в UFW командой:
sudo ufw allow 'Apache Full'
Эта команда эквивалентна allow http (порт 80 для HTTP) и allow https (порт 443 для HTTPS).
Убедитесь, что служба активна:
systemctl status apache2
Ожидаемый вывод:
Дополнительно проверьте установку через браузер. Откройте http://IP_вашего_сервера — должна появиться страница «Apache2 Ubuntu Default Page».
Проверка версии:
apache2 -v
Далее выполните настройки, критические для безопасности сервера. Отключите вывод версии сервера в заголовках:
echo "ServerTokens Prod" | sudo tee -a /etc/apache2/conf-enabled/security.conf
echo "ServerSignature Off" | sudo tee -a /etc/apache2/conf-enabled/security.conf
sudo systemctl restart apache2
Запретите доступ к служебным каталогам:
sudo sed -i 's/Options Indexes FollowSymLinks/Options FollowSymLinks/' /etc/apache2/apache2.conf
Включите модуль mod_rewrite и перезапустите Apache:
sudo a2enmod rewrite
sudo systemctl restart apache2
Важно:
- Apache автоматически добавляется в автозагрузку.
- Основной конфигурационный файл — /etc/apache2/apache2.conf.
- Виртуальные хосты настраиваются в /etc/apache2/sites-available/.
- Логи ошибок хранятся в /var/log/apache2/error.log.
MySQL
MySQL — система управления реляционными базами данных, которая обеспечивает хранение информации для веб-приложения.
Установка сервера MySQL:
sudo apt install -y mysql-server
После установки:
- автоматически запускается системная служба mysql;
- создаются конфигурационные файлы в /etc/mysql/;
- основные исполняемые файлы размещаются в /usr/bin/.
Для базовой защиты выполните скрипт:
sudo mysql_secure_installation
Настройка проходит в несколько шагов:
- пароль root-пользователя — установите сложный пароль (длиной от 12 символов, включающий цифры, буквы в разном регистре и спецсимволы);
- удаление анонимных пользователей? → выберите «да» (Y);
- запретить root-логин удалённо? → Y (настройка, критичная для безопасности!);
- удалить тестовую базу данных? → Y;
- перезагрузить таблицы привилегий? → Y.
Создайте пользователя для веб-приложений. Войдите в консоль MySQL:
sudo mysql -u root -p
Выполните SQL-команды:
CREATE USER 'webadmin'@'localhost' IDENTIFIED BY 'пароль';
GRANT ALL PRIVILEGES ON *.* TO 'webadmin'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;
EXIT;
Что они делают:
- CREATE USER — создаёт нового пользователя webadmin с доступом только с локального хоста;
- GRANT ALL PRIVILEGES — даёт полные права на все базы; это уместно в тестовых средах, но в продакшене давайте только минимально необходимые права, например:
GRANT CREATE, ALTER, DROP, INSERT, UPDATE, DELETE, SELECT, INDEX ON *.* TO 'webadmin'@'localhost';
- FLUSH PRIVILEGES — применяет изменения прав доступа.
После этого проверьте статус службы:
systemctl status mysql
Должен быть статус active (running).
Проверьте подключение под новым пользователем:
mysql -u webadmin -p
Введите пароль и убедитесь, что консоль доступна.
Критически важные настройки безопасности:
- обязательно отключайте удалённый root-доступ (это уже сделано в secure_installation);
- настройте биндинг только на localhost:
sudo sed -i 's/bind-address.*/bind-address = 127.0.0.1/' /etc/mysql/mysql.conf.d/mysqld.cnf
- установите лимит соединений для предотвращения DDoS:
echo "max_connections = 100" | sudo tee -a /etc/mysql/mysql.conf.d/mysqld.cnf
sudo systemctl restart mysql
Чтобы оптимизировать производительность серверов с 2-4 ГБ RAM, добавьте в /etc/mysql/mysql.conf.d/mysqld.cnf:
[mysqld]
innodb_buffer_pool_size = 1G
innodb_log_file_size = 256M
query_cache_type = 1
query_cache_size = 64M
Рекомендации:
- Всегда используйте разные пароли для root и остальных пользователей, меняйте их раз в несколько месяцев.
- Для продакшен-сред замените GRANT ALL на минимально необходимые привилегии.
- Регулярно создавайте бекапы баз данных.
PHP
PHP — язык сценариев, который превращает статические страницы в динамические веб-приложения. Версия PHP на Ubuntu 24.04 — 8.3.
Установка базовых пакетов:
sudo apt install -y php libapache2-mod-php php-mysql php-curl php-zip
Что устанавливается:
- php — основной пакет PHP 8.3;
- libapache2-mod-php — модуль интеграции PHP с Apache;
- php-mysql — драйвер для работы с MySQL/MariaDB;
- php-curl — библиотека для HTTP-запросов (обязательна для CMS);
- php-zip — поддержка работы с архивами.
Модуль libapache2-mod-php активируется автоматически, Apache перезагрузится для применения изменений. Конфигурация будет размещена в /etc/php/8.3/.
Для проверки создайте тестовый файл:
echo "<?php phpinfo(); ?>" | sudo tee /var/www/html/info.php
Затем откройте в браузере http://ваш_сервер/info.php. Вы должны увидеть страницу с заголовком «PHP Version 8.3.x», разделы Core, curl, mysqlnd, zip, таблицу с параметрами конфигурации.
После установки уделите внимание безопасности. Отключите опасные функции:
sudo sed -i 's/;disable_functions =/disable_functions = exec,passthru,shell_exec,system,proc_open,popen,curl_multi_exec,parse_ini_file,show_source/' /etc/php/8.3/apache2/php.ini
Настройте параметры файловых операций, например:
sudo tee -a /etc/php/8.3/apache2/php.ini <<EOF
file_uploads = On
upload_max_filesize = 20M
post_max_size = 22M
max_execution_time = 30
max_input_time = 60
memory_limit = 256M
display_errors = Off
log_errors = On
error_log = /var/log/php_errors.log
EOF
Создайте лог-файл и назначьте права:
sudo touch /var/log/php_errors.log
sudo chown www-data:www-data /var/log/php_errors.log
sudo chmod 640 /var/log/php_errors.log
Также установите дополнительные модули:
- php-gd — работа с изображениями,
- php-intl — интернационализация,
- php-mbstring — многобайтовые строки,
- php-xml — обработка XML,
- php-soap — SOAP-сервисы.
Команда для их установки:
sudo apt install -y php-gd php-intl php-mbstring php-xml php-soap
Для проверки работы с MySQL, создайте тестовый скрипт:
cat <<EOF | sudo tee /var/www/html/dbtest.php
<?php
$mysqli = new mysqli('localhost', 'webadmin', 'пароль');
if ($mysqli->connect_error) {
die('Ошибка подключения: ' . $mysqli->connect_error);
}
echo 'Успешное подключение к MySQL! Версия сервера: ' . $mysqli->server_version;
EOF
В этом скрипте создаётся соединение с MySQL-сервером на localhost с использованием пользователя webadmin и его пароля. Откройте http://ваш_сервер/dbtest.php — если подключение не удастся, выведется сообщение об ошибке и выполнение скрипта прекратится, при успешном подключении появится сообщение «Успешное подключение к MySQL!» и версия сервера MySQL.
После проверки удалите тестовые файлы:
sudo rm /var/www/html/info.php /var/www/html/dbtest.php
Для продакшен-сред используйте отдельные пользовательские php.ini для каждого сайта. Также регулярно обновляйте PHP:
sudo apt update && sudo apt upgrade php*
Интеграция компонентов LAMP
Теперь настроим взаимодействие Apache, PHP и MySQL для работы с реальным веб-приложением. Начнём с создания виртуального хоста Apache — контейнера для вашего сайта.
Создайте корневую директорию для проекта:
sudo mkdir -p /var/www/project
sudo chown -R www-data:www-data /var/www/project
sudo chmod -R 755 /var/www/project
Создайте конфигурационный файл:
sudo nano /etc/apache2/sites-available/project.conf
Вставьте конфигурацию:
<VirtualHost *:80>
ServerAdmin admin@yoursite.com
ServerName yourdomain.com
ServerAlias www.yourdomain.com
# Корневая директория сайта
DocumentRoot /var/www/project
# Настройки логирования
ErrorLog ${APACHE_LOG_DIR}/project_error.log
CustomLog ${APACHE_LOG_DIR}/project_access.log combined
# Параметры доступа к директории
<Directory /var/www/project>
Options FollowSymLinks
AllowOverride All
Require all granted
# Настройки для CMS (WordPress, Joomla и т.д.)
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
</Directory>
</VirtualHost>
Активируйте конфигурацию:
sudo a2ensite project.conf
sudo a2dissite 000-default.conf
sudo systemctl reload apache2
Напишем тестовый скрипт для проверки подключения к базе данных. Создайте файл db_test.php:
sudo nano /var/www/project/db_test.php
Вставьте в него:
<?php
// Конфигурация подключения
$host = 'localhost';
$user = 'webadmin';
$password = 'пароль';
$database = 'test_db';
try {
// Создание подключения
$mysqli = new mysqli($host, $user, $password);
// Проверка соединения
if ($mysqli->connect_error) {
throw new Exception("Ошибка подключения: " . $mysqli->connect_error);
}
echo "<h1>Успешное подключение к MySQL!</h1>";
echo "<p>Версия сервера: " . $mysqli->server_info . "</p>";
// Создание тестовой базы
$mysqli->query("CREATE DATABASE IF NOT EXISTS $database");
$mysqli->select_db($database);
// Создание таблицы
$mysqli->query("CREATE TABLE IF NOT EXISTS lamp_test (
id INT AUTO_INCREMENT PRIMARY KEY,
message VARCHAR(255) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)");
// Вставка данных
$message = "Привет от LAMP на Ubuntu 24.04!";
$mysqli->query("INSERT INTO lamp_test (message) VALUES ('$message')");
// Чтение данных
$result = $mysqli->query("SELECT * FROM lamp_test");
echo "<h2>Тестовые данные из базы:</h2>";
echo "<ul>";
while ($row = $result->fetch_assoc()) {
echo "<li>" . htmlspecialchars($row['message']) . " (ID: " . $row['id'] . ")</li>";
}
echo "</ul>";
// Закрытие соединения
$mysqli->close();
} catch (Exception $e) {
echo "<h1>Ошибка:</h1>";
echo "<p>" . $e->getMessage() . "</p>";
echo "<p>Проверьте:</p>";
echo "<ul>";
echo "<li>Доступность MySQL</li>";
echo "<li>Правильность логина/пароля</li>";
echo "<li>Привилегии пользователя</li>";
echo "</ul>";
}
?>
Откройте в браузере http://ваш_сервер/db_test.php. Должны отобразиться:
- заголовок «Успешное подключение к MySQL!»;
- версия сервера MySQL;
- список тестовых данных из таблицы lamp_test.
После проверки удалите тестовый скрипт и тестовую базу данных:
sudo rm /var/www/project/db_test.php
mysql -u webadmin -p -e "DROP DATABASE test_db"
Для продакшен-сред ограничьте привилегии пользователя:
REVOKE ALL PRIVILEGES ON *.* FROM 'webadmin'@'localhost';
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX
ON project_db.* TO 'webadmin'@'localhost';
FLUSH PRIVILEGES;
Рекомендации по безопасности:
- Всегда используйте подготовленные запросы для работы с БД:
$stmt = $mysqli->prepare("INSERT INTO users (name, email) VALUES (?, ?)");
$stmt->bind_param("ss", $name, $email);
$stmt->execute();
- Настройте отдельный конфиг для PHP-FPM:
sudo nano /etc/php/8.3/fpm/pool.d/project.conf
Его содержимое:
[project]
user = www-data
group = www-data
listen = /run/php/php8.3-fpm-project.sock
listen.owner = www-data
listen.group = www-data
pm = dynamic
pm.max_children = 20
pm.start_servers = 4
pm.min_spare_servers = 2
pm.max_spare_servers = 8
- Регулярно обновляйте компоненты:
sudo apt update && sudo apt upgrade apache2 mysql-server php*
После этого LAMP-стек настроен и готов к развёртыванию веб-приложений.
Читайте в блоге:
- Ansible с Ubuntu 24.04: быстрый старт автоматизации
- Ubuntu 24.04 LTS против 22.04: стоит ли обновляться
- Настройка swap и ZRAM в Ubuntu 24.04 LTS на VPS