Конфигурация стека PHP-MySQL на сервере

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

Настройка серверов PHP и MySQL

Как развернуть стабильный стек PHP и MySQL на сервере?

Основное эффективное решение - использование связки Apache с модулем mod_php (или PHP-FPM для новых версий) и MySQL/MariaDB на операционной системе Linux (Ubuntu/Debian). Этот подход обеспечивает простоту конфигурации, широкую поддержку и высокую надёжность.

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

После установки следует настроить виртуальный хост и создать базу данных.

sudo nano /etc/apache2/sites-available/example.com.conf

Пример конфигурации виртуального хоста:

<VirtualHost *:80>
    ServerAdmin admin@example.com
    DocumentRoot /var/www/example
    ServerName example.com
    <Directory /var/www/example>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Включение сайта и модуля mod_rewrite:

sudo a2ensite example.com
sudo a2enmod rewrite
sudo systemctl restart apache2

Создание базы данных и пользователя MySQL:

sudo mysql -u root -p
CREATE DATABASE example_db;
CREATE USER 'user'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON example_db.* TO 'user'@'localhost';
FLUSH PRIVILEGES;
EXIT;

Типичные ошибки и их решение

  • Ошибка 403 Forbidden: проверка прав доступа к директории DocumentRoot и наличие файла index.php.
  • Модуль php не загружен: выполнить sudo a2enmod php8.1 (зависит от версии).
  • Ошибка подключения к MySQL: убедиться что mysql-server запущен, а пользователь имеет права.

Как добиться высокой производительности при обработке PHP?

Использование веб-сервера Nginx в паре с PHP-FPM позволяет обслуживать большое количество одновременных соединений без значительного потребления памяти.

sudo apt install nginx php-fpm php-mysql mysql-server

Настройка сервера Nginx для передачи PHP-запросов в PHP-FPM:

server {
    listen 80;
    server_name example.com;
    root /var/www/example;
    index index.php index.html;

    location / {
        try_files $uri $uri/ =404;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
    }
}

После изменений перезапустить Nginx и PHP-FPM:

sudo systemctl restart nginx
sudo systemctl restart php8.1-fpm

Распространённые проблемы

  • 502 Bad Gateway: сокет PHP-FPM не найден - проверить путь в fastcgi_pass и статус php-fpm.
  • Файлы index.php не обрабатываются: убедиться, что директива index включает index.php.

Как быстро настроить окружение для локальной разработки без глубоких знаний?

Готовые сборки, такие как XAMPP, MAMP, OpenServer, предоставляют предварительно сконфигурированный пакет Apache/nginx, PHP, MySQL, phpMyAdmin. Установка сводится к запуску установщика и выбору компонентов.

Пример установки XAMPP на Windows:

  • Скачать установщик с официального сайта Apache Friends.
  • Запустить и следовать инструкциям, оставив компоненты по умолчанию.
  • После установки запустить панель управления и стартовать Apache и MySQL.

Проверка работы: открыть в браузере http://localhost, должен отображаться приветственный экран XAMPP.

Возможные ошибки

  • Порт 80 занят: изменить порт в конфигурации Apache (httpd.conf) или остановить службу, использующую порт.
  • Ошибка запуска MySQL: проверить, что порт 3306 не занят другой БД.
Как изолировать компоненты стека и обеспечить воспроизводимость окружения?

Использование Docker позволяет запускать каждый сервис (PHP, MySQL, Nginx) в отдельном контейнере. Файл docker-compose.yml описывает архитектуру.

version: '3'
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./html:/usr/share/nginx/html
    depends_on:
      - php
  php:
    image: php:8.1-fpm
    volumes:
      - ./html:/var/www/html
  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword
      MYSQL_DATABASE: example
    ports:
      - "3306:3306"

Запуск командой docker-compose up -d

Такой подход позволяет легко переносить окружение между разработчиками и серверами.

Проблемы Docker

  • Контейнеры не могут соединиться: использовать имена сервисов в качестве хоста (например, 'db' вместо 'localhost').
  • Проблемы с правами на файлы: задать пользователя при монтировании томов.

Расширенные примеры конфигурации

Дополнительные сценарии настройки серверов PHP и MySQL.

Настройка пула PHP-FPM для разных сайтов

Создание отдельного пула с ограничением ресурсов.

Пример
# Файл /etc/php/8.1/fpm/pool.d/example.conf
[example]
user = www-data
group = www-data
listen = /run/php/php8.1-fpm-example.sock
listen.owner = www-data
listen.group = www-data
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
pm.max_requests = 500

После создания перезапустить PHP-FPM:

Пример
sudo systemctl restart php8.1-fpm

Типичная ошибка: неправильные права доступа к сокету - проверка listen.owner и listen.group.

Использование нескольких версий PHP на одном сервере

Установка PHP 7.4 и 8.1, переключение через пулы.

Пример
sudo apt install php7.4-fpm php8.1-fpm
# В Nginx для каждого сервера указать свой сокет:
location ~ \.php$ {
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
}

Результат: сайты с разными версиями PHP работают одновременно.

Настройка кэширования FastCGI в Nginx

Пример
# В блоке http nginx.conf
fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=phpcache:10m max_size=1g inactive=60m;

server {
    # ...
    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
        fastcgi_cache phpcache;
        fastcgi_cache_valid 200 302 1h;
        fastcgi_cache_bypass $http_cache_control;
        add_header X-Cache $upstream_cache_status;
    }
}

Результат: заголовок X-Cache показывает HIT или MISS.

HTTP/1.1 200 OK
X-Cache: HIT

Настройка репликации MySQL master-slave

Пример
# На мастере /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
binlog_do_db = exampledb

# На слейве
server-id = 2
relay-log = /var/log/mysql/mysql-relay-bin.log

Команды для настройки репликации:

Пример
# На мастере
CREATE USER 'replica'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'replica'@'%';
FLUSH PRIVILEGES;
SHOW MASTER STATUS;

# На слейве
CHANGE MASTER TO MASTER_HOST='master_ip', MASTER_USER='replica', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS= 154;
START SLAVE;
SHOW SLAVE STATUS\G

Результат: данные реплицируются с мастера на слейв.

Установка phpMyAdmin вручную

Пример
wget https://files.phpmyadmin.net/phpMyAdmin/5.2.1/phpMyAdmin-5.2.1-all-languages.tar.gz
tar xzf phpMyAdmin-5.2.1-all-languages.tar.gz
sudo mv phpMyAdmin-5.2.1-all-languages /usr/share/phpmyadmin
sudo mkdir /usr/share/phpmyadmin/tmp
sudo chown -R www-data:www-data /usr/share/phpmyadmin
sudo chmod 777 /usr/share/phpmyadmin/tmp

Создание файла конфигурации config.inc.php:

Пример
cp /usr/share/phpmyadmin/config.sample.inc.php /usr/share/phpmyadmin/config.inc.php
# Сгенерировать blowfish_secret и вставить.

Добавить alias в Nginx или директорию в Apache. Результат: доступ к phpMyAdmin через http://localhost/phpmyadmin.

Сервера PHP и MySQL - comments

En
сервера php сервера mysql (php)