Установка WordPress на веб-сервер Nginx с обработчиком PHP-FPM

Это пошаговое руководство по развертыванию сайта под управлением WordPress 6.0 на выделенном сервере со стеком LEMP и менеджером процессов PHP-FPM, а также файрволом и поддержкой протокола HTTPS на основе Ubuntu Server 20.04 LTS.

Технические требования

Требования к серверу включают несколько элементов: оперативная память, версия базы данных, вычислительная мощность, дисковое пространство и используемый веб-сервер.

Минимальные технические требования для установки WordPress:

Сервер Nginx или Apache с модулем mod-rewrite
Дисковое пространство Не менее 1 GB
PHP Версия 7.4 или выше
База данных MySQL 5.015 или выше (MariaDB, версия 10.1 или выше)
RAM Не менее 512 MB
CPU Не менее 1.0 GHz

В процессе создания этого материала был использован облачный сервер с тарифом Turbo-1 от компании REG.RU. Перед установкой веб-сервера, убедитесь в корректности настроек DNS для домена у вашего хостинг-провайдера.

Установка PHP 7.4

Подключитесь к серверу по SSH под логином root и обновите менеджер пакетов Ubuntu:

apt update

Установите PHP, менеджер процессов PHP-FPM и модуль для MySQL:

apt install php7.4 php7.4-fpm php7.4-mysql

Установите обязательные модули для корректной работы WordPress:

apt install php7.4-curl php7.4-json php7.4-gd php7.4-mbstring php7.4-intl php7.4-bcmath php7.4-bz2 php7.4-readline php7.4-zip php7.4-xml php7.4-xmlrpc php7.4-soap php-imagick

Проверьте корректность установки PHP:

php -v

Установка Nginx

Для стабильной работы WordPress установка дополнительных модулей в Nginx не требуется. Вы можете выполнить автоматическую установку сервера из репозитория Ubuntu или собрать его в ручную.

Вариант 1: автоустановка

Для установки сервера Nginx в Ubuntu, выполните:

apt install nginx

Вариант 2: сборка из исходников

Перейдите в папку:

cd /usr/local/src/

Разрешите загрузку deb-src, удалив символ комментария #:

nano /etc/apt/sources.list

Редактирование sources.list в Ubuntu Server

Обновите менеджер пакетов Ubuntu:

apt update

Скачайте исходники Nginx:

apt source nginx

Установите набор инструментов dpkg-dev:

apt install dpkg-dev

Установите зависимости для сборки:

apt build-dep nginx -y

Перейдите в директорию:

cd /usr/local/src/nginx-*/

Соберите пакет:

dpkg-buildpackage -b -uc -us

Проверьте наличие пакета на диске:

ls /usr/local/src/*.deb

Установите Nginx и проверьте его статус:

dpkg -i /usr/local/src/*.deb
systemctl status nginx

Настройка конфигурации

Создайте корневую директорию для сайта, где example.com — его доменное имя:

mkdir -p /var/www/example.com/html

Добавьте конфигурацию Nginx c поддержкой менеджера процессов PHP-FPM:

nano /etc/nginx/sites-available/example.com.conf

Cодержание nginx.conf:

upstream example-php-handler {
        server unix:/var/run/php/php7.4-fpm.sock;
}
server {
        listen 80;
        server_name example.com www.example.com;
        root /var/www/example.com/html;
        index index.php;
        location / {
                try_files $uri $uri/ /index.php?$args;
        }
        location ~ \.php$ {
                include snippets/fastcgi-php.conf;
                fastcgi_pass example-php-handler;
        }
}

Создайте символьную ссылку на файл конфигурации для включения сайта:

ln -s /etc/nginx/sites-available/example.com.conf /etc/nginx/sites-enabled/

Для проверки синтаксиса конфигурации выполните:

nginx -t

Перезагрузите сервер:

systemctl restart nginx

Настройка протокола HTTPS

Для включения поддержки HTTPS, потребуется выпуск SSL-сертификата для домена и настройка перенаправлений на сервере.

Создайте ключ не менее 2048 бит:

openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

Запишите параметры безопасности:

nano /etc/nginx/snippets/ssl-params.conf
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;

ssl_dhparam /etc/ssl/certs/dhparam.pem;

ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;

add_header Strict-Transport-Security "max-age=63072000" always;

Установите утилиту Snap:

apt install snapd
snap install core

Установите certbot:

snap install --classic certbot

Создайте символьную ссылку:

ln -s /snap/bin/certbot /usr/bin/certbot

Начните процесс получения сертификата в соответствии с конфигурацией сервера:

certbot certonly --nginx

Выполнение сценария:

Enter email address (used for urgent renewal and security notices)
Укажите действительный адрес эл. почты для получения уведомлений.
You must agree in order to register with the ACME server. Do you agree?
Y
Which names would you like to activate HTTPS for?
1 2

Измените конфигурацию Nginx для поддержки протокола HTTPS:

nano /etc/nginx/sites-available/example.com.conf

Cодержание nginx.conf:

upstream example-php-handler {
        server unix:/var/run/php/php7.4-fpm.sock;
}
server {
        listen 80;
        listen [::]:80;

        server_name example.com www.example.com;
        return 301 https://example.com$request_uri;
}
server {
        listen 443 ssl;
        listen [::]:443 ssl;

        server_name www.example.com;
        return 301 https://example.com$request_uri;

        ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
        ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;

        include snippets/ssl-params.conf;
}

server {
        listen 443 ssl;
        listen [::]:443 ssl;

        server_name example.com;
        root /var/www/example.com/html;
        index index.html index.php;

        ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
        ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;

        include snippets/ssl-params.conf;

        location / {
                try_files $uri $uri/ /index.php?$args;
        }

        location ~ \.php$ {
                include snippets/fastcgi-php.conf;
                fastcgi_pass example-php-handler;
        }
}

Для проверки синтаксиса конфигурации выполните:

nginx -t

Перезагрузите сервер:

systemctl restart nginx

Создайте в корневой директории файл index.php:

nano /var/www/example.com/html/index.php
<?php
    phpinfo();
?>

Откройте сайт и убедитесь, что сервер использует в качестве API — FPM/FastCGi:

Вывод результата функции phpinfo в браузере

А затем удалите файл:

rm /var/www/example.com/html/index.php

Установка MySQL Server 8

Установите MySQL Server:

apt install mysql-server

Начните новый сеанс:

mysql

Задайте пароль для пользователя root, где password — пароль не менее чем из 8 символов с использованием цифр, смешанного регистра и специальных символов:

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password by 'password';

Завершите сеанс:

exit

Запустите сценарий оболочки для настройки параметров безопасности:

mysql_secure_installation

Выполнение сценария:

Enter password for user root:
Введите пароль пользователя root.
Would you like to setup VALIDATE PASSWORD component?
Y
There are three levels of password validation policy:
2
Change the password for root?
N
Do you wish to continue with the password provided:
Y
Remove anonymous users:
Y
Disable root login remotely:
Y
Remove test database and access to it:
Y
Reload privilege tables now:
Y

Проверьте корректность установки MySQL:

systemctl status mysql

Создание базы данных

Начните новый сеанс:

mysql -p

Создайте новую базу данных, где database_name — имя базы данных:

CREATE DATABASE database_name DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

Создайте нового пользователя, где database_user — имя пользователя, user_password — пароль:

CREATE USER 'database_user'@'localhost' IDENTIFIED BY 'user_password';

Предоставьте пользователю права доступа ко всем таблицам в database_name:

GRANT ALL ON database_name.* TO 'database_user'@'localhost';

Сбросьте привилегии:

FLUSH PRIVILEGES;

Завершите сеанс:

exit

Установка phpMyAdmin

Установите приложение из репозитория:

apt install phpmyadmin

Выполнение сценария:

Web server to reconfigure automatically?
Изменение конфигурации не требуется, наведите курсор на <ОК> нажатием клавиши Tab и нажмите Enter.
Настройка конфигурации phpMyAdmin в консоли
Configure database for phpmyadmin with dbconfig-common?
<YES>
MySQL application password for phpmyadmin:
Задайте пароль и нажмите <ОК>.
Password confirmation:
Повторите пароль и нажмите <ОК>.

В случае возникновения ошибки ERROR 1819 (HY00), выберите пункт ignore:

Настройка конфигурации phpMyAdmin в случае ошибки

Для исправления ошибки: отключите компонент проверки паролей или понизьте уровень требований в MySQL. После установки phpMyAdmin восстановите прежние настройки.

Создайте символьную ссылку:

ln -s /usr/share/phpmyadmin/ /var/www/example.com/html/

Наберите адрес phpMyAdmin в адресной строке браузера и авторизуйтесь под логином root:

https://example.com/phpmyadmin

Установка Uncomplicated Firewall

Если в вашем образе Ubuntu Server утилита UFW уже установлена, включите файрвол и разрешите сервисы: Nginx Full, OpenSSH.

В иных случаях, установите утилиту для конфигурирования межсетевого экрана:

apt install ufw

Добавьте Nginx в список приложений доступных для использования. Для этого создайте файл:

nano /etc/ufw/applications.d/nginx

Запишите конфигурацию:

[Nginx HTTP]
title=Web Server
description=Enable NGINX HTTP traffic
ports=80/tcp

[Nginx HTTPS] \
title=Web Server (HTTPS) \
description=Enable NGINX HTTPS traffic
ports=443/tcp

[Nginx Full]
title=Web Server (HTTP, HTTPS)
description=Enable NGINX HTTP and HTTPS traffic
ports=80,443/tcp

Добавьте OpenSSH в список приложений UFW. Для этого создайте файл:

nano /etc/ufw/applications.d/open-ssh-server
[OpenSSH]
title=Secure shell server, an rshd replacement
description=OpenSSH is a free implementation of the Secure Shell protocol.
ports=22/tcp

Проверьте список доступных приложений:

ufw app list

Включите файрвол:

ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)?
Y

Разрешите сервисы:

ufw allow 'Nginx Full'
ufw allow 'OpenSSH'

Проверьте статус:

ufw status

Вывод статуса утилиты UFW в консоль

Установка WordPress

Перейдите в корневую директорию сайта:

cd /var/www/example.com/html/

Загрузите последнюю версию WordPress:

wget https://ru.wordpress.org/latest-ru_RU.tar.gz

Выполните процесс разархивирования:

tar -xzvf latest-ru_RU.tar.gz

Перенесите файлы из папки wordpress в корень сайта:

mv wordpress/* /var/www/example.com/html

Удалите загруженный архив и папку wordpress:

rm latest-ru_RU.tar.gz
rm -rf wordpress/

Измените владельца файлов:

chown -R www-data:www-data /var/www/example.com/html

Измените права доступа к файлам и папкам:

find . -type f -exec chmod 644 {} +
find . -type d -exec chmod 755 {} +

Выполните настройку конфигурации WordPress в файле wp-config.php, для этого создайте файл:

cp wp-config-sample.php wp-config.php
nano wp-config.php

И заполните значения констант:

  • DB_NAME,
  • DB_USER,
  • DB_PASSWORD.

Редактирование файла wp-config.php из консоли

Получите уникальный ключи и соли аутентификации по ссылке: https://api.wordpress.org/secret-key/1.1/salt/.

И впишите их в wp-config.php:

Редактирование файла wp-config.php из консоли

Откройте сайт в браузере и выполните установку WordPress, авторизуйтесь в панели администратора и перейдите на экран Здоровье сайта для проверки корректности установки:

Проверка корректности установки WordPress в панели администратора

В руководстве приведена демонстрационная версия файла конфигурации Nginx для WordPress. Установите заголовки безопасности HTTP, настройте правила кэширования и сжатия статических файлов самостоятельно перед публикацией сайта в Интернете.