tavis nörttimaailmassa

EksisONE - artikkeleita ja ohjeita nörttimaailmasta

Virtuaalipalvelin 4: Apache2, palomuuri UFW ja PHP

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ä hakemistosta sites-available, joka tehdään kun annetaan a2ensite -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

adminer kirjautumisikkuna

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ään dbconfig-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/