ITСooky

IT-рецепты съедобные и не очень!

Переезд сайта на WordPress, с форумом phpBB на новый хостинг RUVDS со всеми плюшками letsencrypt, http2!

дата 31.03.2020

Я уже несколько раз переезжал с одного VPS на другой(последний раз в 2016 вот тут Настройка, переезд, тестирование нового VPS на CentOS 6!), понять что пора валить легко. Первое надо посмотреть на тарифы, если у твоего хостера они сильно отстают от рынка — то хостер всё, как минимум он бросил развиваться и расти. Второе это тормоза по вечерам при тех же настройках и количестве посетителей — в обед все норм а на ужин тормоза, это не нехватка каких-то ресурсов просто старый сервер — отстойный хостер!

Я хостился на hc.ru но его пожрал nic.ru — захожу как-то в личный кабинет, а мне пишут все ты больше не наш клиент иди на другой сайт в личный кабинет… нагло, грубо, какого черта! Тариф остался тот же, никаких предложений по переезду на сервера нового хостера не предполагалось, видимо маркетинговая стратегия у nic.ru была — все равно пока будут платить, а потом сами свалят!

ПРИСКОРБНО НО: На хостинге RUVDS большой даунтайм 3-6 часов в мясяц гарантированно. Объясняют каждый раз техническими работами — но не предупреждают о них. Сейчас 25 июня сайт выключился на 7 часов, даже IP не пинговалася, в тех поддержки сказали что в результате технических работ вырубили часть VDS «надо просто перезагрузить чтобы заработало». Нет у RUVDS мониторинга работоспособности VDS самумому надо следить, но о технических работах не преупреждают и каждый раз обещают, но не компенсируют простой!

Ну и вот RUVDS потому что у них свой раздел на habr.ru и там не только негатив в их адрес. Выбираю тариф с побольше ядер, думаю для php-fpm это будет кстати ну и с голым CentOS 7.

Час примерно устанавливается сервер, прогресс бар есть в личном кабинете
Первым делом смотрим что дали
uname -a

Linux ruvds-z2aro 3.10.0-957.el7.x86_64 #1 SMP Thu Nov 8 23:39:32 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

Смотрим сколько битная ОС
uname -m

x86_64

64 бит хорошо

смотрим солько ядер
nproc

4

обновляемся
yum update

Вижу что openssl слишком старый под мой вебсервер, версия 1.0.2 для http2, с которым кстати браузеры работают только по ssl (сам то он по себе и без ssl может) нужен новее!

после апдейта на всякий случай (был kernel в списке) перезагружаюсь
reboot

Далее обычная практика когда root не заходит прямо по ssh, сначала заходят юзером и дают ему super права.
useradd user
passwd user

даем право этому юзеру заходить по ssh (хотя оно уже есть, то есть запрещаем другим)
vi /etc/ssh/sshd_config

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

AllowUsers user

и запрещаем заходить рутом

PermitRootLogin no

Перезапускаем ssh
service sshd restart

И теперь по ssh можно заходить только под user
а далее повышаем права коммандой
su

Исправляем время на сервере
Часовой пояс верный, но время прям на угад, минуты даже не совпадают. Ставлю ntp
yum install ntp
Активирую чтобы работал сам
systemctl start ntpd
systemctl enable ntpd

И смотрю что он скажет и какое время теперь на сервере
ntpq -p
date -R

Время стало нормальным

Готовим вебсервер к http2
Для начала надо обновить openssl очень стар
openssl version
показывает

OpenSSL 1.0.2k-fips  26 Jan 2017

Для сборки из исходников надо поставить вот это, все равно еще что-то потребуется но это поставим сразу
yum group install 'Development Tools'
yum install wget

Идем в папку куда надо все выкачивать
cd /usr/local/src
wget https://www.openssl.org/source/openssl-1.1.1e.tar.gz
tar -xf openssl-1.1.1e.tar.gz

Переходим в папку и запускаем сборку, если есть ошибки в них надо вникать и исправлять
cd openssl-1.1.1e
./config
make
make install

Новая версиия заработала, так как её ставил руками существуют опасение что yum в будущем подложит при обновлении вдруг чего-то другое
openssl version

OpenSSL 1.1.1e  17 Mar 2020

Если не заработала то в centos 7 мне помогло после компиляции скопировать скомпилированные файлы
cp /usr/local/bin/openssl /bin
cp /usr/local/lib64/libcrypto.so.1.1 /lib64
cp /usr/local/lib64/libssl.so.1.1 /lib64

А в centos8 это не помогло, а убило всю аутентификацию, пришлось переустанавливать

Устанавливаем nginx под http2
Его тоже надо ставить новейшим, и не просто, а собирать с параметрами во как
cd /usr/local/src
wget https://nginx.org/download/nginx-1.17.9.tar.gz
tar -xf nginx-1.17.9.tar.gz
cd nginx-1.17.9

Я знаю что для сборки потребует вот это еще доустановить
yum install pcre-devel
yum install gd-devel
yum install zlib-devel
yum install openssl-devel

И сама команеда на сборку, минимум чего надо, и в конце указано где лежит наш openssl /usr/local/src/openssl-1.1.1e/

./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --error-log-path=/var/log/nginx/error.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-openssl=/usr/local/src/openssl-1.1.1e/
make
make install

Вот эта установка более полноценная, сразу раскидывает файлы куда надо и можно смотреть
nginx -v

nginx version: nginx/1.17.9

Добавляем пользователя и папку под nginx
useradd nginx
chown -R nginx:nginx /etc/nginx/

Надо также сделал файл который будет помогать запускать и останавливать nginx
vi /usr/lib/systemd/system/nginx.service
туда вставим текст

[Unit]
Description=nginx - high performance web server
Documentation=https://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/var/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t -c /etc/nginx/conf/nginx.conf
ExecStart=/usr/sbin/nginx -c /etc/nginx/conf/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID

[Install]
WantedBy=multi-user.target

Запускаем
systemctl start nginx
systemctl enable nginx

Так как это centOC надо еще открыть порта
firewall-cmd --zone=public --permanent --add-service=http
firewall-cmd --zone=public --permanent --add-service=https
firewall-cmd --reload

минималка работает

Cтавим Mysql
CentOS что с ней такое на самом деле я не совсем понимаю, в репозиториях нет главного и приходится все руками ставить вот и с mySQL также!!!

Заходим в папку, выкачиваем и устанавлиаем пакет
cd /usr/local/src
wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
md5sum mysql80-community-release-el7-3.noarch.rpm
rpm -ivh mysql80-community-release-el7-3.noarch.rpm

доустанавлиаем кой чего и задаем версию mysql
yum install yum-utils
yum-config-manager --disable mysql80-community
yum-config-manager --enable mysql57-community

устанавливаем
yum install mysql-community-server mysql-devel

Запускам
systemctl start mysqld
systemctl enable mysqld

находим временный пароль
grep "password" /var/log/mysqld.log
Тут меняем на свой должен быть сложным с спец символами и меняем прочии настройки
mysql_secure_installation

Ставим php 7.2
Опять через одно место, phpBB умеет пока только в 7.2 так что надо его и ставить
yum install epel-release
yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm
yum --enablerepo=remi-php72 install php php-fpm php-mysql php-xml php-gd php-mbstring

php-xml — нужен для phpBB
php-gd — для аддона с картинками в списке топиков
php-mbstring — с эти форму phpBB рботает лучше, и поиск Sphinx тоже

A чтобы новые устанволеные модули сработали надо перезагружать php-fpm

Редактируем php-fpm
vi /etc/php-fpm.d/www.conf
меняем на, а то там apache ха

user = nginx
group = nginx

и меняем

listen.owner = nginx 
listen.group = nginx 
listen.mode = 0660

и меняем

listen = /var/run/php.sock

В папке по умолчанию на centOS7 у меня процесс это не стартовал, поменял в настройках папку

и вот это

pm = static
pm.max_children = 10 

также делаем что само не сделалось
mkdir /var/lib/php/session
chown -R nginx:nginx /var/lib/php/session

Чтобы само стартовалось надо
systemctl start php-fpm.service
systemctl enable php-fpm.service

Тестовый запуск вебсайта
Делаю папку под будущие сайты
mkdir /usr/local/www
туда переношу от нгинкса
cp /etc/nginx/html /usr/local/www
делаю там файл
vi /usr/local/www/html/info.php
с текстом

<?php
phpinfo();
?>

И меняем конфиги nginx
вот тут
vi /etc/nginx/conf/nginx.conf
будет

#user  nobody;
worker_processes  4;

error_log  /dev/null crit;


#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;



   include /etc/nginx/conf/conf.d/*.conf;

}

Создаем папку куда будем выкладывать конфиги сайтов
mkdir /etc/nginx/conf/conf.d
создаем
vi /etc/nginx/conf/conf.d/default.conf
вот с таким текстом

#
# The default server
#
server {
    listen       80;
  server_name localhost;

    #charset koi8-r;

    #access_log  logs/host.access.log  main;


    location / {
        root   /usr/local/www/html;
        index  index.php index.html index.htm;
    }

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/local/www/html;
    }

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}
    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000

    location ~ \.php$ {
        root           /usr/local/www/html;
        fastcgi_pass   unix:/var/run/php.sock;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    location ~ /\.ht {
        deny  all;
    }
}

Перезагружаем
service nginx restart
service php-fpm restart

И по идеии должно работать, но никогда не работает, но у меня заработало — все шаги записал тут для себя, по больше части, конечно!

Перенос и запуск вебсайта
На старом сервере архивирую папку с сайтом и делаю бамп базы
tar -cvf itc.tar ./itcooky.com
mysqldump --user=root --password --host=localhost wpita > ./wpita.sql

На новом сервере выкачиваю эти файлы
scp user@123.123.123.123:/home/user/itc.tar ./
scp user@123.123.123.123:/home/user/wpita.sql ./

Архив сразу можно разархивировать в папке /usr/local/www/
tar -xvf itc.tar

А для базы надо сначаал её создать и сделать пользователя

Идем в майскл
mysql -u root -p
Делаем юзера со старым имянем и паролем чи базу со старым названием, чтобы подстроится под те настройки чтобыли(но это плохая парктика конечно)
CREATE DATABASE wpit;
CREATE USER 'wpita'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON wpit.* TO 'wpita'@'localhost';
ALTER USER 'wpita'@'localhost' IDENTIFIED WITH mysql_native_password BY 'QWErty123!';
exit

Если в пароле к базе MySQL будет # то Sphinx не сможет его прочитать,так что лушче не писать # в пароле

После этого можно вкачать базу
mysql -u root -p wpita < wpita.sql

Для Letsencrypt надо перенести сертификаты со старого сервера, но сначала установим его на новом
wget https://dl.eff.org/certbot-auto
chmod a+x certbot-auto
./certbot-auto --nginx

А теперь сертификаты на старом сервере
cd /home/user
tar -cvf lc.tar /etc/letsencrypt

На новом
cd /usr/local/src
scp user@123.123.123.123:/home/user/lc.tar ./
tar -xvf lc.tar

И перенесим все в папку /etc/letsencrypt пока этого достаточно, потом надо будет настроить обновление сертификатов

Если папка сайта на севрере менялась то это надо отразить в файлах letsencrypt в папке /etc/letsencrypt/renewal а то откажется обнолять сертичикаты

Чтобы сертификаты сами обновлялись добавляю
crontab -e
тектс (проверил работает)

19 6 9,18,27 * * /usr/local/src/certbot-auto renew -q&&/usr/sbin/service nginx reload

На новом сервере делаю конфиги под сайт
vi /etc/nginx/conf/conf.d/it.conf
Добавляю текст - тут просто все что запрашивает по http скидывается на https

server {
    listen 80;
    server_name itcooky.com www.itcooky.com;
    return 301 https://www.itcooky.com$request_uri;
}

еще
vi /etc/nginx/conf/conf.d/itSSL.conf
Добавляю текст - тут во второй строчке появилось http2 если раньше все было сделано правильно то сайт начнет браузерам отдавать контент по h2

server {
    listen      443 ssl http2;
    server_name www.itcooky.com itcooky.com;
    ssl_certificate /etc/letsencrypt/live/itcooky.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/itcooky.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/itcooky.com/chain.pem;
    ssl_stapling on;
    ssl_stapling_verify on;
    resolver 8.8.8.8;
    add_header Strict-Transport-Security "max-age=31536000";
    add_header Content-Security-Policy "img-src https: data:; upgrade-insecure-requests";
 #charset koi8-r;
 #access_log  logs/host.access.log  main;
location / {
        root   /usr/local/www/itcooky.com;
        index  index.php index.html index.htm;
    }
    error_page  404              /404.html;
    location = /404.html {
        root   /usr/local/www/itcooky.com;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/local/www/itcooky.com;
    }
    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    location ~ \.php$ {
        root           /usr/local/www/itcooky.com;
        fastcgi_pass   unix:/var/run/php.sock;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
 location ~ /(config\.php|common\.php|cache|files|images/avatars/upload|includes|phpbb|store|vendor) {
            deny all;
        }
    location ~ /\.ht {
        deny  all;
    }
}

Перезагружаем nginx
service nginx restart

Теперь идем в личный кабиент вашего регистратора домена и меняем там A записи на IP нового сервера. Я хотел еще и AAA записи поменять но у RUVDS только IP4 - IP6 нет хм!

Ждем пару часов когда DNS обновится, и сайт должен работать, или нет

Проверяем что заработал http2. Надо открыть сайт в Chrome правой мышкой Inspect а там Network обновить страницу и должно быть h2 в запросах на сайт

Перенос форума phpBB на новый сервер!
Обычная ситуация когда на новом сервере форум phpBB выдает белый экран - решения или обьяснения нет, но можно уменьшит риск его возникноваения.

Перед копированием базы и фалоы форума
- Выключаем форум в админ панеле Board settings > Disable board
- Выключаем все аддоны Custumize > Manage extensions > Disable каждого
- Чистим кэш Genneral > Purge the cache

После этого надо заархивировать файды форума, выгрузить базы и закачать на новый сайт - повторит все что было описано выше по перемещению данных и созданию базы MySQL

Убедитесь что в config.php правильный юзер база пароль

Надо отключить в CentOS безопаность SELINUX, phpBB с нею не работает вообще
на время
setenforce 0
на всегда
vi /etc/selinux/config
добавив текст

SELINUX=disabled

Что делать если экран все таки белый при заходе на форум phpBB
- Бывают разные степени белезны, например все еще можно зайти в админ раздел ./adm иногда, там можно почистить кэш и отключить адданы и опять почистить кэш - может это поможет
- Надо убедеиться что на папке ./cache права 777, обычно оно так и есть если это перенос с одного сервера на другой
- Надо удалить папку ./cache/production цедиком, нормально работающий форум долен её пересоздать
- Мне раз помогло закинуть чистую версию форума с папкой /install и прогнать там обновление базы - форум ожил, но не все топики были живы
- Иногда возникает желание зайти в базу и там что-то почистить, вот так можно почистить сессии - в консоли MySQL
SHOW DATABASES;
USE myforumbase;
show tables;
TRUNCATE TABLE phpbb_sessions;
TRUNCATE TABLE phpbb_sessions_keys;

- Ну и повторить все с начала

После того как форум заработал, надо постепенно включать аддоны очищать кеш заходить на форум и смотреть сработало или нет!
У меня с адданом Images from posts была ошибка с NO_ENGINE_SUBSTITUTION пришлось в настройки MySQL добавить
vi /etc/my.cnf
вот это

[mysqld]
sql_mode="NO_ENGINE_SUBSTITUTION"

Шикарный аддон, но работает только со старой версией phpBB в 3.3.0 уже не работает!

Пора возврашать поиск на форум
Днлаю как тут Ставим на форум phpBB3 супер быстрый поиск Sphinx!

Если в пароле к базе MySQL будет # то Sphinx не сможет его прочитать,так что лушче не писать # в пароле

Вот кокнретно
wget https://sphinxsearch.com/files/sphinx-2.2.11-release.tar.gz
tar -zxf sphinx-2.2.11-release.tar.gz
cd sphinx-2.2.11-release
mkdir /etc/sphinx
./configure --prefix=/etc/sphinx
make
make install

Единствнно, все файлы кладутся в /etc/sphinx это задано в configure и от туда файлы из папки bin надо покласть в корневой bin

Производительность
Оцениваю при помощи top принято считать что должно быть по 1 на ядро. На hc.ru(nic.ru) было в два раза меньше ядер 2 и в два раза меньще php-fpm процессов, они сильно грузят CPU - и получалось по 3 попугая на ядро. На RUVDS под тойже нагрузкой получается по 0.7 попугаев на ядро - что уже очень очень лучше чем было! И всегда можно просто прикупить ядер и памяти - чего устаревший хостер не может так просто дать!

UPD: Тюнинг nginx
Есть пару вещей которые надо еще сделать с nginx

1. Надо все таки отключить логирование, все говорят просто пишем в nginx.conf вот это

error_log  /dev/null crit;

и всё - но нет

Чудовишного размеры логов продолжаются писаться вот сюда /etc/nginx/conf
И чтобы их реально не было, в конфиг с настройками сайтов надо еще дописать вот это

access_log  off;

Теперь точно логи не сжырают все место на сервере

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

location ~ .(gif|png|jpeg|jpg|svg)$ {
root           /usr/local/www/itcooky.com;
     valid_referers none blocked ~.google. ~.bing. ~.yahoo. ~.yandex. itcooky.com *.itcooky.com;
     if ($invalid_referer) {
        return   403;
    }
}

Если кто-то на чужом сайте, пытается вставить картинку с нашего по прямой ссылке к jpg - ничего не получится, а у нас не будет лишней нагрузки

3. В phpBB для установки и некоторые add-ны используют некий реврайт, который сам по себе не будет работать без настроек nginx вот таких
в конфиг с настройками сайтов надо еще дописать вот это, для запуски установки phpBB

location /forum/php/install/app.php {
              try_files $uri $uri/ /forum/php/install/app.php?$query_string;
    }

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *