Установка PHP и MySQL в среде Ubuntu: полное пошаговое руководство

Раздел: Администрирование и окружение -> Установка и настройка

Установка и настройка PHP и MySQL на Ubuntu

Основной способ установки PHP и MySQL на Ubuntu - использование пакетного менеджера apt с установкой стека LAMP (Linux, Apache, MySQL, PHP). Этот метод обеспечивает стабильные версии из репозитория Ubuntu и прост в обслуживании.

Как выполнить быструю установку LAMP на Ubuntu?

Для начала обновляют список пакетов:

sudo apt update

установка сервера apache mysql php (установка сервера apache, mysql и php)

Затем устанавливают Apache, MySQL и PHP вместе с модулем для Apache:

sudo apt install apache2 mysql-server php php-mysql libapache2-mod-php

создание php сервера (создание и настройка php сервера)

Пояснение: Пакет php-mysql подключает расширения для работы с MySQL (mysqli и PDO). После установки Apache запускается автоматически. MySQL требует начальной настройки безопасности.

Распространенная ошибка - отсутствие расширения mysqli после установки. Решение: установить пакет php-mysql отдельно, если он не был включен:

sudo apt install php-mysql
sudo systemctl restart apache2

Php mysql ubuntu (php и mysql на ubuntu)

Проблема с доступом к MySQL - не установлен пароль root. Используют команду sudo mysql для входа без пароля и затем устанавливают пароль:

sudo mysql
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'ваш_пароль';
FLUSH PRIVILEGES;
EXIT;

Как настроить автоматическую установку MySQL с безопасными настройками?

После установки MySQL запускают скрипт безопасности:

sudo mysql_secure_installation

Скрипт позволит установить пароль root, удалить анонимных пользователей, запретить удаленный вход root и удалить тестовую базу данных. Рекомендуется ответить 'Y' на все вопросы.

Возможная проблема: при запуске скрипта появляется запрос пароля root, но пароль еще не установлен. Решение - войти в MySQL без пароля как указано выше, выполнить настройку через ALTER USER и только потом запускать mysql_secure_installation.

Как проверить работоспособность связки PHP и MySQL?

Создают тестовый PHP-файл в корне веб-сервера /var/www/html/:

sudo nano /var/www/html/info.php
<?php
// Проверка информации о PHP
phpinfo();
?>

Переходят по адресу http://ваш_ip/info.php и ищут секцию mysqli. Если секция присутствует, расширение активно. После проверки файл info.php рекомендуется удалить из соображений безопасности.

Как установить стек LAMP с помощью tasksel?

Tasksel - инструмент для установки групп пакетов. Устанавливают его и запускают:

sudo apt install tasksel
sudo tasksel install lamp-server

Этот способ автоматически подберет и установит все необходимые пакеты, настроит Apache и MySQL. Однако версии могут быть не самыми свежими, и процесс менее гибок в выборе компонентов.

Иногда tasksel не находит группу lamp-server из-за устаревших репозиториев. Решение - обновить список пакетов и повторить команду.

Как установить PHP-FPM вместо модуля Apache (mod_php)?

PHP-FPM (FastCGI Process Manager) часто используют для повышения производительности и изоляции процессов. Порядок:

sudo apt install php-fpm libapache2-mod-fcgid
sudo a2enmod proxy_fcgi setenvif
sudo a2enconf php8.1-fpm   # версия может отличаться
sudo systemctl restart apache2

После этого PHP обрабатывается через FPM, а не модуль Apache. Это позволяет разделять PHP-процессы между несколькими доменами и повышает безопасность.

Ошибка 502 Bad Gateway после включения PHP-FPM - часто из-за неработающего сервиса. Проверяют статус:

sudo systemctl status php8.1-fpm

Если сервис не запущен, запускают sudo systemctl start php8.1-fpm.

Как установить MariaDB вместо MySQL?

MariaDB - форк MySQL, полностью совместимый. Установка:

sudo apt install mariadb-server php-mysql

Настройка похожа на MySQL, но скрипт безопасности называется sudo mysql_secure_installation. Преимущество - более активное сообщество и улучшенная производительность в некоторых сценариях.

Некоторые приложения требуют именно MySQL. Проверяют совместимость: MariaDB поддерживает все популярные функции MySQL, но могут быть редкие несовместимости в триггерах или процедурах.

Как настроить виртуальные хосты Apache для работы с PHP и MySQL?

Виртуальные хосты позволяют запускать несколько сайтов на одном IP. Пример настройки:

sudo mkdir /var/www/mysite
sudo chown -R www-data:www-data /var/www/mysite
sudo nano /etc/apache2/sites-available/mysite.conf

<VirtualHost *:80>
    ServerName mysite.local
    DocumentRoot /var/www/mysite
    <Directory /var/www/mysite>
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>

Затем активируют хост и перезагружают Apache:

sudo a2ensite mysite.conf
sudo systemctl reload apache2

Чтобы хост работал локально, добавляют запись в /etc/hosts:

echo '127.0.0.1 mysite.local' | sudo tee -a /etc/hosts

Ошибка 403 Forbidden при обращении к сайту - не установлены права на каталог. Проверяют, что каталог доступен для чтения пользователю www-data.

Расширенные примеры взаимодействия PHP и MySQL

Как создать базу данных и таблицу через PHP с проверкой ошибок?

Используют расширение mysqli с объектно-ориентированным стилем. Файл create.php:

Пример
<?php
$servername = 'localhost';
$username = 'root';
$password = 'ваш_пароль';

// Создание подключения
$conn = new mysqli($servername, $username, $password);

// Проверка соединения
if ($conn->connect_error) {
    die('Ошибка подключения: ' . $conn->connect_error);
}

// Создание базы данных
$sql = 'CREATE DATABASE IF NOT EXISTS test_db';
if ($conn->query($sql) === TRUE) {
    echo 'База данных создана успешно';
} else {
    echo 'Ошибка создания базы данных: ' . $conn->error;
}

// Выбор базы данных
$conn->select_db('test_db');

// Создание таблицы
$sql = 'CREATE TABLE IF NOT EXISTS users (
    id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL,
    email VARCHAR(100) NOT NULL,
    reg_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
)';
if ($conn->query($sql) === TRUE) {
    echo 'Таблица создана успешно';
} else {
    echo 'Ошибка создания таблицы: ' . $conn->error;
}

$conn->close();
?>
База данных создана успешно
Таблица создана успешно

Как выполнить подготовленный запрос (INSERT) с помощью PDO?

PDO (PHP Data Objects) - абстракция работы с базами данных. Пример добавления записи:

Пример
<?php
$dsn = 'mysql:host=localhost;dbname=test_db;charset=utf8mb4';
$username = 'root';
$password = 'ваш_пароль';

try {
    $pdo = new PDO($dsn, $username, $password);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $stmt = $pdo->prepare('INSERT INTO users (username, email) VALUES (:username, :email)');
    $stmt->execute([
        ':username' => 'john_doe',
        ':email' => 'john@example.com'
    ]);

    echo 'Новая запись с ID ' . $pdo->lastInsertId() . ' добавлена';
} catch (PDOException $e) {
    echo 'Ошибка: ' . $e->getMessage();
}
?>
Новая запись с ID 1 добавлена

Как выполнить SELECT с использованием PDO и выводом в таблицу HTML?

Пример
<?php
$dsn = 'mysql:host=localhost;dbname=test_db;charset=utf8mb4';
$username = 'root';
$password = 'ваш_пароль';

try {
    $pdo = new PDO($dsn, $username, $password);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $stmt = $pdo->query('SELECT id, username, email, reg_date FROM users');
    $users = $stmt->fetchAll(PDO::FETCH_ASSOC);

    if (count($users) > 0) {
        echo '<table border="1">';
        echo '<tr><th>ID</th><th>Username</th><th>Email</th><th>Reg Date</th></tr>';
        foreach ($users as $user) {
            echo '<tr>';
            echo '<td>' . htmlspecialchars($user['id']) . '</td>';
            echo '<td>' . htmlspecialchars($user['username']) . '</td>';
            echo '<td>' . htmlspecialchars($user['email']) . '</td>';
            echo '<td>' . htmlspecialchars($user['reg_date']) . '</td>';
            echo '</tr>';
        }
        echo '</table>';
    } else {
        echo 'Записей не найдено';
    }
} catch (PDOException $e) {
    echo 'Ошибка: ' . $e->getMessage();
}
?>
(вывод HTML таблицы с данными)

Как настроить удаленное подключение к MySQL для PHP-приложения?

Для безопасности используется пользователь с ограниченными правами. В MySQL:

Пример
CREATE USER 'app_user'@'192.168.1.%' IDENTIFIED BY 'strong_password';
GRANT SELECT, INSERT, UPDATE, DELETE ON test_db.* TO 'app_user'@'192.168.1.%';
FLUSH PRIVILEGES;

В PHP соединение:

Пример
$conn = new mysqli('192.168.1.100', 'app_user', 'strong_password', 'test_db');

Проблема: MySQL по умолчанию слушает только localhost. Для удаленного доступа нужно изменить файл /etc/mysql/mysql.conf.d/mysqld.cnf, заменив bind-address = 127.0.0.1 на bind-address = 0.0.0.0 и перезапустить MySQL.

Как обрабатывать ошибки MySQL с помощью исключений в PDO?

Пример
try {
    $pdo = new PDO($dsn, $user, $pass);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    // намеренно неверная таблица
    $pdo->query('SELECT * FROM non_existent_table');
} catch (PDOException $e) {
    echo 'Поймано исключение: ' . $e->getMessage();
    // Логирование ошибки
    error_log($e->getMessage(), 3, '/var/log/php_errors.log');
}
Поймано исключение: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'test_db.non_existent_table' doesn't exist

Как использовать PHP-скрипт для периодической очистки данных в MySQL (cron)?

Создают скрипт cleanup.php:

Пример
<?php
$pdo = new PDO('mysql:host=localhost;dbname=test_db', 'root', 'password');
$pdo->exec('DELETE FROM logs WHERE created_at < DATE_SUB(NOW(), INTERVAL 7 DAY)');
echo 'Очистка завершена';
?>

Добавляют задачу в cron (редактируют crontab):

Пример
crontab -e
Пример
0 3 * * * /usr/bin/php /var/www/scripts/cleanup.php >> /var/log/cleanup.log 2>&1

Скрипт выполняется ежедневно в 3:00.

PHP и MySQL на Ubuntu - comments

En
Php mysql ubuntu (php)