You are currently viewing Kun vaihtaa vanhalta uudelle serverille: Roadmap

Kun vaihtaa vanhalta uudelle serverille: Roadmap

Kun virtuaaliserveri on Ubuntulla, niin eräällä tavalla järkevän perustelun aikaväli päivittää käyttöjärjestelmän takia on enintään kahden vuoden välein. Sillä aikavälillä Ubuntusta tulee aina LTS-versio, eli pidemmän tukiajan tuotos. Väliversioiden tuki loppuu nopeammin. En ymmärrä mikä tuon versioajattelun pointti on, mutta niin se vain menee. Itselläni serverit vaihtuvat erilaisista syistä – yleensä omien töppäilyjen takia – noin puolen vuoden välein. Sillä aikavälillä asennan ja asetan serverin aivan alusta toimintakuntoon ja joka kerta yritän muistaa mitä piti tehdä ja miksi. Siksi koostin roadmapin kaikesta mitä pitää tehdä, kun vaihtaa sivustot uudelle virtuaalipalvelimelle.

Lähtökohtana on, että vaihdetaan Ubuntusta toiseen version muuttuessa. Myös PHP:n versio muuttuu, jonka takia esimerkiksi Apachen moduuleja ei voida kopioida asennuksesta toiseen. SSH saattaisi kannattaa asettaa serverien välille, jolloin rsync muuttuu einen jouhevammaksi. En ole kuitenkaan vaivautunut, koska vanha serveri kuitenkin hävitetään.

Roadmap on vain tyhmä muistilista, jota seuraamalla pääsääntöisesti saan tehtyä siirrot vähimmällä vaivalla. Ei taatusti pienimmällä, mutta se on eri asia. Joskus ehkä opin niin paljon, että tuon saisi skriptiksi, tai sitten en.

Milloinkaan en ole onnistunut tekemään siirtoa kerralla valmiiksi. Aina on unohtunut joku PHP:n moduuli tai johonkin pakosta muokattavaan asetustiedostoon on tullut kirotusvirhe. Mitään sen suurempaa ongelmaa ei ole tullut vastaan.

Varnish tuotti hieman päänvaivaa, koska se päivittyi myös uudempaan. VCL:n syntaksia oli (taas) muutettu, jonka takia grace-asetukset siltä osin kun mukana oli return(miss); toimintoja, eivät menneet läpi. Ne oli muutetava return(deliver);. Ylipäätään näyttää siltä, että erillistä grace-aikaa ei enää tarvitse asettaa backendin kaatumisen varalle, vaan Varnish hoitaa asian itse. Idealtaan siis hieman samantapainen muutos kuin että Varnishissa ei enää tarvitse erikseen asettaa gzip-pakkausta, koska Varnish tekee sen aina lennossa.

Olen päivittänyt Githubiin käyttämäni default.vcl tiedoston sellaiseksi, että se toimii uuden Varnish 6.1 kanssa.

Samaten geo-blokkaus ei enää onnistu entisten ohjeiden mukaan ohjelmistopäivityksen takia. Päivitän sen kohdan, jahka saan asian fiksattua. Asian saa kierrettyä lataamalla tiedoston edellisen version. Löytyy varmaan githubistakin, mutta myös täältä. Vilkaise alkuperäiset ohjeet.

Siirron tekemiseen menee tunteja X. Jos kaikki menee suhteellisen jouhevasti, niin saan tehtyä kaiken parissa tunnissa. Jos en tee robottina urakkavauhdilla, niin olen varannut aikaa kaksi päivää: ensimmäisenä siirrän kaiken tarvittavan ja toisena päivänä laitan tietokannat ja domainit kuntoon yksitellen. 40 taalan droplet maksaa 1,30 päivä, joten rahan takia ei ole kiire.

Ubuntu on mahdollista päivittää terminaalissa komennolla do-release-upgrade. Olen sitä viisi kertaa kokeillut DigitalOceanissa ja kerran onnistunut. Silloinkin toiminnoissa oli jotain omituista, joka on suurin syy siirtyä versiosta 19.04 hieman turhan tuoreeseen 20.04 LTS:ään. Ylipäätään vanhan version päivitys paikalleen on aina hieman arveluttava ajatus, vaikka tavallisissa tietokoneissa niin tehdäänkin – eikä järjestelmän version muutos aina niin mallikkaasti mene Windowseissa ja OsX:ssäkään.

Koska Ubuntussa LTS vaihtuu kahden vuoden välein, niin päivitys kannattaa tehdä käsin.

Pystyt käyttämään ohjetta täysin uudenkin serverin asentamiseen, mutta silloin joudut keskittymään asetuksiin hiukan enemmän.

Tästä alkaa

  • Luo serveri

https://m.do.co/c/1a52415150cf (referraf DigitalOceaniin)

20.04 (LTS) x64
8 GB / 4 CPUs
160 GB SSD disk
40 USD/kk

Käytettävä setup

Nginx (SSL, http/2)
Varnish (reverse proxy)
Apache2 (backend sivustoille)
Redis (objekticache)
MariaDB (tietokanta/MySQL)
PHP/PHP7.4-FPM
iptables/ufw/Fail2ban (palomuuri ja geo-blokkaus)
Let’s Encrypt (SSL)
postfix (uloslähtevä email)
mosh (SSH-laajennos mobiileille)
Monit (järjestelmän seuranta)
Adminer (SQL-hallinta)
git (versiohallinta)
muuta

Sivustot:
Wordpress
Moodle
Matomo

Perusasetukset

Uudella serverillä.

Päivitykset

apt update
apt dist-upgrade
reboot

Luodaan käyttäjä

adduser [tunnus]
  • Annetaan käyttäjälle sudo
usermod -aG sudo [tunnus]

Asetetaan aikavyöhyke

timedatectl set-timezone Europe/Helsinki

Palvelut

Uudella serverillä.

MariaDB

apt install mariadb-server
mysql_secure_installation
mysql -u root
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('SalaSana');
UPDATE mysql.user SET plugin = '' WHERE user = 'root' AND host = 'localhost';
flush privileges:
exit;

Apache2

apt install apache2
systemctl enable apache2
a2enmod headers rewrite ssl proxy proxy_http proxy_balancer cgi

Nginx

apt install nginx
apt install nginx-extras
systemctl enable nginx

Mosh

apt install mosh

UFW

ufw allow OpenSSH
ufw allow 'Nginx Full'
ufw allow mosh
ufw enable

PHP

apt install php libapache2-mod-php php-mysql php-curl php-gd php-mbstring php-xml php-xmlrpc php-cli aspell graphviz php-intl php-ldap php-pspell php-soap php-zip

PHP-FPM

apt install php-fpm
a2enconf php7.4-fpm
a2enmod proxy_fcgi setenvif
nano /etc/php/7.4/fpm/php.ini
systemctl reload apache2
nano /etc/php/7.4/fpm/php-fpm.conf
rm -f /etc/php/7.4/fpm/pool.d/www.conf
nano /etc/php/7.4/fpm/pool.d/www.conf
systemctl enable php7.4-fpm
systemctl restart php7.4-fpm

Postfix

  • Valitse no configuration
apt install postfix
apt install mailutils

Lisät

Uudella serverillä.

Adminer

mkdir /usr/share/adminer
wget "http://www.adminer.org/latest.php" -O /usr/share/adminer/latest.php
ln -s /usr/share/adminer/latest.php /usr/share/adminer/adminer.php
echo "Alias /adminer.php /usr/share/adminer/adminer.php" | sudo tee /etc/apache2/conf-available/adminer.conf
a2enconf adminer.conf
systemctl reload apache2

Let’s Encrypt

apt install letsencrypt
apt install python3-certbot-nginx

Fail2ban

apt install fail2ban
systemctl enable fail2ban

GeoIP-esto

apt install iptables-persistent
systemctl enable netfilter-persistent
systemctl start netfilter-persistent
apt install geoip-bin geoip-database
apt install geoipupdate
apt install libxtables-dev xtables-addons-common libtext-csv-xs-perl libnetaddr-ip-perl libnet-cidr-lite-perl pkg-config
  • xtables-addos-common asentaa päivittyneen xt_geoip_build tiedoston, joka haluaa käyttää CSV.tiedostoa, jota ei ole. Jotta geo-blokkaus toimisi, niin tarvitset vanhemman version. Saat ladattua sen tästä. Siirrä ladattu xt_geoip_build hakemistoon /usr/lib/xtables-addons/. Uudelleenimeä alkuperäinen, jotta se olisi käytössä, kun ohjeet päivittyvät.
Lataa “xt_geoip_build” xt_geoip_build – Ladatty 148 kertaa – 6,13 kt

Monit

apt install monit
systemctl enable monit

git

add-apt-repository ppa:git-core/ppa
apt install git

WP CLI

curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
chmod +x wp-cli.phar
mv wp-cli.phar /usr/local/bin/wp
usermod -aG www-data $USER
wp package install geekpress/wp-rocket-cli
wp package install wp-cli/restful

Cache

Redis

apt install redis-server

Varnish

apt install varnish[/bash ]

[bash]systemctl edit --full varnish
systemctl daemon-reload
systemctl enable varnish

Apuohjelmat

ps_mem

wget https://raw.githubusercontent.com/pixelb/ps_mem/master/ps_mem.py
install ps_mem.py /usr/local/bin/ps_mem

Siege

apt install siege

AWStats

apt install awstats libgeo-ip-perl libgeo-ipfree-perl
apt install acl
setfacl -R -m "u:www-data:rx" /var/log/apache2/
setfacl -R -m "u:www-data:rx" /var/log/nginx/
setfacl -R -m "u:www-data:rx" /var/log/varnish/
htpasswd -c /etc/apache2/htpasswd admin
systemctl edit --full varnishncsa
systemctl daemon-reload

Sekalaista

apt install locate
apt install ghostscript
apt install imagemagick
apt install php-imagick
apt install unzip
apt install net-tools
apt install libwww-perl

Kopioinnit

Vanhalla serverillä.

~/

  • Minä käytän aina root-tunnusta. Käyttäjänkin kotihakemisto pitäisi ehkä myös siirtää.
rsync -av -e ssh /root/ root@[uuden-ip]:/root/

iptables

rsync -av -e ssh /etc/iptables/ root@[uuden-ip]:/etc/iptables/

Fail2ban

rsync -av -e ssh /etc/fail2ban/ root@104.248.141.204:/etc/fail2ban/
rsync -av -e ssh /var/lib/fail2ban/fail2ban.sqlite3 root@104.248.141.204:/var/lib/fail2ban/fail2ban.sqlite3
rsync -av -e ssh /etc/logrotate.d/fail2ban root@104.248.141.204:/etc/logrotate.d/fail2ban
rsync -av -e ssh /var/log/custom/ root@104.248.141.204:/var/log/custom/

GeoIP

rsync -av -e ssh /usr/local/src/GeoLite2xtables/ root@104.248.141.204:/usr/local/src/GeoLite2xtables/
rsync -av -e ssh /etc/GeoIP.conf root@104.248.141.204:/etc/GeoIP.conf
rsync -av -e ssh /usr/share/xt_geoip/ root@104.248.141.204:/usr/share/xt_geoip/
rsync -av -e ssh /usr/lib/xtables-addons/xt_geoip_build root@104.248.141.204:/usr/lib/xtables-addons/xt_geoip_build

Postfix

rsync -av -e ssh /etc/postfix/ root@104.248.141.204:/etc/postfix/

AWStats

rsync -av -e ssh /etc/awstats/ root@104.248.141.204:/etc/awstats/
rsync -av -e ssh /var/lib/awstats/ root@104.248.141.204:/var/lib/awstats/

Apache

rsync -av -e ssh /etc/apache2/apache2.conf root@104.248.141.204:/etc/apache2/apache2.conf
rsync -av -e ssh /etc/apache2/ports.conf root@104.248.141.204:/etc/apache2/ports.conf
rsync -av -e ssh /etc/apache2/sites-available/ root@104.248.141.204:/etc/apache2/sites-available/

Nginx

rsync -av -e ssh /etc/nginx/nginx.conf root@104.248.141.204:/etc/nginx/nginx.conf
rsync -av -e ssh /etc/nginx/conf.d/ root@104.248.141.204:/etc/nginx/conf.d/
rsync -av -e ssh /etc/nginx/sites-available/ root@104.248.141.204:/etc/nginx/sites-available/
rsync -av -e ssh /etc/nginx/snippets/includes/ root@104.248.141.204:/etc/nginx/snippets/includes/

Redis

rsync -av -e ssh /etc/redis/ root@104.248.141.204:/etc/redis/
systemctl enable redis-server

Varnish

rsync -av -e ssh /etc/varnish/ root@104.248.141.204:/etc/varnish/
rsync -av -e ssh /usr/lib/x86_64-linux-gnu/varnish/vmods/ root@104.248.141.204:/usr/lib/x86_64-linux-gnu/varnish/vmods/

Monit

rsync -av -e ssh /etc/monit/ root@104.248.141.204:/etc/monit/

Sivustot

  • Kopioi tietokanta jokaisesta WordPressistä /var/www/example.tld/public_html
wp db export siirto.sql
  • Poistetaan Moodlen välimuistit
rm -rf /var/www/moodledata/cache/
rm -rf /var/www/moodledata/localcache/
  • Siirrä kaikki sivustot vanhasta uuteen
rsync -av -e ssh /var/www/ root@104.248.141.204:/var/www/

Let’s Encrypt

rsync -av -e ssh /etc/letsencrypt/ root@104.248.141.204:/etc/letsencrypt/

Cron

rsync -av -e ssh /etc/cron.d/matomo-archive root@104.248.141.204:/etc/cron.d/matomo-archive
rsync -av -e ssh /var/spool/cron/crontabs/ root@104.248.141.204:/var/spool/cron/crontabs/

Uudella serverillä

Muuta DNS osoittamaan uuteen IP-osoitteeseen.

Tietokannat

  • WordPress
CREATE DATABASE wordpress DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
GRANT ALL ON wordpress.* TO 'tunnus'@'localhost' IDENTIFIED BY 'salasana';
FLUSH PRIVILEGES;
EXIT;
cd /var/www/html
wp db import siirto.sql
  • Moodle
CREATE DATABASE moodle DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
GRANT ALL ON moodle.* TO 'käyttäjä'@'localhost' IDENTIFIED BY 'salasana';
FLUSH PRIVILEGES;
EXIT;

Siirretään vanhalta serveriltä uuteen.

sudo -u www-data /usr/bin/php /var/www/html/admin/cli/maintenance.php --enable
mysqldump --allow-keywords --opt -uroot -psalasana TIETOKANTA | ssh root@uuden-ip-osoite "mysql -uroot -psalasana TIETOKANTA"
sudo -u www-data /usr/bin/php /var/www/pro.katiska.info/public_html/admin/cli/maintenance.php --disable
  • Matomo
CREATE DATABASE matomo;
GRANT ALL ON matomo.* TO 'tunnus'@'localhost' IDENTIFIED BY 'salasana';
FLUSH PRIVILEGES;
EXIT;

Siirretään vanhalta serveriltä uuteen.

mysqldump --allow-keywords --opt -uroot -psalasana TIETOKANTA | ssh root@uuden-ip-osoite "mysql -uroot -psalasana TIETOKANTA"

Postfix

ufw allow 587
systemctl enable postfix
systemctl start postfix

Monit

ufw allow 2812
  • Muuta järjestelmän IP-osoite oikeaksi
nano /etc/monit/monitrc
systemctl enable monit
systemctl start 

Sivustot

  • Muuta Apachessa kaikista virtual hosteista PHP-FPM:n versio oikeaksi. Tarkista, että missään ei ole vanhaa IP-osoitetta.
a2ensite *.conf
apache2ctl configtest
systemctl start apache2

tai jos on jo käynnissä

systemctl restart apache2
  • Muuta Nginxissä kaikkien virtual hostien IP-osoitteet oikeiksi.
ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
nginx -t
systemctl start nginx

tai jos on jo käynnissä

systemctl reload nginx
  • Tarkista yhden sivuston löytyminen joltain muulta shelliltä kuin virtuaaliserverin
curl -I https://www.example.com
ping www.example.com
  • Tarkista, että serveri käynnistyy oikein
reboot

Lopuksi

  • Tarkista, että oikeat palvelut käynnistyvät buutissa
service --status-all
  • Tarkista, että sähköposti toimii
  • Tarkista, että jokainen sivusto toimii, myös hallinta
  • Tarkista, että jokainen palvelu toimii

Kun (huomaa, ei jos) jokin ei toimi, niin aletaan etsimään virhettä. Älä ala ensimmäisenä selvittämään jotain mystisiä PHP-yhteensopivuuksia, vaan tarkista conf-tiedostot (kirotusvirheitä tulee tai asetukset on jäänyt muuttamatta) ja varmista, että esim. Apachella on tarvittavat modulit käytössä. Voit vaikka verrata vanhan ja uuden /etc/apache2/mods-enabled hakemistoja.

Jos Nginx antaa sivustolle virheen, niin syy on Varnishissa tai Apachessa, ja käytännössä aina Apachessa. Voit testata sen laittamalla Varnishiin return(pipe); ja jos virhe korjaantuu, niin syy on Varnishissa, muutoin Apachessa. Jos WordPress antaa virheen, mutta jokin muu toimii, niin syy on aina puuttuvassa tai käynnistämättömässä Apachen modulissa tai PHP:ssä.

Kun (huomaa, ei jos) saat kaiken toimimaan, niin älä poista vanhaa serveriä heti. Siellä saattaa olla jotain, jonka haluat talteen, mutta et muista sitä juuri nyt. Odota viikko ja tuhoa vanha vasta sitten.

 

Jakke Lehtonen

Teen B2B-markkinoille sisällöntuottoa sekä UX-testauksia. Samaan liittyy myös koulutukset yrityksille ja webmaailman kanssa muutoin painiville. Serverien sielunelämää on joutunut ohessa opettelmaan. Toinen puoli toiminnasta on koirien ravitsemuksen ja ruokinnan suunnittelua sekä varsinkin omistajien kouluttamista hoitamaan koiriaan oikein ja vielä paremmin. Profiili: Jakke Lehtonen

Keskustele foorumilla Meta/KATISKA