Подготовка сервера
Подключитесь к серверу по SSH и обновите систему:
apt update && apt upgrade -yУстановите вспомогательные утилиты:
apt install -y curl wget unzip git ufwНастройте файрволл:
ufw allow OpenSSH
ufw allow 'Nginx Full'
ufw enable1. Установка и настройка Nginx
apt install -y nginx
systemctl enable --now nginxПроверьте, что Nginx запустился — откройте IP в браузере, должна появиться страница «Welcome to nginx». Или:
systemctl status nginx
curl -I http://localhost
# HTTP/1.1 200 OK — всё работает2. Установка PHP 8.3-FPM
В стандартных репозиториях Ubuntu 22.04 есть PHP 8.1. Для актуальной 8.3 добавляем PPA:
apt install -y software-properties-common
add-apt-repository ppa:ondrej/php -y
apt updateapt install -y php8.3-fpm php8.3-mysql php8.3-xml php8.3-curl \
php8.3-gd php8.3-mbstring php8.3-zip php8.3-intl \
php8.3-bcmath php8.3-imagick php8.3-opcacheОптимизируем настройки PHP для WordPress. Открываем конфиг:
nano /etc/php/8.3/fpm/php.iniНайдите и измените (или добавьте в конец файла) эти параметры:
upload_max_filesize = 64M
post_max_size = 64M
max_execution_time = 300
memory_limit = 256M
max_input_vars = 3000systemctl restart php8.3-fpm
systemctl enable php8.3-fpm3. Установка MariaDB и создание базы данных
apt install -y mariadb-server
systemctl enable --now mariadbЗапускаем мастер безопасности — он уберёт анонимных пользователей, тестовую БД и запретит удалённый root-логин:
mysql_secure_installation
# Отвечаем: n (root password), n (unix_socket), y, y, y, yСоздаём базу данных и пользователя для WordPress:
mysql -u root
CREATE DATABASE wordpress CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'wpuser'@'localhost' IDENTIFIED BY 'СильныйПароль123!';
GRANT ALL PRIVILEGES ON wordpress.* TO 'wpuser'@'localhost';
FLUSH PRIVILEGES;
EXIT;wordpress, пользователь — wpuser, пароль — ваш. Они понадобятся при настройке WordPress.4. Загрузка и настройка WordPress
cd /var/www
wget https://wordpress.org/latest.tar.gz
tar -xzf latest.tar.gz
mv wordpress ваш_домен.ru
rm latest.tar.gzchown -R www-data:www-data /var/www/ваш_домен.ru
find /var/www/ваш_домен.ru -type d -exec chmod 755 {} \;
find /var/www/ваш_домен.ru -type f -exec chmod 644 {} \;Создаём конфиг WordPress из шаблона:
cd /var/www/ваш_домен.ru
cp wp-config-sample.php wp-config.php
nano wp-config.phpНайдите и замените строки с данными базы данных:
define( 'DB_NAME', 'wordpress' );
define( 'DB_USER', 'wpuser' );
define( 'DB_PASSWORD', 'СильныйПароль123!' );
define( 'DB_HOST', 'localhost' );
define( 'DB_CHARSET', 'utf8mb4' );Обязательно замените secret keys — скопируйте новые с api.wordpress.org/secret-key/1.1/salt/:
curl https://api.wordpress.org/secret-key/1.1/salt/5. Виртуальный хост Nginx
Создаём конфигурацию сайта в Nginx:
nano /etc/nginx/sites-available/ваш_домен.ruserver {
listen 80;
server_name ваш_домен.ru www.ваш_домен.ru;
root /var/www/ваш_домен.ru;
index index.php index.html;
# Логи
access_log /var/log/nginx/ваш_домен.ru_access.log;
error_log /var/log/nginx/ваш_домен.ru_error.log;
# Максимальный размер загрузки
client_max_body_size 64M;
# WordPress permalinks
location / {
try_files $uri $uri/ /index.php?$args;
}
# PHP обработка
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
}
# Безопасность: закрываем xmlrpc и wp-config
location = /xmlrpc.php { deny all; }
location ~ /\.ht { deny all; }
# Кеш статики
location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff2)$ {
expires 30d;
add_header Cache-Control "public, no-transform";
}
}ln -s /etc/nginx/sites-available/ваш_домен.ru /etc/nginx/sites-enabled/
nginx -t
# nginx: configuration file /etc/nginx/nginx.conf test is successful
systemctl reload nginx6. SSL-сертификат от Let's Encrypt
Устанавливаем Certbot и получаем бесплатный SSL:
apt install -y snapd
snap install --classic certbot
ln -s /snap/bin/certbot /usr/bin/certbotcertbot --nginx -d ваш_домен.ru -d www.ваш_домен.ru
# Введите email, согласитесь с условиями
# Certbot спросит: перенаправлять HTTP → HTTPS? Выберите 2 (Redirect)Проверяем автообновление:
certbot renew --dry-run
# Должно завершиться без ошибок7. Установка WordPress через браузер
Откройте https://ваш_домен.ru в браузере. Откроется мастер установки WordPress:
Если вместо формы вы видите файлы директории — значит Nginx не передаёт запросы PHP-FPM. Проверьте путь к сокету: ls /run/php/ — сокет должен называться php8.3-fpm.sock.
8. Оптимизация: OPcache и Nginx FastCGI Cache
OPcache — кеш байткода PHP
OPcache компилирует PHP-файлы один раз и хранит в памяти. WordPress загружается в 3–5 раз быстрее. Обычно включён по умолчанию, но требует настройки:
php8.3 -i | grep opcache.enable
# opcache.enable => On => Onopcache.enable=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
opcache.fast_shutdown=1FastCGI Cache — кеш страниц
FastCGI Cache сохраняет готовые HTML-страницы. Анонимные посетители получают страницу без обращения к PHP и MySQL — скорость вырастает в 10–50 раз.
fastcgi_cache_path /var/cache/nginx/wordpress
levels=1:2 keys_zone=WORDPRESS:10m max_size=1g
inactive=60m use_temp_path=off;mkdir -p /var/cache/nginx/wordpress
chown www-data:www-data /var/cache/nginx/wordpressДобавляем в server-блок конфига сайта, перед location /:
# Не кешируем авторизованных пользователей и страницы корзины
set $skip_cache 0;
if ($request_method = POST) { set $skip_cache 1; }
if ($query_string != "") { set $skip_cache 1; }
if ($request_uri ~* "/wp-admin/|/xmlrpc.php|wp-.*.php") { set $skip_cache 1; }
if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in") {
set $skip_cache 1;
}fastcgi_cache WORDPRESS;
fastcgi_cache_valid 200 60m;
fastcgi_cache_use_stale error timeout invalid_header updating http_500;
fastcgi_cache_bypass $skip_cache;
fastcgi_no_cache $skip_cache;
add_header X-FastCGI-Cache $upstream_cache_status;Установите плагин Nginx Helper в WordPress — он будет автоматически сбрасывать кеш при публикации/изменении записей.
9. Базовая безопасность
Защита wp-login.php от брутфорса
Установите fail2ban и создайте правило для WordPress:
apt install -y fail2banСоздайте /etc/fail2ban/filter.d/wordpress.conf:
[Definition]
failregex = ^<HOST> .* "POST /wp-login.php
ignoreregex =Добавьте jail в /etc/fail2ban/jail.local:
[wordpress]
enabled = true
filter = wordpress
logpath = /var/log/nginx/ваш_домен.ru_access.log
maxretry = 5
bantime = 3600Закрываем xmlrpc.php
XML-RPC используется для DDoS-амплификации. Если не нужен — отключите:
location = /xmlrpc.php { deny all; }Права доступа к файлам
find /var/www/ваш_домен.ru -type d -exec chmod 755 {} \;
find /var/www/ваш_домен.ru -type f -exec chmod 644 {} \;
chmod 600 /var/www/ваш_домен.ru/wp-config.phpАвтообновления WordPress
Добавьте в wp-config.php для автоматических обновлений безопасности:
define( 'WP_AUTO_UPDATE_CORE', 'minor' );Чеклист готовности
- ✓Nginx запущен, сайт открывается по домену
- ✓PHP 8.3-FPM работает, WordPress установлен
- ✓HTTPS работает, HTTP перенаправляет на HTTPS
- ✓Загрузка изображений работает (проверьте в медиатеке)
- ✓Постоянные ссылки настроены (Настройки → Постоянные ссылки)
- ✓OPcache включён (плагин Health Check подтвердит)
- ✓fail2ban запущен: systemctl status fail2ban
- ✓Настроены автоматические бэкапы (плагин UpdraftPlus)