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.
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.

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