Статья собирает стек LEMP (Linux, Nginx, MariaDB, PHP) под один сайт WordPress. Домен уже должен указывать на сервер.
Пакеты
$ apt update$ apt install -y nginx mariadb-server php-fpm php-mysql php-curl php-gd php-intl php-mbstring php-xml php-zip php-imagick unzip$ mariadb-secure-installationНа Ubuntu 22.04 скрипт называется mysql_secure_installation. Удалите анонимных пользователей и тестовую базу, запретите удалённый вход root.
База данных
$ mariadbCREATE DATABASE wordpress CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;CREATE USER 'wp'@'localhost' IDENTIFIED BY 'надёжный-пароль';GRANT ALL PRIVILEGES ON wordpress.* TO 'wp'@'localhost';FLUSH PRIVILEGES;EXIT;Файлы WordPress
$ cd /tmp$ curl -LO https://wordpress.org/latest.tar.gz$ tar xzf latest.tar.gz$ mkdir -p /var/www/example.com$ cp -a wordpress/. /var/www/example.com/$ cp /var/www/example.com/wp-config-sample.php /var/www/example.com/wp-config.phpВпишите параметры базы в wp-config.php и замените блок ключей безопасности на свежий — его выдаёт официальный генератор:
$ curl -s https://api.wordpress.org/secret-key/1.1/salt/$ nano /var/www/example.com/wp-config.phpdefine( 'DB_NAME', 'wordpress' );define( 'DB_USER', 'wp' );define( 'DB_PASSWORD', 'надёжный-пароль' );define( 'DB_HOST', 'localhost' );define( 'DISALLOW_FILE_EDIT', true );DISALLOW_FILE_EDIT отключает редактор тем и плагинов в админке — если пароль администратора утечёт, через него не получится записать код на сервер.
Права
$ chown -R www-data:www-data /var/www/example.com$ find /var/www/example.com -type d -exec chmod 755 {} \;$ find /var/www/example.com -type f -exec chmod 644 {} \;$ chmod 640 /var/www/example.com/wp-config.phpNginx
server { listen 80; listen [::]:80; server_name example.com www.example.com; root /var/www/example.com; index index.php; client_max_body_size 32m; location / { try_files $uri $uri/ /index.php?$args; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php8.3-fpm.sock; } location = /xmlrpc.php { deny all; } location ~ /\. { deny all; } location ~* /uploads/.*\.php$ { deny all; }}Nginx проверяет блоки с регулярными выражениями по порядку, поэтому запрет на PHP в uploads сработает, только если стоит выше общего блока для .php. Перенесите его наверх, если хотите включить эту защиту.
$ ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/$ rm -f /etc/nginx/sites-enabled/default$ nginx -t && systemctl reload nginx$ apt install -y certbot python3-certbot-nginx$ certbot --nginx -d example.com -d www.example.comОткройте https://example.com и пройдите мастер установки: название сайта, логин администратора (не admin) и пароль.
Письма из WordPress
Проверьте результат
- В админке: Инструменты → Здоровье сайта — нет критичных проблем.
curl -I https://example.comвозвращает 200 или 301 на канонический адрес.- Загрузка картинки в медиатеку проходит без ошибки прав.
Частые ошибки
- «Error establishing a database connection» — неверные данные в wp-config.php или не запущена MariaDB (
systemctl status mariadb). - WordPress просит данные FTP при установке плагина — у каталога сайта владелец не www-data.
- После включения HTTPS бесконечный редирект — в «Настройки → Общие» адрес сайта указан с http://.