Миграция WordPress сайта с WooCommerce на VDS сервер требует не только правильного переноса файлов и базы данных, но и оптимальной настройки PHP для обеспечения высокой производительности и безопасности. В этой статье мы рассмотрим все необходимые шаги для оптимизации PHP на VDS сервере.
План миграции WordPress на VDS
Этап 1: Подготовка к миграции
- Создайте полную резервную копию вашего сайта (файлы и база данных)
- Разверните VDS сервер с ISP Manager
- Настройте оптимальные параметры PHP
- Установите необходимые расширения PHP
Этап 2: Перенос данных
- Перенесите базу данных с помощью плагина Duplicator
- Выгрузите файлы сайта в архив и загрузите на новый сервер
- Распакуйте архив на новом сервере
- Настройте права доступа к файлам:
# Установка прав 644 для всех файлов find /путь/к/вашему/сайту -type f -exec chmod 644 {} \; # Установка прав 755 для всех директорий find /путь/к/вашему/сайту -type d -exec chmod 755 {} \; # Установка правильного владельца файлов chown -R пользователь:группа /путь/к/вашему/сайту
Этап 3: Настройка и тестирование
- Добавьте домен в ISP Manager
- Отредактируйте hosts-файл для локального тестирования
- Проверьте работу сайта перед сменой DNS
- Установите оптимизирующие плагины для использования расширений PHP
Оптимальные настройки PHP для WordPress с WooCommerce
Параметр | Рекомендуемое значение | Описание |
---|---|---|
PHP версия | 8.1+ | Использование современной версии PHP значительно повышает производительность |
max_input_vars | 50000 | Количество переменных ввода, важно для больших форм и каталогов |
max_file_uploads | 20 | Количество файлов, которые можно загрузить за один раз |
opcache.memory_consumption | 256 | Объем памяти для кэша скомпилированного кода в MB |
opcache.max_accelerated_files | 20000 | Максимальное количество файлов в кэше OPcache |
opcache.jit_buffer_size | 256 | Размер буфера JIT-компилятора в PHP 8+ |
session.gc_probability | 1 | Вероятность запуска сборщика мусора сессий |
session.use_strict_mode | 1 | Усиленная безопасность сессий |
realpath_cache_size | 8M | Размер кэша реальных путей |
realpath_cache_ttl | 3600 | Время жизни кэша реальных путей |
max_execution_time | 600 | Максимальное время выполнения скрипта |
max_input_time | 600 | Максимальное время обработки входных данных |
memory_limit | 1024M | Максимальный объем оперативной памяти, доступный PHP |
post_max_size | 512M | Максимальный размер данных, отправляемых методом POST |
upload_max_filesize | 512M | Максимальный размер загружаемого файла |
Установка необходимых расширений PHP
Для оптимальной работы WordPress с WooCommerce рекомендуется установить следующие расширения PHP:
Расширение | Назначение | Команда установки |
---|---|---|
imagick | Оптимизация изображений | apt install php8.1-imagick |
redis | Кэширование объектов | apt install redis-server php8.1-redis |
memcached | Альтернативное кэширование | apt install memcached php8.1-memcached |
intl | Поддержка многоязычности | apt install php8.1-intl |
opcache | Кэширование PHP-кода | Встроено в PHP, требует настройки |
mysqli | Работа с базами данных MySQL | apt install php8.1-mysqli |
mbstring | Поддержка многобайтовых строк | apt install php8.1-mbstring |
mbstring | Поддержка многобайтовых строк | apt install php8.1-mbstring |
soap | Работа с SOAP API | apt install php8.1-soap |
xml | Обработка XML | apt install php8.1-xml |
gd | Обработка изображений | apt install php8.1-gd |
Настройка OPcache и JIT
Для PHP 8+ рекомендуется активировать JIT-компилятор, который может значительно ускорить выполнение PHP-кода. Настройки для файла /etc/php/8.1/fpm/conf.d/10-opcache.ini
:
opcache.enable=1 opcache.memory_consumption=256 opcache.max_accelerated_files=20000 opcache.revalidate_freq=2 opcache.jit=1255 opcache.jit_buffer_size=256M
Настройка плагинов WordPress для использования расширений
После установки всех необходимых расширений PHP, важно установить соответствующие плагины WordPress для их использования:
Расширение PHP | Рекомендуемые плагины |
---|---|
Redis | Redis Object Cache, WP Redis |
Memcached | W3 Total Cache, WP Rocket |
Imagick | EWWW Image Optimizer, Imagify, ShortPixel |
OPcache | WP-Optimize, Perfmatters |
Оптимизация MySQL
Шаг 1: Создайте новый файл конфигурации MySQL.
Перейдите в директорию /etc/mysql/mysql.conf.d/
и создайте файл custom.cnf
.
Этот файл позволит задать кастомные настройки MySQL без изменения основного конфигурационного файла.
Шаг 2: Добавьте в файл следующее содержимое:
[mysqld]
# Количество соединений
max_connections = 300
# Размер пакетов
max_allowed_packet = 64M
# Таймауты соединений
connect_timeout = 20
wait_timeout = 300
interactive_timeout = 300
# ========================
# Оптимизация InnoDB
# ========================
# Выделяем ~60% памяти под InnoDB буфер (3.5GB из 6GB)
innodb_buffer_pool_size = 3584M
# Количество пулов (1 на каждое ядро)
innodb_buffer_pool_instances = 4
# Размер лога транзакций
innodb_log_file_size = 512M
innodb_log_buffer_size = 64M
# Оптимизация производительности
innodb_flush_log_at_trx_commit = 2
innodb_file_per_table = 1
innodb_flush_method = O_DIRECT
# ========================
# Кэширование
# ========================
# Оптимизировано для 4 ядер
table_open_cache = 2048
thread_cache_size = 64
# Размеры временных таблиц
tmp_table_size = 128M
max_heap_table_size = 128M
# ========================
# Оптимизация сортировки
# ========================
sort_buffer_size = 4M
read_buffer_size = 4M
read_rnd_buffer_size = 8M
# ========================
# Логирование медленных запросов
# ========================
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 2
log_queries_not_using_indexes = 1
# ========================
# Дополнительные оптимизации
# ========================
# Оптимизация для SSD
innodb_io_capacity = 2000
innodb_io_capacity_max = 4000
# Отключение обратного DNS-поиска
skip_name_resolve = 1
# Оптимизация для Join-запросов
join_buffer_size = 4M
# Оптимизация загрузки базы при старте
innodb_buffer_pool_dump_at_shutdown = 1
innodb_buffer_pool_load_at_startup = 1
Шаг 3: Сохраните файл и перезагрузите MySQL.
Выполните следующую команду:
sudo systemctl restart mysql
Важно! Перед внесением изменений убедитесь, что у вас есть резервная копия конфигурационного файла.
Оптимальные параметры PHP-FPM для WooCommerce
Шаг 1: Найдите и отредактируйте файл конфигурации PHP-FPM.
Обычно он находится в /etc/php/8.1/fpm/pool.d/pool.d/xn--e1afgfqo3f.com.conf
.
Правильная настройка PHP-FPM критически важна для интернет-магазинов на WooCommerce, так как они генерируют множество параллельных запросов.
Шаг 2: Для сервера с 4 ядрами и 6GB RAM добавьте следующие параметры:
pm = dynamic
pm.max_children = 50
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 20
pm.max_requests = 500
request_terminate_timeout = 600
pm.process_idle_timeout = 10s
Шаг 3: Для дополнительной оптимизации (если у вас SSD-диск) добавьте:
request_terminate_timeout = 300s
rlimit_files = 65536
rlimit_core = unlimited
Шаг 4: Сохраните файл и перезапустите PHP-FPM.
Выполните следующую команду:
sudo systemctl restart php8.1-fpm
Важно! Перед внесением изменений создайте резервную копию конфигурационного файла.
Объяснение параметров:
- pm.max_children = 50 → PHP-FPM сможет одновременно обрабатывать до 50 процессов (вместо 5). Это критично для WooCommerce, так как там много AJAX-запросов (например, обновление корзины, фильтры, поиск товаров).
- pm.start_servers = 10 → При запуске создастся 10 PHP-процессов, чтобы быстрее обрабатывать первые запросы.
- pm.min_spare_servers = 5 → Минимум 5 свободных процессов, чтобы запросы не ждали в очереди.
- pm.max_spare_servers = 20 → Максимум 20 свободных процессов (баланс между скоростью и нагрузкой на сервер).
- pm.max_requests = 500 → Перезапускает процессы после 500 обработанных запросов (чтобы избежать утечек памяти).
- request_terminate_timeout = 600s → Если какой-то запрос завис (например, большой экспорт товаров), PHP его убьет через 10 минут.
- pm.process_idle_timeout = 10s → Процессы, которые не используются, будут завершаться через 10 секунд.
- rlimit_files = 65536 → Увеличивает лимит открытых файлов (актуально, если у WooCommerce много товаров).
- rlimit_core = unlimited → Снимает ограничения на использование процессора.
Настройки конфигурации NGINX под WordPress + Woocommerce
# Оптимизации для WordPress
# Разместите в /etc/nginx/vhosts-resources/xn--e1afgfqo3f.com/custom.conf
# После внесения изменений проверьте корректность конфигураций командой sudo nginx -t
# Заголовки безопасности
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
add_header Content-Security-Policy "default-src * 'unsafe-inline' 'unsafe-eval' data: blob: filesystem:;" always;
add_header Permissions-Policy "" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
# Блокировка XML-RPC (устаревший API, уязвимый к атакам)
location = /xmlrpc.php {
deny all;
}
# Блокировка выполнения PHP в uploads/ директории
location /wp-content/uploads/ {
location ~ \.php$ {
deny all;
}
}
# Улучшенное кэширование статики
location ~* \.(jpg|jpeg|gif|png|svg|ico|css|js|mp4|woff|woff2|eot|ttf|otf|mp3|ogg|zip|gz|bz2?|rar|swf|pdf|webp)$ {
expires 365d;
add_header Cache-Control "public, max-age=31536000, immutable";
}
# ✅ Оптимизация выгрузки товаров из 1С
location ~* ^/(import\.php|import\.xml|offers\.xml|prices\.xml|rests\.xml)$ {
client_max_body_size 512M; # Увеличиваем лимит загрузки файлов
proxy_read_timeout 600s;
proxy_send_timeout 600s;
fastcgi_read_timeout 600s;
fastcgi_send_timeout 600s;
access_log off;
error_log /var/www/httpd-logs/xn--e1afgfqo3f.com.error.log notice;
}
# ✅ Оптимизация FastCGI для PHP
location ~ \.php$ {
fastcgi_buffers 64 64k;
fastcgi_buffer_size 128k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 512k;
fastcgi_read_timeout 600s;
fastcgi_send_timeout 600s;
client_max_body_size 512M;
}
# ✅ Оптимизация админки WordPress
location ~* /wp-admin/ {
fastcgi_buffers 64 64k;
fastcgi_buffer_size 128k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 512k;
fastcgi_read_timeout 600;
fastcgi_connect_timeout 600;
fastcgi_send_timeout 600;
}
# ✅ Защита важных файлов WordPress
location ~* "/(\.|wp-config|wp-load|xmlrpc|htaccess|license|readme|backup|dump|db|sql|log|git).*$" {
deny all;
}
location ~* "\.(sql|bak|old|log|tar|gz|zip|jsp|asp|sh|pl|cgi|htaccess)$" {
deny all;
}
# ✅ Защита от сканирования сценариев WP
location ~* "(eval\(|eval\/|eval\.php|\/system\/|system32|passwd|boot\.ini)" {
deny all;
}
Настройка Redis для WordPress
После установки плагина Redis Object Cache, добавьте следующие строки в файл wp-config.php:
define('WP_CACHE', true);
define('WP_REDIS_HOST', 'localhost');
define('WP_REDIS_PORT', '6379');
define('WP_CACHE_KEY_SALT', '_our_key');
Защита от DDoS-атак
Для оптимальной защиты от DDoS-атак при использовании ISP Manager рекомендуется следующая конфигурация:
Параметр | Рекомендуемое значение | Описание |
---|---|---|
Количество запросов в секунду | 35-40 | Максимальное число запросов с одного IP |
Максимальный размер всплеска | 150-200 | Допустимое кратковременное превышение лимита |
Важно: При настройке защиты от DDoS важно не блокировать легитимный трафик. Начните с менее строгих настроек и постепенно ужесточайте их при необходимости.
Проверка и мониторинг после миграции
- Создайте файл
phpinfo.php
для проверки настроек PHP - Настройте логирование ошибок PHP:
error_log = /var/www/logs/php_errors.log
- Регулярно проверяйте журналы на наличие ошибок и предупреждений
- Используйте инструменты анализа производительности, такие как Query Monitor
Заключение
Правильная настройка PHP является критически важным аспектом миграции WordPress с WooCommerce на VDS. Оптимизированные настройки PHP, установка необходимых расширений и соответствующих плагинов WordPress позволят вашему интернет-магазину работать быстро и стабильно даже при высоких нагрузках.
После миграции регулярно проверяйте производительность сайта и при необходимости корректируйте настройки. С правильно настроенным PHP вы получите значительное преимущество в скорости работы сайта и SEO.
Во всех наших проектах мы решили использовать VDS от Бегет. Простата установки и оперативная поддержка.