Jos tarve ottaa käyttöön virtuaalipalvelin eli VPS juontaa webhotellien rajoittuneisuudesta, niin ykköstarve asennuksessa on webserveri. Palvelu, johon laittaa verkkosivut näkyviin. Jos virtuaaliserveri on se alusta, jonka päällä kaikki on, ja tietokanta on eräällä tavalla blogin tai verkkokaupan aivot, niin webserveri on kasvot. Webhotellissa asiaa ei ole tarvinnut edes miettiä. Se on mikä on, mutta koska elämä otettiin omaan haltuun, niin tähänkin täytyy panostaa. Valinta ei ole tälläkään kertaa perin vaikea. Vaihtoehtoja on kaksi, Apache2 ja NGINX.
NGINX on väitteiden mukaan hieman nopeampi. Varmasti asia on näin, ainakin teknisissä mittauksissa, mutta en minä eroa ole koskaan livenä nähnyt. Mutta NGINX on vaikeampi kuin Apache2. Kun googlettaa neuvoja, niin huomaa äkkiä muutaman trendin.
- Apache2:lle löytyy how-to dokumentteja, NGINX:lle löytyy käyttäjien kysymyksiä foorumeilla
- NGINX käyttäjät kyselevät ongelmista enemmän
- Apache2:lle löytyy vähemmän ns. persaukisten viritysohjeita
Noille eroille on selitys. Apache2 on isompi ja vanhempi, ja sitä käytetään huomattavan usein ammattilaisissa ratkaisuissa. NGINX on tuoreempi, joten sille ei ole ehkä ehditty tekemään yhtä paljon dokumentaatiota. Mutta NGINX:iä käyttää myös useimmin eräällä tavalla nörtit. jotka haluavat mennä vasten valtavirtaa, eivätkä he kirjoita perusoppaita. Väitän, että juurikin tuon nörttitaustan takia NGINX on niin paljon vaikeampi käyttää muutoinkin.
Virtual hostin käyttöönotto tai ”sammuttaminen” on huono, mutta kuvaava esimerkki Apachen Nginxin eroista, Apachella siihen on kaksi käskyä, joiden formaatti on sama kuin vaikka konfiguraatioiden tai moduulien käyttöönotossa, ja Apache on käynnistettävä uudestaan. Nginx taasen tekee saman symbolisen linkin tekevällä tai poistavalla linuxin komennolla ln
ja unlink
eikä uudelleenkäynnistystä tarvita. Joten Nginx eräällä tavalla toimii kuten käyttöjärjestelmä ja Apache2 kuin oma ohjelmansa. Tuo ero on aloittelijan asennepuolella selvä ja Apachelle eduksi; asioita on helpompi omaksua, kun ne ovat omissa lohkoissaan.
Apache2 käyttää .htaccess
virityksiä, mutta Nginx ei. Tuon takia Nginxiä ei pahemmin webhotelleissa asiakkaille näy. Se, että .htaccess
on teknisesti kyseenalainen ratkaisu, on oma juttunsa ja se kannattaa ottaa aina Apachesta pois päältä virtuaalipalvelimissa (virtual hostin conffissa AllowOverride none
hoitaa homman), ainakin niistä virtual hosteista, joita itse hallitsee. Mutta se, että Apache2 on mahdollistanut tavalliselle käyttäjälle määrätyissä raameissa muutoin webserverissä tehtäviä asetuksia, on tuottanut tolkuttomasti ohjeita, neuvoja ja vinkkejä – kaikki .htaccess asiat voidaan tehdä rootin hallitsemassa virtual hostissa – ja Nginxiltä tuo tietomassa puuttuu tai on vaikeammin löydettävissä.
Niin tai näin, niin asenna Apache2. Pääset paljon helpommalla, eikä WordPressisi hitaus verkkoserveristä johdu, vaan WordPressistä.
Joten laitetaan DigitalOceanin dropletiin Ubuntulle Apache2 hoitamaan liikennettä maailmalle.
Apache2 asennus
Alku on aina helppoa.
apt update
ja
apt install apache2
Piipahdetaan hoitamassa yksi ärsyttävä merkityksetön urputus pois päiviltä.
nano /etc/apache2/apache2.conf
Lisää johonkin kohtaan tämä:
ServerName ihan-mitä-haluat
Palomuuri ufw
Ubuntu, ja muut jakelut, tarjoavat niin tehokkaan ja varsinkin helpon palomuurin, että tavallinen windows-käyttäjä ei voi kuin pyöritellä silmiään. Serverille päästään sisälle (tai ulos) vain niin sanottujen porttien kautta. Määritellään mitkä portit ovat auki ja palveluille, kuten webserveriä pyörittävälle Apachelle, kerrotaan mitä porttia se saa kuunnella. Niin kauan kuin vain tarpeelliset portit ovat auki ja niitä kuuntelee ehjät ohjelmat, niin kukaan ei tule sisälle.
Palomuurin nimi on ufw (Uncomplicated Firewall). Voit avata ja sulkea portti kerrallaan, jos haluat ja tiedät mitä teet, mutta palvelut myös rekisteröivät itsensä ufw:n käyttöön ja antavat eräällä tavalla pikavalinnat käyttöön.
On olemassa toinenkin, iptables, joka lienee vanhempi ja gurujen mielestä parempi. Paremmuus varmaan tarkoittaa… jotain, mutta ufw pysäyttää ja salliin aivan samalla, mutta iptables ei ole lähellekään yhtä helppo. Se tulee kuitenkin nimenä tutuksi, jos joskus asennat Fail2ban ohjelman rajoittamaan ahkerimpia aukkojen koputtelijoita. Se nimittäin käyttää estolistaan iptablesia.
Tarkkaan ottaen tuo kuvaus oli väärä. On vain yksi palomuuri ja se on iptables. UFW on sen käyttöliittymä eli aivan samoin kuin Fail2ban säätää omien estämistensä perusteella iptablesia, niin saman tekee UFW. Mutta nuo on usein helpompi mieltää omiksi asioikseen, vaikka se terminologisesti väärin onkin,
Näet valittavana olevat palvelut tällä:
ufw app list
Saat jotain tällaista vastaukseksi:
Available applications: Apache Apache Full Apache Secure OpenSSH
- Apache: vain portti 80 tavalliselle http-liikenteelle
- Apache Full: portti 80 tavalliselle http-liikenteelle ja portti 447 SSL-salatulle https-liikenteelle
- Apache Secure; portti 447 vain SSL-salatulle https:liikenteelle
- OpenSSH: portti 22 SSH-yhteyksille
Muistutukseksi, että jos innostut yrittämään oman mailiserverin asennusta, niin se ei onnistu. Vaikka avaisit oman dropletin palomuurista sähköpostiliikenteen portit, niin DigitalOcean estää silti niiden pääsyn maailmalle. Joten älä tuhlaa aikaasi.
Asetetaan Apachelle tarpeelliset portit auki:
ufw allow 'Apache Full'
Varmistetaan vielä, että SSH saa liikkumisvaraa:
ufw allow 'OpenSSH'
Tarkistetaan onko palomuuri käynnissä:
ufw status
Jos saat tämän tapaisen vastauksen, niin kaikki on hyvin:
Status: active To Action From -- ------ ---- Apache Full ALLOW Anywhere OpenSSH ALLOW Anywhere Apache Full (v6) ALLOW Anywhere (v6) OpenSSH (v6) ALLOW Anywhere (v6)
Jos status on inactive
, niin käynnistetään palomuuri:
ufw enable
Saatat saada ilmoituksen, että nykyinen SSH-yhteys katkeaa. Ei se katkea, koska SSH juuri sallittiin, mutta vaikka katkeaisikin, niin entä sitten – avaa uusi. Joten vastaa y.
Portin ja IP:n aukaisu
Joskus on tarvetta aukaista joku nimenomainen portti, kuten vaikka 587 lähtevälle sähköpostiliikenteelle:
ufw allow 587
Jos sinulla on tarve rajoittaa portin kuuntelu jollekin määrätylle IP-osoitteelle, kuten jos sinulla on vaikka Varnish omalla serverillään ja backend omallaan ja haluat antaa niiden jutella omalla privaattikanavallaan, niin se onnistuu näin:
ufw allow from <ip-osoite> to any port 8080
Apachen testaus
Nyt on webserveri asennettu ja palomuurille on kerrottu, että Apache2 saa olla yhteydessä ulkomaailmaan. Testataan.
Anna selaimeen oma IP-osoitteesi. Jos/kun et muista sitä, niin löydät sen dropletin hallinnasta tai saamastasi vahvistussähköpostista. Mutta tämä on nopein:
hostname -I
Ensimmäinen on julkinen IP-osoitteesi. Toinen, 10-alkuinen, on sisäinen IP, eikä se näy maailmalle. Kopioi ensimmäinen ja laita selaimen osoitapalkkiin:
https://142.93.167.170
Älä käytä tietenkään esimerkin IP-osoitetta. Se on tämän sivuston (tämän hetkinen) IP-osoite.
Sinulle pitäisi aueta tällainen:
Jos saat error 404, ei löydy, niin tarkista ihan ensimmäiseksi, että annoit oikean IP-osoitteen. Tarkasta kaikki vaiheet Apachen asennuksesta alkaen. Tarkista myös palomuurin asetukset.
Apache2 sammutus ja käynnistys
Muutamat peruskomennut tarttuvat äkkiä muistiin, koska niitä käytetään niin usein. Käytännössä joka kerta kun teet jotain virtua host -akselilla tai muutat/lisäät websivuihin liittyviä PHP-moduuleita, niin joudut kertomaan asian myös Apachelle lataamalla sen uudestaan. Joskus voi joutua myös vaikka virhetilanteen takia sammuttamaan ja käynnistämään uudelleen.
apache2ctl configtest
Tarkistaa onko Apachen omat asetukset ja virtuan hostien asetukset oikein. Kannattaa ajaa aina ensin, niin saa suurimmat virheet kiinni eikä kaada palvelinta.
a2ensite virtual_host
Ottaa virtual hostin käyttöön ja virtual_host viittaa hakemistoon /etc/apache2/sites-available
tehtyyn conf-tiedostoon ilman .conf loppua.
a2dissite virtual_host
Ottaa virtual hostin pois käytöstä.
a2enmod mod_tiedosto
Ottaa käyttöön PHP-moduulin (esim. headers
, proxy
jne)
a2dismode mod_tiedosto
Ottaa PHP-moduulin pois käytöstä.
systemctl disable apache2
Apache2 käynnistyy automaattisesti, jos serveri joudutaan boottaamaan. Tuo voidaan estää disable -komennolla.
systemctl enable apache2
Apache2 käynnistyy automaattisesti serverin bootissa-
systemctl stop apache2
Apache2 pysäytetään.
systemctl start apache2
Apache2 käynnistetään. Käytetään stop -komennon jälkeen.
systemctl restart apache
Apache2 uudelleenkäynnistetään. Webserveri sammuu hetkeksi. Sama asia kuin antaisi ensin stop komennon ja sitten start heti perään.
systemctl reload apache2
Apachen ohjaukset, tiedot, moduulit, virtual hostit jne. ladataan uudestaan Apachelle niin, että webserverin toiminta ei katkea.
Apache2 hakemistorakenne
/etc/apache2/apache2.conf
on Apachen konfiguraatio, joka määrittää nimenomaan Apachen perustoiminnat/etc/apache2/ports.conf
määrittää mitä portteja Apache2 kuuntelee./etc/apache2/sites-available/
on kaikki tehdyt virtual hostit eli domainit .conf-päätteisinä tiedostoina. Täällä tehdään kaikki muokkaukset./etc/apache2/sites-enabled/
on kaikki käytössä olevat virtual hostit. Aidosti kyse on symbolisesta linkistä hakemistostasites-available
, joka tehdään kun annetaana2ensite
-komento. Joten jos et muista mitä kaikkea on julkisena, niin täältä näet ne./etc/apache2/conf-available/
ja/etc/apache2/conf-enabled/
ovat sites-idean mukaan ja täällä on erillisiä virtual hosteihin liittyviä asioita. Tarvitaan harvoin./etc/apache2/mods-available/
ja/etc/apache2/mods-enabled/
samaa sites-käytäntöä edelleen. Hakemistoissa on Apachen käyttämät PHP-moduulit. Kun pääte on.conf
, niin se on asennustiedosto ja.load
on se mitä käytetään.
Virhelogit
/var/log/apache2/access.log
on logitiedosto Apachen eli verkkosivujen liikenteestä, käytännössä mitä headereita (GET, POST jne) on käytetty. Sijainti on oletussijainti ja sen pystyy muuttamaan./var/log/apache2/error.log
on virhelogi. Kun sivusto ei toimi, niin tämä katsotaan ensimmäiseksi.
Varsinkin virhelogia kannattaa käydä vilkaisemassa säännöllisen epäsäännöllisiä. Minulla oli tämänkaltaista logeissa aika paljon, koska olin tehnyt redirect 301 ohjauksen väärin yhteistyössä WordPressin pluginin kanssa.
[Thu Aug 22 09:13:40.041286 2019] [core:error] [pid 3729] [client 127.0.0.1:59022] AH00124: Request exceeded the limit of 10 internal redirects due to probable configuration error. Use 'LimitInternalRecursion' to increase the limit if necessary. Use 'LogLevel debug' to get a backtrace., referer: https://www.katiska.info/kurssit/heiluva-hanta/
Ilman logeja ihmettelisin edelleenkin outoa hidastelua. Noita oli niin paljon, että ne hidastivat toimintaa.
Logit laitetaan päälle virtual hoastin conf-tiedostossa. Ota kommentointi pois kohdasta LogLevel. Sen perässä on merkitty mitä tietoja se kerää. Hieman kokeilemalla löytänee omiin tarpeisiin sopivan tason.
- emerg – järjestelmä on käyttökelvoton
- alert – jotain pitäisi tehdä heti
- crit – kriittiset tilanteet
- error – virhetilanteet
- warn – varoitukset
- notice – sinänsä normaalia, mutta ei kuitenkaan
- info – informatiiviset viestit
- debug – virheiden etsintään liittyvät
- trace1 – trace8 – muuta tietoa, datan määrä nousee tason myötä; sivun antaessa 5xx-virheen, niin hain tietoa trace3:lla
Laitoin LogLevelin asentoon debug:
[Thu Aug 22 16:01:13.015265 2019] [authz_core:debug] [pid 25499] mod_authz_core. c(820): [client 127.0.0.1:47738] AH01626: authorization result of <RequireAny>: granted
Moduulia authz_core tuli vaikka kuinka, mutta eivät liittyneet siihen mitä etsin. Pystyn säätämään oletukseksi laitetun LogLevelin lisäksi myös toisen levelin per moduuli. Kun pyydän muusta debug-tasoa, ja käsken authz_core info-tasolle, niin syöte tuli selvemmäksi.
LogLevel debug authz_core:info
Virhelogeja ei kannata lukea nanon kanssa. Komento
cat /var/log/apache2/error.log
ei ole todellakaan elegantein tapa, mutta ehdottomasti helpoin ja nopein.
Jos sinun täytyy seurata livenä mitä tapahtuu, niin näin:
tail -f /var/log/apache2/error.log
Tai jos haluat vain 100 riviä.
tail -100 /var/log/apache2/error.log
Voit myös etsiä määrättyä termiä.
grep termi /var/log/apache2/error.log
Kun olet valmis logien kanssa, niin kommentoi virtual hostin conf-tiedoston LogLevel, ettet turhaan kasvata sen kokoa.
PHP
Aloitetaan asennuksesta.
apt install php libapache2-mod-php php-mysql
Koska teemme nykyaikaista webserveriä, niin muutetaan asetuksia sen verran, että etusivulle saavuttaessa index.php
on ensimmäinen, joka suoritetaan. Muutoin se olisi index.html
.
nano /etc/apache2/mods-enabled/dir.conf
Kirjoita DirectoryIndex
jälkeen ensimmäiseksi index.php
ja poista sama listalta hieman myöhemmin.
Asennetaan tulevaisuutta varten muutama PHP-moduuli, joita ilman ainakaan WordPress ei tule toimeen.
apt install php-curl php-gd php-mbstring php-xml php-xmlrpc php-gettext
Lisätään Apachelle URL:ien uudelleenkirjoitusta varten moduuli.
a2enmod rewrite
Käynnistä Apache2 uudestaan.
systemctl restart apache2
php-mcrypt
Varsinkin hieman vanhemmat WordPress-ohjeet neuvovat asentamaan myös php-mcrypt
moduulin. Se poistettiin PHP:n 7-version myötä, eikä ole enää käytössä (mutta sen voi asentaa kiertoteitse, jos on pakko; google neuvoo). Jos mikä tahansa plugin vaatii sitä toimiakseen, niin moista lisäosaa ei ole siinä tapauksessa päivitetty eikä sellaista tulisi käyttää.
Adminer
Tulet todennäköisesti jossain vaiheessa tarvitsemaan työkalun MySQL-kantojen käsittelyyn. Suurimmalla osalle tarve on satunnaista ja rajoittuu enemmälti akselille etsi/korvaa, kenttien uudelleennimeämiseen, varmuuskopiointeihin tai turhan tauhkan poistoon. Yleisin käytetty on phpMyAdmin, mutta Adminer kasvattaa suosiotaan koko ajan. Syykin on selvä. Adminer on kevyempi ja helpompi. Sillä ei pysty tekemään aivan yhtä laajoja asioita kuin mihin phpMyAdmin kykenee, mutta suurin osa ei moista koskaan tarvitsekaan. Asetelma on suunnilleen sama kuin että Exceliä ei kannata käyttää yksinkertaiseen kertolaskuun tai WordPressiä .htaccess
-tiedoston muokkaamiseen, kun Notepad++ on olemassa.
Adminer on kohtuullisen helppo asentaa, mutta vaatii pari kiertotietä. Se on asennettavissa suoraan Ubuntun reposta komennolla
apt-get install adminer
mutta silloin tulee turhan vanha versio, joka päivittyy melkoisen hitaasti. Ja sille joutuu joka tapauksessa tekemään käsin samat asiat kuin jos sen asentaa kokonaan manuaalisesti. Joten asennetaan samantien uudempi versio.
Aloitetaan tutusta:
apt update && apt upgrade -y
Oletus on, että sinulla on jo asennettuna Apache2 ja MySQL. Varmistetaan, että pari PHP-moduulia on myös paikallaan.
apt install php-curl php-cli php-gd
Tehdään Adminerille kansio.
mkdir /usr/share/adminer
Ladataan Adminer.
wget "http://www.adminer.org/latest.php" -O /usr/share/adminer/latest.php
Tehdään ladatusta latest.php
-tiedostosta symbolisella linkillä mukavamman niminen.
ln -s /usr/share/adminer/latest.php /usr/share/adminer/adminer.php
Tehdään Adminerista Apache2 ymmärtämä.
echo "Alias /adminer.php /usr/share/adminer/adminer.php" | sudo tee /etc/apache2/conf-available/adminer.conf
Kerrotaan asian Apachelle.
a2enconf adminer.conf
systemctl reload apache2
Pääset kirjautumaan Admineriin selaimessa IP-osoitteella:
http://<ip-osoite>/adminer.php
phpMyAdmin
phpMyAdmin on raskaampi ammattilaistyökalu. Sen asentaminen ns. tavis-käytössä on perusteltua oikeastaan yhdestä ja vain yhdestä syystä: kaikki monimutkaisemmat ohjeet ovat aina sille. Mutta siitä huolimatta suurimman osan saa tehtyä Adminerille, vain helpommin.
phpMyAdmin on hyvin yksioikoinen asentaa.
apt update
apt install phpmyadmin php-mbstring php-gettext
Sinulta kysellään paria teknistä asiaa:
- valitse serveriksi Apache2 – HUOMAA: vaikka Apache on korostettuna, niin se ei ole valittuna. Paina välilyöntiä valitaksesi sen ja tabilla pääset ok-nappulaan
- valitse
yes
kun sinulta kysytäändbconfig-common
käyttöä - sinulta pyydetään salasanaa; se on phpMyAdminin käytölle, ei MySQL:lle
Asennus tekee conf-tiedoston
/etc/apache2/conf-enabled/phpmyadmin.conf
Jotta phpMyAdmin saataisiin käyttöön, niin käynnistetään yksi moduuli ja uudelleenkäynnistetään Apache.
phpenmod mbstring
systemctl restart apache2
Pääset kirjautumaan phpMyAdminiin antamallasi salasanalla, tunnus on root, jos et ole muuttanut sitä.
http://<ip-osoite>/phpmyadmin/