Настройка PHP и MySQL в Ubuntu: варианты и примеры
Настройка серверного окружения для веб-разработки
Наиболее эффективным решением для быстрой установки PHP и MySQL на Ubuntu является использование менеджера пакетов apt в сочетании с утилитой tasksel. Этот подход обеспечивает минимальное количество ручных действий и автоматическое разрешение зависимостей. Рекомендуется для стандартных проектов без специфических требований к версиям компонентов.
Как установить полный стек LAMP (Linux, Apache, MySQL, PHP) одной командой?
Выполнить:
sudo apt update
sudo apt install tasksel
sudo tasksel install lamp-server
После завершения установки проверить версии:
php -v
mysql --version
Пояснение шагов:
- apt update - обновление списка доступных пакетов.
- tasksel - утилита для установки предопределённых наборов программ.
- lamp-server - метапакет, который автоматически устанавливает Apache, MySQL/MariaDB, PHP и необходимые модули.
Типичная ошибка: Запрос пароля для MySQL не появился - сервер может быть настроен с пустым паролем root. Решение: войти в MySQL с sudo и установить пароль вручную:
sudo mysql -u root
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'новый_пароль';
FLUSH PRIVILEGES;
exit;
Цель и случаи использования: Данный способ подходит для быстрой настройки тестового или production-окружения, когда не требуется кастомизация версий или модулей. Идеален для начинающих разработчиков и лёгких проектов.
Как установить определённую версию PHP (например, 8.2) без изменения системных репозиториев?
Для использования конкретной версии PHP (например, 8.2) подключается сторонний PPA от Ondřej Surý:
sudo apt update
sudo add-apt-repository ppa:ondrej/php
sudo apt install php8.2 php8.2-mysql php8.2-cli php8.2-fpm
Пояснение: PPA содержит множество версий PHP, не затрагивая системный пакет php по умолчанию. Это позволяет установить несколько версий параллельно.
Проблема: Конфликт с уже установленной версией PHP. Решение: отключить модуль Apache для старой версии и включить для новой:
sudo a2dismod php8.1
sudo a2enmod php8.2
sudo systemctl restart apache2
Когда использовать: Если проект требует конкретной версии PHP (например, из-за устаревшего кода или совместимости с фреймворком).
Как вместо MySQL установить MariaDB или наоборот?
MariaDB является форком MySQL и полностью совместима на уровне API. Для замены достаточно установить метапакет mariadb-server вместо mysql-server. Пример:
sudo apt install mariadb-server mariadb-client
После установки проверка:
mariadb --version
Пояснение: MariaDB часто используется как замена MySQL с сохранением синтаксиса и команд. В большинстве веб-приложений разница незаметна.
Ошибка: После установки MariaDB команда mysql может не работать - установите пакет mysql-client для совместимости, либо используйте mariadb.
Случаи использования: Выбор между MySQL (Oracle) и MariaDB (сообщество) обычно продиктован требованиями к лицензированию, производительности или поддержкой определённых движков (например, Aria).
Когда требуется сборка PHP из исходных кодов?
Сборка вручную даёт полный контроль над конфигурацией. Пример для экстремальной оптимизации или нестандартных расширений:
wget https://www.php.net/distributions/php-8.2.10.tar.gz
tar -xzf php-8.2.10.tar.gz
cd php-8.2.10
./configure --prefix=/usr/local/php8.2 --with-mysqli --with-pdo-mysql --enable-fpm
make -j$(nproc)
sudo make install
Пояснение: флаги --with-mysqli и --with-pdo-mysql включают поддержку MySQL. Флаг --enable-fpm - FastCGI Process Manager.
Типичные ошибки: Отсутствие библиотек (libxml2, libsqlite3, libonig). Перед сборкой выполнить:
sudo apt install build-essential autoconf libxml2-dev libsqlite3-dev libonig-dev
Цель: Ручная сборка оправдана, когда требуется минимизировать размер бинарника, использовать экспериментальные патчи или добавить собственную библиотеку.
Как изолировать PHP и MySQL с помощью Docker?
Docker позволяет запустить каждую компоненту в отдельном контейнере. Пример docker-compose.yml:
version: '3'
services:
php:
image: php:8.2-fpm
volumes:
- ./app:/var/www/html
links:
- mysql
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: example
MYSQL_DATABASE: mydb
ports:
- "3306:3306"
Запуск:
docker-compose up -d
Пояснение: Docker гарантирует идентичное окружение на всех машинах разработчиков, упрощает развёртывание.
Проблема: Контейнеры после перезапуска теряют данные без volume. Решение:
volumes:
mysql-data:/var/lib/mysql
volumes:
mysql-data:
Когда использовать: В многосервисных архитектурах, при микросервисах, для разработки в команде с разными ОС.
Расширенные примеры установки и настройки
Пример 1. Установка LAMP с помощью tasksel и проверка работы
Команды:
sudo apt update
sudo apt install tasksel -y
sudo tasksel install lamp-server
php -v
mysql -u root -p -e "SHOW DATABASES;"
Результат:
PHP 8.1.2 (cli) (built: Apr 7 2023 17:10:15) ( NTS )
Copyright (c) The PHP Group
Zend Engine v4.1.2, Copyright (c) Zend Technologies
with Zend OPcache v8.1.2, Copyright (c), by Zend Technologies
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
Пояснение: tasksel автоматически устанавливает пакеты apache2, mysql-server, php, libapache2-mod-php, php-mysql. После установки Apache стартует автоматически. MySQL не запрашивает пароль до первого входа.
Пример 2. Установка PHP 8.2 из PPA с модулями вручную
sudo add-apt-repository ppa:ondrej/php -y
sudo apt install php8.2 php8.2-cli php8.2-common php8.2-mysql php8.2-fpm php8.2-xml php8.2-mbstring php8.2-curl -y
sudo update-alternatives --set php /usr/bin/php8.2
php -m | grep -i mysql
Результат:
mysqli mysqlnd pdo_mysql
Пояснение: флаг update-alternatives переключает системный php на версию 8.2. Вывод php -m показывает загруженные модули, среди которых присутствует поддержка MySQL.
Пример 3. Настройка виртуального хоста Apache для PHP-проекта
cd /etc/apache2/sites-available
sudo cp 000-default.conf myproject.conf
sudo nano myproject.conf
------
<VirtualHost *:80>
ServerName myproject.local
DocumentRoot /var/www/myproject
<Directory /var/www/myproject>
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/myproject_error.log
CustomLog ${APACHE_LOG_DIR}/myproject_access.log combined
</VirtualHost>
------
sudo a2ensite myproject.conf
sudo a2dissite 000-default.conf
sudo systemctl reload apache2
# создаём тестовый файл
sudo mkdir -p /var/www/myproject
echo "<?php phpinfo(); ?>" | sudo tee /var/www/myproject/index.php
Результат: при открытии в браузере http://myproject.local (или localhost/ если настроен hosts) отобразится страница phpinfo.
Пример 4. Подключение PHP к MySQL через mysqli с обработкой ошибок
<?php
$host = 'localhost';
$user = 'root';
$pass = 'password';
$db = 'test';
$conn = new mysqli($host, $user, $pass, $db);
if ($conn->connect_error) {
die("Ошибка подключения: " . $conn->connect_error);
}
echo "Успешно подключено к MySQL";
$conn->close();
?>
Результат (при успехе):
Успешно подключено к MySQL
Пояснение: код пытается соединиться с базой данных. Если пароль неверен или сервер не запущен, будет выведено фатальное сообщение. Для отладки рекомендуется использовать try-catch.
Пример 5. Типичная ошибка и её решение
Сообщение: PHP Fatal error: Uncaught mysqli_sql_exception: Access denied for user 'root'@'localhost'. Причина: плагин аутентификации по умолчанию auth_socket в MySQL 8. Лечение:
sudo mysql -u root
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'новый_пароль';
FLUSH PRIVILEGES;
EXIT;
После этого в PHP передаётся пароль текстом.
Пример 6. Настройка php.ini для увеличения лимитов
sudo nano /etc/php/8.2/apache2/php.ini
# изменить:
max_execution_time = 300
memory_limit = 256M
upload_max_filesize = 64M
post_max_size = 68M
sudo systemctl restart apache2
Проверка:
php -i | grep -i "max_execution_time\|memory_limit\|upload_max"
Результат частичный:
max_execution_time => 300 memory_limit => 256M upload_max_filesize => 64M
Пример 7. Установка phpMyAdmin и связывание с MySQL
sudo apt install phpmyadmin
# во время установки выбрать apache2, ответить Yes на dbconfig-common
# после установки:
sudo phpenmod mbstring
sudo systemctl restart apache2
Доступ по адресу http://localhost/phpmyadmin.
Проблема: Ошибка The mbstring extension is missing - установить php-mbstring, затем перезагрузить Apache.
Пример 8. Использование Docker Compose с PHP и MySQL (полный пример)
# docker-compose.yml
version: '3.8'
services:
web:
image: nginx:alpine
volumes:
- ./app:/var/www/html
- ./nginx.conf:/etc/nginx/conf.d/default.conf
ports:
- "8080:80"
depends_on:
- php
- mysql
php:
build:
context: .
dockerfile: Dockerfile-php
volumes:
- ./app:/var/www/html
links:
- mysql
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: appdb
ports:
- "3307:3306"
volumes:
- mysql-data:/var/lib/mysql
volumes:
mysql-data:
Файл Dockerfile-php:
FROM php:8.2-fpm
RUN docker-php-ext-install mysqli pdo_mysql
Запуск и проверка:
docker-compose up -d
docker-compose exec php php -m | grep mysql
Результат:
mysqli pdo_mysql
Пояснение: используем Nginx как frontend, PHP-FPM для обработки скриптов, MySQL для хранения. Контейнеры изолированы, но общаются через внутреннюю сеть Docker.