Настройка 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.

- установка php mysql ubuntu (установка php и mysql на ubuntu)
- сервера php сервера mysql (сервера php и mysql)
- Php mysql localhost (php mysql localhost)
- Php mysql host (хост php mysql)

Установка PHP и MySQL на Ubuntu - comments

En
установка php mysql ubuntu (php)