Конфигурация стека 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.