Давайте перенесем WordPress сайт с хостинга на виртуальный сервер (VPS) и настроим все для быстрой загрузки сайта. Статья получилась объемной и максимально подробной!

Выбрали и оплатили VPS сервер

Я выбрала себе виртуальный сервер (VPS) со следующими характеристиками:

IPv4 Address: 1
RAM: 1 GB RAM
CPU Cores: 1 CPU Core
Operating System: Debian 12 64 Bit
Disk Space: 24 GB SSD
Трафик в месяц: 1.95 TB
Стоимость в год: $17.28 USD

Настроили SSH доступ на VPS по ключу

В статье «SSH key в Windows и Linux. Руководство» подробно описано, как настроить SSH доступ на сервер VPS не через логин и пароль, а по ключу. Это нужно для безопасности!

Чтобы SSH соединение не разрывалось

Чтобы SSH соединение не разрывалось при «неактивности», в Linux используем команду:

ssh -o ServerAliveInterval=60 -i /home/user/VDS_ir user@123.45.67.89

где -o ServerAliveInterval=60 указывает SSH клиенту отправлять специальные пакеты keep-alive на сервер каждые 60 секунд. Это позволяет избежать разрыва SSH соединения из-за простоя.

-i /home/user/VDS_ir задает путь к приватному ключу /home/user/VDS_ir. Этот ключ используется для аутентификации вместо пароля.

user@123.45.67.89 — это указание имени пользователя user на сервере и IP адрес сервера 123.45.67.89.

Чтобы SSH соединение не разрывалось при простое в Windows, в PuTTY в разделе Connection выставляем значение 60 для параметра Seconds between keepalives (0 to turn off).

Запаковываем сайт в архив

Переходим в WordPress-админку сайта, который требуется перенести.

Перед созданием архива сайта рекомендуется уменьшить размер базы данных сайта с помощью WordPress плагина WP-Optimize.

Устанавливаем WordPress плагин Duplicator для создания архива сайта. Переходим на вкладку плагина Duplicator и двумя кликами мышки получаем запакованный архив сайта archive.zip и скрипт установщика installer.php. Скачиваем архив и скрипт к себе на локальную машину, например, в поддиректорию Documents. Из этой локальной поддиректории Documents копируем архив и скрипт на VPS сервер в предварительно созданную для этого директорию /home/user/adminkin/public_html:

scp -i /home/user/VDS_ir Documents/installer.php user@123.45.67.89:/home/user/adminkin/public_html

где scp — команда безопасного копирования файлов по SSH.

-i /home/user/VDS_ir указывает путь к приватному SSH-ключу /home/user/VDS_ir, который используется для аутентификации.

Documents/installer.php — это путь к локальному файлу installer.php, который нужно передать на сервер. Он находится в Documents.

/home/user/adminkin/public_html – путь на удаленном сервере, куда поместится файл.

Аналогичная команда для копирования архива archive.zip:

scp -i /home/user/VDS_ir  Documents/archive.zip  user@123.45.67.89:/home/user/adminkin/public_html

DNS записи

Отредактируем DNS записи для домена WordPress сайта. Записи с типом А должны содержать IP адрес сервера, куда осуществляется перенос WordPress сайта. После внесения изменений в DNS записи нужно выждать время, чтобы исправленные DNS записи домена обновились на серверах.

MySQL на сервере VPS

Устанавливаем MySQL сервер

На VPS сервере устанавливаем сервер баз данных MySQL для работы сайта WordPress:

apt install mariadb-server

Настраиваем параметры безопасности и создаем пароль для MySQL-пользователя root:

mysql_secure_installation

На все вопросы отвечаем утвердительно (Y).

Рестартуем, чтобы изменения вошли в силу:

systemctl restart mysql

Создаем пользователя и базу данных MySQL

Запускаем MySQL-клиент в командной строке под MySQL-пользователем root:

mysql -u root -p

Создаем MySQL базу данных с именем db_adminkin:

CREATE DATABASE db_adminkin DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

Создаем MySQL-пользователя с именем usr_adminkin и паролем password:

CREATE USER 'usr_adminkin'@'localhost' IDENTIFIED BY 'password';

Предоставляем пользователю usr_adminkin права доступа к базе данных db_adminkin:

GRANT ALL PRIVILEGES ON db_adminkin.* TO 'usr_adminkin'@'localhost' IDENTIFIED BY 'password';
FLUSH PRIVILEGES;

Проверить предоставленные права можно с помощью команды:

SHOW GRANTS FOR 'usr_adminkin'@'localhost';

Выходим из MySQL-клиента:

exit

PHP на сервере VPS

На VPS сервере устанавливаем PHP, необходимый для работы сайта на WordPress:

apt install php php-bcmath php-bz2 php-cli php-common php-curl php-fpm php-gd php-imagick php-intl php-mbstring php-mysql php-readline php-soap php-xml php-xmlrpc php-zip

Nginx на сервере VPS

На VPS сервере устанавливаем веб-сервер Nginx:

apt install nginx

Создаем конфигурационный файл сайта /etc/nginx/sites-available/adminkin.pro.conf со следующим содержимым:

server {
 listen 80;
 server_name adminkin.pro www.adminkin.pro;
 root /home/user/adminkin/public_html;
 index index.php;
 location / {
  try_files $uri $uri/ /index.php?$args;
 }
 location ~ \.php$ {
  include snippets/fastcgi-php.conf;
  fastcgi_pass unix:/run/php/php8.2-fpm.sock;
 }
}

где fastcgi_pass — директива Nginx, указывающая путь к FastCGI-серверу (в данном случае PHP-FPM).

unix: означает, что соединение с PHP-FPM будет происходить через Unix-сокет.

/run/php/php8.2-fpm.sock — путь к файлу Unix-сокета PHP-FPM, а 8.2 — версия PHP.

Как же это работает? Когда клиент отправляет запрос, например, на adminkin.pro/index.php, Nginx видит, что файл .php. Он передает запрос обработчику PHP-FPM через FastCGI. PHP-FPM выполняет скрипт и возвращает результат обратно в Nginx, который отправляет его клиенту.

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

ln -s /etc/nginx/sites-available/adminkin.pro.conf /etc/nginx/sites-enabled/

Перезагружаем веб-сервер:

systemctl restart nginx

Проверяем работоспособность сайта по протоколу HTTP. Для этого в директории /home/user/adminkin/public_html создаем файл index.php, например, со следующим содержимым:

<?php phpinfo(); ?>

Переходим в браузер, в адресной строке набираем http://adminkin.pro, должно отобразиться:

Проверка работоспособности веб сервера Nginx

Доступ к сайту по HTTPS

Время установить бесплатный SSL сертифиикат для доступа к сайту по протоколу HTTPS:

apt install certbot python3-certbot-nginx
certbot --nginx -d adminkin.pro -d www.adminkin.pro --register-unsafely-without-email

где certbot — утилита для автоматического получения и обновления SSL сертификатов от Let’s Encrypt.

--nginx указывает, что Certbot должен автоматически настроить Nginx для работы с SSL.

-d adminkin.pro -d www.adminkin.pro указывает домены, для которых запрашивается сертификат. В моем случае это adminkin.pro и www.adminkin.pro.

--register-unsafely-without-email пропускает ввод email при регистрации.

Перезагружаем веб-сервер Nginx, чтобы применить изменения в конфигурационном файле /etc/nginx/sites-available/adminkin.pro.conf, которые внес Certbot по SSL сертификату и редиректу (переадресации) с небезопасного HTTP протокола на безопасный HTTPS протокол:

systemctl restart nginx

В адресной строке браузера опять набираем http://adminkin.pro, чтобы проверить редирект (переадресацию) с HTTP на HTTPS. У меня работает!

Для автоматического обновления SSL сертификата открываем файл crontab на редактирование под пользователем root:

crontab -e

И добавляем строку:

30 2 * * 1 /usr/bin/certbot renew >> /var/log/certbot.log

Теперь каждый понедельник в 2:30 ночи будет выполняться команда /usr/bin/certbot renew. Эта команда проверяет, истекают ли SSL сертификаты, и продлевает их при необходимости. Вывод команды будет сохраняться в файл /var/log/certbot.log.

Настройка сжатия на сервере и настройка кэша браузера

Включим GZIP сжатие для уменьшения передаваемых пользователю данных с сервера, на котором сайт. Для этого в конфигурационном файле /etc/nginx/nginx.conf раскомментируем, удалив символ # в начале строки, следующие строки:

# gzip_vary on;
# gzip_proxied any;
# gzip_comp_level 6;
# gzip_buffers 16 8k;
# gzip_http_version 1.1;
# gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

Добавим строку, чтобы сервер не тратил свои ресурсы на сжатие слишком маленьких файлов:

gzip_min_length 256;

Добавим еще типов файлов (веб-шрифты, изображения SVG и т.д.), которые тоже будут сжиматься. Для этого в строку, начинающуюся с gzip_types в самый конец перед символом ; вставим следующий текст:

image/svg+xml font/ttf font/otf font/eot application/xhtml+xml application/rdf+xml application/manifest+json application/ld+json application/x-javascript application/geo+json application/atom+xml

У меня получилось вот так:

Настройка gzip сжатия на сервере Nginx

Будем кэшировать редко меняющиеся файлы сайта в браузере пользователя на 365 дней. Так, при повторном заходе пользователя на сайт, эти файлы не будут скачиваться с сервера сайта, а будут браться из кэша браузера пользователя. Обычно редко меняющиеся файлы сайта – это изображения, файлы стилей, файлы скриптов JavaScript. Для включения кэширования в конфигурационном файле /etc/nginx/sites-available/adminkin.pro.conf, в секции server добавляем текст:

location ~* \.(jpeg|jpg|png|gif|ico|css|js|pdf|webp|woff2)$ {
	expires 365d;
}

Проверяем конфигурационные файлы Nginx на наличие ошибок:

nginx -t

Перезагружаем веб-сервер:

systemctl restart nginx

Для проверки, использует ли сервер сжатие, запросим с сервера, например, файл стилей CSS. А по заголовку ответа сервера определим, использовал ли сервер сжатие при отправке CSS.

curl -H 'Accept-Encoding: gzip' -I https://adminkin.pro/wp-content/themes/listinghive/style.css

Ура! Использует:

Проверка Использует ли сервер сжатие CSS файла

Настройка прав доступа

Запрещаем доступ к директории сайта /home/user/adminkin/public_html всем пользователям, кроме владельца и его группы:

chmod -R o-rwx /home/user/adminkin/public_html/

Веб сервер Nginx работает под пользователем www-data. Убедиться в этом можно, заглянув в конфигурационный файл /etc/nginx/nginx.conf. Для доступа Nginx к сайту добавляем пользователя www-data в группу user:

usermod -a -G user www-data

Для доступа PHP-FPM к сайту правим параметры user и group в конфигурационном файле /etc/php/8.2/fpm/pool.d/www.conf, где 8.2 — это версия PHP:

user = user
group = user

Перезагружаем:

/etc/init.d/php8.2-fpm restart

Больше не нужен index.php, удаляем его:

rm /home/user/adminkin/public_html/index.php

Разворачиваем сайт из архива

Разворачиваем сайт из архива, созданного плагином Duplicator. Для этого в адресной строке браузера набираем https://adminkin.pro/installer.php. Далее, указываем имя MySQL базы, имя MySQL-пользователя и его пароль. И все! Сайт успешно мигрирован!

Заходим в WordPress-админку сайта, активируем необходимые плагины, проверяем работоспособность сайта.

Ускорение загрузки изображений

WebP — это современный формат изображений, разработанный Google, который обеспечивает хорошее качество при меньшем размере файла по сравнению с JPEG и PNG. WebP поддерживается всеми современными браузерами.

Я использую WordPress плагин WebP Express для автогенерации изображений в формате WebP вместо JPEG и PNG. Для работоспособности плагина ставим необходимые пакеты обработки изображений:

apt install imagemagick ffmpeg webp

В админ-панели WordPress, в настройках плагина WebP Express выставляем параметр Destination folder в значение Mingled, чтобы сгенерированные WebP изображения сохранялись в ту же директорию, где и оригиналы JPEG/PNG.

Настройка плагина WebP Express

Отмечаем «галочкой» параметр Convert on upload для автогенерации WebP изображения при загрузке на сервер изображения JPEG/PNG.

Ускорение загрузки изображений

Остальные настроки плагина WebP Express оставляем по умолчанию. После внесенных изменений не забываем нажать кнопку Save settings для сохранения настроек. Нажимаем кнопку Bulk Convert для генерации в WebP уже загруженных изображений (см. рис. выше).

Я после небольшого эксперемента с качеством сжатых изображений WebP и их получаемым размером все же поменяла в разделе Conversion, в Jpeg options параметр Quality for lossy в значения Fixed quality и 60.

Настроим Nginx так, чтобы при запросе изображения JPEG/PNG сервер по возможности отдавал изображение WebP. Редактируем конфигурационный файл /etc/nginx/sites-available/adminkin.pro.conf. Перед блоком:

location ~* \.(jpeg|jpg|png|gif|ico|css|js|pdf|webp|woff2)$ {
	expires 365d;
}

Вставляем блок:

location ~* ^/?wp-content/.*\.(png|jpe?g)$ {
	add_header Vary Accept;
	expires 365d;
	if ($http_accept !~* "webp"){
		break;
	}
	try_files $uri.webp /wp-content/plugins/webp-express/wod/webp-on-demand.php?xsource=x$request_filename&wp-content=wp-content;
}

где webp-on-demand.php — это скрипт конвертации в WebP формат.

Перезагружаем веб-сервер:

systemctl restart nginx

Ускорение PHP

Ускорим наш проект на PHP (WordPress сайт) с помощью PHP кэширования.

APCu (Alternative PHP Cache User) — это расширение PHP, обеспечивающее кэширование данных в оперативной памяти. Оно предназначено для ускорения работы веб-приложений за счет хранения часто используемых данных в общем кэше, доступном для всех процессов PHP. Настроек APCu по умолчанию достаточно для большинства задач, поэтому просто устанавливаем:

apt install php-apcu

Переходим в WordPress-админку и устанавливаем плагин APCu Manager. Плагин появится на боковой панели WordPress под названием PerfOps One. Выбираем PerfOps One, а затем выбираем Settings, чтобы настроить параметры APCu Manager.

Настройки APCu Manager

Проверяем, что все настроки отмечены «галочками», и сохраняем настроки.

Ускорение базы MySQL

Включение кэша запросов MySQL повышает производительность за счет уменьшения частоты обращения MySQL к физическому диску базы данных, поскольку часто используемые запросы хранятся в памяти. По умолчанию функция кэша отключена:

mysql -u root -p
SHOW VARIABLES LIKE 'query_cache_type';
Ускорение базы MySQL

Добавим в конфигурационный файл MySQL /etc/mysql/my.cnf следующий текст:

[mysqld]
query_cache_type = 1     # Включаем кэш
query_cache_size = 64M   # Объем кэша 64 Мбайт

Рестартуем, чтобы изменения вошли в силу:

systemctl restart mysql

Вывод

По-моему, получилось исчерпывающее руководство по переносу сайта с хостинга на виртуальный сервер VPS.

Интересно сравнить скорость загрузки одного и того же сайта на хостинге и на виртуальном сервере VPS? Пожалуйста, читайте статью: «Хостинг или VPS? Личное исследование«.

Свои вопросы и дополнения оставляйте в комментариях под статьей.

Комментарии

Добавить комментарий

Этот сайт защищен reCAPTCHA, и к нему применяются Google Политика конфиденциальности и Условия использования.

Войти

Зарегистрироваться

Сбросить пароль

Пожалуйста, введите ваше имя пользователя или эл. адрес, вы получите письмо со ссылкой для сброса пароля.