ITСooky

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

Поднимаем http2 сайт на cloud(VPS) хостинге HETZNER в Германии!

дата 09.10.2020

Пришло время двигаться дальше, в сторону прогресса, в Европу! Я не надеюсь что там все будет гладко, но я точно уверен, что все лучшие технологии и специалисты уже там — поэтому европейский хостинг дешевле, мощнее, технологичнее российского! Германия, если я правильно заблуждаюсь, крупнейший дата центр Европы, там для ЧМ по Ф наворотили в свое время огромную цифровую инфраструктуру.

Почему HETZNER — времени особо выбирать не было, доверился картинкам с сайта, у наших таких слов вообще нет AMD Epyc, NVme и действительно «неповторимые цены».

Для начала надо зарегистрироваться, с настоящим именем, адресом и картой с неё снимут евро для проверки(как на Netflix), и пока не вернули, может потом вернут (не надо хаха, это в России евро ничто, а в Германии 10 дней хостинга!!!). Беру самый дешевый тариф cx11 — 2 гига, 1 ядро, 20 gb и всего за 3 евро, по сегодняшнему курсе 270RUR. Смотрю у бывшего провайдера(RUVDS) сколько стоит тоже самое 770RUR…

HETZNER говорит что трафика дают 20 терабайт, дальше по полтора евро за терабайт. Российские хостеры трафик не считают, до поры до времени, так что сколько у меня на проектах трафика не известно (сам я за них его не считал), но как выясняется по трафику за день на этом сайте 20 терабайт это ОФУФРИНИТЕЛЬНО МНОГО!

Как видно по другим тарифам проблем в Европе с память и дисковым пространством нет, вот только ядра пока еще по штучно. Можно в любой момент увеличить память и ядра, но не диск. Не много удивляют, но немцы говорят это чтобы в любой момент можно было вернуться к прежнему тарифу!

Настраиваем VPS
Я выбрал centOS8 но было и 7, я просто опасался что 8ка отличается от 7ки как 6ка от 7ки — но нет, вообще не отличается!
Пару секунд на установку образа, в личном кабинете и на почту приходит пароль, при первом заходе его сразу требуют сменить и перезайти. Захожу по ssh хотя в личном кабинте есть шикарная консолька!

Первым делом проверяю что дали
uname -a

Linux itcooky 4.18.0-193.14.2.el8_2.x86_64 #1 SMP Sun Jul 26 03:54:29 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

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

x86_64

64 бит хорошо

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

1

Один как и заказывали

Обновляемся
yum update
и перезагружаемся
reboot

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

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

AllowUsers user1

и запрещаем заходить рутом, находим эту строку и доводим до вида

PermitRootLogin no

Перезапускаем ssh
service sshd restart
И теперь по ssh можно заходить только под user1
а далее повышаем права коммандой
su

Ставим нужный минимум
yum install wget
yum install tar

для сборки нужно будет
yum group install 'Development Tools'
yum install pcre-devel
yum install gd-devel
yum install zlib-devel
yum install openssl-devel

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

OpenSSL 1.1.1c FIPS  28 May 2019

Эта версия подошла бы, но нам нужны исходники, так что все равно буду ставит новейшею

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

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

вроде бы этого теперь достаточно
reboot
смотрим
openssl version

OpenSSL 1.1.1h  22 Sep 2020 (Library: OpenSSL 1.1.1c FIPS  28 May 2019

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

И сама команда на сборку, минимум чего надо, и в конце указано где лежит наш openssl /usr/local/src/openssl-1.1.1h/
./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.1h/
make
make install

Смотрим версию
nginx -v

nginx version: nginx/1.19.3

Добавляем пользователя(он может уже быть) и даем права на папку 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

Не пришлось править firewall но навсякий
firewall-cmd --zone=public --permanent --add-service=http
firewall-cmd --zone=public --permanent --add-service=https
firewall-cmd --reload

В браузере набираем IP и смотрим — минималка работает

Cтавим Mysql
Ставим то что есть в репозитории СentOS
yum install mysql-server
Запускам
systemctl start mysqld
systemctl enable mysqld

Далее меняем рут пароль на свой должен быть сложным с спец символами и меняем прочии настройки
mysql_secure_installation

Cтавим PHP
Мне нужен 7.4, так как сайт работает сейчас на 7.4, WordPress не захочет запускаться если понизить градус!
Достаем версию 7.4
dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
dnf install https://rpms.remirepo.net/enterprise/remi-release-8.rpm
dnf module reset php
dnf module enable php:remi-7.4

Устаналиваем
yum install php php-fpm php-mysqlnd 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

и меняем (для совместимости с моими nginx конфигами)

listen = /var/run/php.sock

Если дальше не удаться стартовать, сделайте
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 -r /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 1;

error_log /dev/null crit;

events {
worker_connections 1024;
}

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

sendfile on;
#tcp_nopush on;

#keepalive_timeout 0;
keepalive_timeout 65;

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;

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;
}


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 'QWErty123!';
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 по ip4 и ip6 скидывается на https

server {
    listen 80;
    listen [::]:80;
    server_name itcooky.com www.itcooky.com es.itcooky.com en.itcooky.com;
    return 301 https://$host$request_uri;
access_log  off;
}

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

server {
listen       443 ssl http2;
listen [::]:443 ssl http2;
    server_name es.itcooky.com en.itcooky.com 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";


access_log  off;
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 /500.html;
location = /500.html {
        root   /usr/local/www/itcooky.com;
    }
error_page 502 /502.html;
location = /502.html {
        root   /usr/local/www/itcooky.com;
    }
error_page 503 /503.html;
location = /503.html {
        root   /usr/local/www/itcooky.com;
    }
error_page 504 /504.html;  
location = /504.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 ~ .(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;
    }
}
    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    location ~ /\.ht {
        deny  all;
    }
}

еще добавляю чтобы по IP ничего не показывало
vi /etc/nginx/conf/conf.d/ipnull.conf
Добавляю текст

server {
    listen      80 default_server;
    listen [::]:80 default_server; 
    server_name 195.201.94.20;
    return      444;
}

по 443 и так будет ошибка сертификата, не знаю как по красивее сделать...

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

Теперь идем в личный кабиент вашего регистратора домена и меняем там A записи на IP4 нового сервера, а также AAAA записи IP6! Для зоны RU изменения срабатывают мгновенно(не всегда), для COM через час!

ОСТОРОЖНО: Перед добавлением AAAA записей надо убедиться что NS сервер вашего домена поддерживает работу с IP6. Если он не поддерживает а вы указали AAAA запись это может вызвать сбой в работе некоторых интернет сервисов, у которых IP6 в приоритете, например FeedBurner или обновление сертификатов LestEncrypt. Это мой случай регистратор R01 (RU-CENTER Group) дает указать AAAA записи на своем NS сервере, но он не работает с IP6!

Ну мне все таки хочется IP6, Hertzner дает свой DNS в личном кабинете переходим.
Процесс добавления своего домена более менее понятен, все запсии будут скопированы автоматически надо только добавить AAAA записи, и у меня тут возникла путаница

В личном кабинете указано
IPv6 2a01:4f8:c2c:96ca::/64
Это диапазон, DNS не примет эту запись

Указать
2a01:4f8:c2c:96ca::
тоже будет не правильно

Смотрю на сервере какой там на интерфейсе айпишник ip6
ifconfig
и тут
2a01:4f8:c2c:96ca::1

Его и указываю в DNS Hertzner. Тут еще одно отличие нашлось, чтобы ссылаться на домен без всего (без www) надо прописывать вместо пустого места @, у российского регистратора было пустое место!

Итого вот столько у меня записей

После этого надо прописать у регистратора домена, NS сервера Hetzner и через часов 12 сайт начнет проходить проверку на IP6
Проверяем все ли заработало - да заработало конечно, уже сто раз так делал!

IP6 проверку быстрее всего начал проходить на этом сайте ipv6-test.com

Вот еще как можно наглядно проверить http2 на сайте http2.pro


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

Ваш адрес email не будет опубликован.