Где-то я уже упоминал, что данный сайт жил на стареньком CentOS 7 и остутствие актуальных пакетов, сборка некоторых из исходников немножко утомила, поэтому сегодня рассмотрим миграцию сайта на новый дистрибутив.
Старый VPS оставляем как есть, ничего не трогая. Заводим в ЛК хостера новый сервер с нужным дистрибутивом. Получаем креды, заходим по ssh и создадим пользователя с sudo правами из под которого будем в дальнейшем ходить через ssh.
useradd <user> -s /bin/bash -m
passwd <user>
usermod -G sudo <user>
Далее копируем ключи с локальной машины на сервер:
ssh-copy-id -i /path/to/privatekey <user>@<ip>
В конфиг /etc/ssh/sshd_config добавляем следующее:
Port <custom ssh port>
PermitRootLogin no
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys .ssh/authorized_keys2
PasswordAuthentication no
Тут мы меняем наш стандартный 22 порт для ssh, запрещаем логин от root пользователя, выключаем авторизацию по пароля и включаем авторизацию по ssh ключам.
Ставим нужные пакеты:
apt install -y - nginx php8.2 php8.2-fpm php8.2-mysqlnd php8.2-intl php8.2-opcache \
php8.2-cli php8.2-gd php8.2-xml php8.2-igbinary php8.2-common php8.2-mbstring \
php8.2-zip php8.2-imagick php8.2-msgpack php8.2-memcached php8.2-curl mysql-client \
mysql-server memcached fail2ban snapd
snap install --classic certbot
ln -s /snap/bin/certbot /usr/bin/certbot
Копируем бэкап всех конфигов. Для nginx и php-fpm меняем юзера с «nginx» на «www-data». Процесс «копирования» конфигов я показывать не буду, думаю тут все предельно понятно, взяли nginx.conf из одного места, положили в точно такое же, но только на другой машине.
Создаем в СУБД пользователя и базу:
create database wordpress;
create user '<wp_admin_user>'@'localhost' identified by '<password>';
GRANT ALL ON wordpress.* TO '<wp_admin_user>'@'localhost';
По дефолту mysql на ubuntu будет доступен без ввода пароля с localhost соединения. Исправить это можно так:
ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY '<root_password>'; EXIT;
Если нужно посмотреть историю mysql команд, то это можно сделать так:
cat ~/.mysql_history | python3 -c "import sys; print(''.join([l.encode('utf-8').decode('unicode-escape') for l in sys.stdin]))"
Далее заливаем наш дамп:
mysql -u root -p wordpress < wordpress.sql
Конфиг для memcached:
# cat /etc/memcached.conf
-d
logfile /var/log/memcached.log
-m 1024
-p 11211
-u memcache
-l 127.0.0.1
-c 1024
-P /var/run/memcached/memcached.pid
Конфиг для fail2ban:
# cat /etc/fail2ban/jail.d/defaults-debian.conf
[sshd]
enabled = true
[nginx-limit-req]
enabled = true
port = http,https
logpath = %(nginx_error_log)s
findetime = 600
bantime = 600
maxretry = 5
[nginx-http-auth]
enabled = true
port = http,https
filter = nginx-http-auth
logpath = /var/log/nginx/error.log
maxretry = 3
bantime = 43200
Так как мы используем базовую авторизацию в nginx, не забываем положить файл /etc/nginx/.htpasswd.
Далее копируем весь каталог рута сайта в новое место. Меняем владельца файлов:
chmod -R www-data: /var/www/html
На этом этапе мы подготоволи базу и залили дамп, разлили наши конфиги для nginx, php-fpm. Следовательно сейчас мы имеем полную копию сайта на другой машине.
Идем в ЛК домен регистратора и меняем там А запись на наш новый IP адрес.
Я хотел обойтись без даунтайма, но решил не использовать старые сертификаты, а сгенерировать через certbot новые. Это занимает секунды простоя, в данном случае совершенно не критично.
certbot certonly --nginx
Сертификаты легли в новое место, пути от CentOS отличаются. Это нужно поправить в nginx конфиги, сделать рестарт и сайт доступен на новой машине.
Из косяков, был только один с файлов db.php который был сделан как symlink на файл, которого нет на новой машине. Об этом любезно сообщил плагин W3 Total Cache. Файл достаточно удалить, плагин сам пересоздаст его.
Сделал замеры wrk на «свежих пакета» и свежем ядре.
Выиграли примерно 10-11 RPS, а также улучшили latency.