Sain luotua tunnin aikana Live-tikun Xubuntua varten Mac OS X -käyttöjärjestelmälle. Joudun kuitenkin tekemään tämän uudestaan, sillä tarvitsen Windowsin koneeseen yhteensopivaa Live-tikkua. Kuvat Mac OS X asennuksesta alla:
Tämän jälkeen asensin Live-tikun uudestaan Windowsille sopivaksi ja tarkastelin tehtävänannon mukaisesti Linuxia ja terminaalia omalla Windows-pöytäkoneellani. Tarkoituksena on asentaa Xubuntu (14.x) Raspberry Pi 3+ piirilevyyn, ja käyttää tätä etäyhteydellä luentojen ja muiden kokeilujen aikana.
System tiedot sekä update ja kolme sovellusta asennettuna:
[EDIT 30.01.2020] Kokeilin sekä Windows että MacOS -ympäristössä Xubuntun toimivuutta – nettiselaimet toimivat, äänet toimivat, työpöydällä ei ollut hitautta hiiressä eikä näppäimistössä. Terminaalikomennot toimivat moitteetta, ja virheilmoituksia ei tullut. Seuraavassa postauksessa on lisätietoa liittyen Raspberry Pi 3B+ -asennukseen liittyen Raspbianiin eli Debian-pohjaiseen käyttöjärjestelmään liittyen.
VLC on GPL:n lisenssin alainen (General Public Lisence), Chromium Browser monen lisenssin alainen eri osiltaan (BSD, MIT, MS-PL ja MPL/GPL/LGPL) ja Gnome System Monitor taas puolestaan GPL:n alainen ohjelma. (Chromium Web Browser; Gnome System Monitor; Luentomateriaalit Haaga-Helian kurssilla; VLC.)
General Public License tarkoittaa sitä, että kenellä tahansa on oikeus käyttää, kopioida ja muuttaa, sekä edelleen jakaa ohjelmia ja niiden lähdekoodia. Nämä ominaisuudet säilyvät myös mahdollisissa muissa iteraatioissa. (GNU.)
BSD puolestaan tarkoittaa Berkeley Software Distribution lisenssiä. Erona on se, että koodin muokkaaminen ja uudelleenkäyttö on mahdollista myös omisteisissa tuotteissa, kunhan lisenssin ilmaisee (lisenssin teksti) säilyy lähdekoodissa. Tässä tilanteessa lähdekoodia ei tarvitse julkaista. BSD-lisensioidulle koodille voi käytännössä tehdä, mitä haluaa, ja lisenssiä myös muuttaa. (BSD.)
MIT-lisenssi eli Massachusettes Institute of Technology -lisenssi sallii kaupallisen ja suljetun lähdekoodin aspektit ohjelmistossa. Käyttäjällä on vapaat oikeudet tehdä koodilla mitä haluaa, mutta lisenssin teksti täytyy säilyä lähdekoodissa. (MIT.)
Korvaavia sovelluksia voisivat olla esimerkiksi edellä mainitut ja lataamani sovellukset, esimerkiksi HWinfolle Gnome System Monitor, ja lisäksi Adobe Premiere Pro:lle KdenLive editori, PhotoShopille GIMP editori, Twitterille Corebird, Shutter MacBookin screen snipetille, yms. Monia muitakin on.
Lisäksi käytössäni oli Xubuntun Live-USB -tikku, versiolla Xubuntu 18.04.3. Huomiona kellonajat ovat Xubuntun Live-tikulla kaksi tuntia jäljessä Suomen aikaa.
Tehtävä A)
Tehtävä aloitettu 23:00 18.03.2020.
Huom! Koska tehtävän tekemiseen oli aikaa useampi päivä, annoin Linuxin olla toiminnassa yön yli, ja tarkastelin lopuksi Muninin logeja myös idle-ajalta.
setxkbmap fi
sudo apt-get update
sudo apt-get upgrade
Tämän jälkeen kannattaa aina muistaa tulimuurin asetukset, mutta ei laiteta tulimuuria päälle (tai avata reikiä ssh:lle ja Apachelle) tällä kertaa, vaan siirrytään asentelemaan Munin-ohjelmistoa graafisten suorituskykytietojen näyttämiseen työn lopussa ja työn aikana. Lisäksi voimme asennella valmiiksi myös ohjelmistot Apache2 esimerkiksi AB-benchmarkkia varten (sekä www-palvelimena Muninin html-muotoisten tietojen tarkastelemista varten), sekä ohjelmistot iotop ja stress sekä sysstat. Lisäksi asennamme htop-ohjelmiston ja dstat-ohjelmiston.
Ajetaan seuraavat komennot oikeiden pakettien tarkastelemiseksi ja löytämiseksi, Grep on tässäkin erittäin kätevä työkalu:
Tämän jälkeen ajetaan seuraavat asennuskomennot, ja laitetaan heti Munin päälle Apachen asennuksen jälkeen, jotta kuormitustietojen kerääminen voi alkaa. Lisäksi asennan kaikki työn aikana tarvittavat moduulit ja paketit ja ohjelmistot samalla kertaa, jonka jälkeen testaaminen voi alkaa:
Tarkastellaan virhelogit, sekä Apache2:n oletussivu sekä Muninin toiminta. Munin löytyy munin.conf-tiedoston mukaan url-hakukentällä seuraavasta tiedostokansiosta (ellei tee muutoksia ja siirrä HTML-tiedostojen paikkaa): /var/cache/munin/www/index.html.
Apachen oletussivu toimii (logeissa ei myöskään virheitä):
Muninin toiminta myös aloitettu, logeissa ei virheitä ja dataa kirjautuu tasaisesti:
Seuraavaksi voidaan alkaa testailla Stress-ohjelmiston avulla kuormitusta järjestelmässä.
Tehtävä B)
Kuormitetaan järjestelmän eri osa-alueita esimerkiksi Stress-ohjelmiston avulla. Stress on kattava ohjelmisto, jolle voidaan antaa eri parametreja tietokoneen kuormittamiseksi. Alla on esitelty myöhemmin tässä kohdassa ajamani komento, ja avattu hieman komennon sisältöä ja parametrien tarkoitusta:
stress -c 12 -i 10 -m 12 --vm-bytes 512M -t 15s
Tämä tarkoittaa, että suoritamme 12 prosessoriin kohdistuvaa prosessia (valittu kokonaisydinten määrän perusteella, tästä alempana lisää), 10 I/O-prosessia (tässä tilanteessa vain write-ominaisuus) ja 12 muistiin vaikuttavaa prosessia, joiden allokoitu koko per prosessi on muutettu 512 megatavuun. Ajamme testiä 15 sekuntia, ja vielä lisämääreellä loppuun -v saisimme ”verbose”-toiminnon päälle, eli toiminto listaisi samalla tietoa terminaaliin. Menemme kuitenkin tarkastelemaan toiseen terminaalin ikkunaan tilannetta ja core loadia (eli ”ydinten kuormitusta”), joten jätämme verbosen pois tässä testissä. Lisäksi on mahdollista kohdistaa diskiin lisätyötä esimerkiksi -d 3 komennolla, ja jokaisen prosessin default-kokona on noin 1 gigatavu.
Ennen kuin ajamme erilaisia kuormitustasoja, on hyvä tarkastella järjestelmän tilannetta nykyisessä idle-muodossaan ilman kuormitusta. Komentoina voi käyttää esimerkiksi:
uptime #// kertoo load averagen minuutin, 5 minuutin ja 15 minuutin ajalla. Totaalimäärä.
watch uptime #// jättää uptimen päivittymään reaaliajassa terminaaliin.
dstat #// listaa reaaliajassa kuormitusta ja muistin käyttöä.
top #// listaa prosesseja sekä niiden muistin että prosessorien käyttöä.
htop #// samanlainen process ja ohjelmisto => top, mutta väreillä ja muokkauksilla.
#// "Selvempi" kuin pelkkä top.
sudo iotop #// Iotop-näyttää write ja read -ominaisuuksia, sekä muita lisätietoja prosesseista.
Moneen yllä listattuun komentoon voi käyttää lisämääreitä, esimerkiksi tietyn prosessin tutkimiseksi. Prosessin ID:n voi selvittää esimerkiksi seuraavalla komennolla:
ps aux | grep "something"
Process Status
man ps #// lisätietoa ps-komennosta.
Ps tarkoittaa process status, ja aux tarkoittaa (löytyy man ps myös) käytännössä, että kaikki prosessit kaikilta käyttäjiltä näytetään, jonka lisäksi näytetään prosessin omistaja ja käyttäjä, sekä näytetään myös terminaalin ulkopuoliset prosessit.
Kun prosessin ID on tiedossa, voidaan käyttää esimerkiksi seuraavia komentoja:
lsof -p "process ID / <pid>" // Tarkastellaan yksittäistä prosessia ja sen avaamia tiedostoja.
sudo iotop -p "process ID / <pid>" // prosessi ID, nähdään write ja read tietylle prosessille.
Huom! Grep-komennolla voidaan -v määritteellä suodattaa pois ei-haluttuja tiedostoja / kirjastoja. (ADMIN Edit 20.03.2020.)
Järjestelmästä tietoa (prosessorit, sysstat tietoa prosessoreista myös), eli haemme ydinten kokonaismäärän ja tarkastelemme sysstatin avulla jokaisen ytimen sen hetkistä kuormaa, ja miten kuorma jakautuu (nyt idlessä) esimerkiksi käyttäjien ja järjestelmän välillä:
Seuraavaksi top– sekä uptime -komennoilla on tarkasteltu järjestelmän tilannetta idlessä, sekä järjestettynä muistin että prosessorikuorman kannalta (shift + M, shift + P):
Firefox vie eniten muistia, noin 2,3 %. Huom! Monta välilehteä auki. Komentona top.Firefox vie myös eniten prosessoritehoja, noin 0,7 % käyttöä. Komentona top.
Seuraavaksi idlessä myös uptime sekä iotop komennolla sudo iotop -oa:
Kuten nähdään, load averaget ovat mitättömät kaikilla aikaväleillä. Myös dstat näyttää prosessorit idlessä, ja nettiliikennettä on hieman (esim. Apache ja Munin). Kirjoitusta eikä lukua tapahdu levyillä.
Sudo iotop -oa listaa kaikki tällä hetkellä kirjoittavat / lukevat prosessit, o tarkoittaa only ja a tarkoittaa kokonaismäärää, ei vain hetkellistä arvoa. Kuten jo dstatista näkee, tulostuksessa ei näkyvät yhtäkään prosessia. Vain hetkellisiä mitättömiä lukuja ja kirjoituksia. Esim. Munin vilahti kirjoittamaan HTML-tiedostoon grafiikkaa:
Kuormittaminen ja STRESS
Seuraavaksi ajetaan ylempänä mainitulla komennolla (stress -c 12 -i 10 -m 12 –vm-bytes 512M -t 15s) ja sen variaatioilla erilaisia kuormituksia, ja alhaalla tulostuksia:
Suorittimet ovat selvästi kuorman alla, ja koneen tuulettimet käyvät erittäin lujalla nopeudella. Komento top | grep stress.Suoritettava ajettava stress näkyy top-komennolla. Suorittimien kokonaiskäyttö noin 66 % käyttäjän ajettaviin ohjelmiin, ja noin 34 % järjestelmän tarpeisiin. Testit näkyvät vasemmalla, ja niiden variaatiot. Kone käy tuulettimien saralla nopeasti.Watch uptime -komennolla toisessa terminaalin ikkunassa nähdään, että load average viimeisen minuutin ajalta on jo melko korkea – yli 14. Käytännössä 12 ytimen koneessa hidastelua voisi alkaa ilmetä, sillä kuormaa on enemmän > 12.Kuormia ajettaessa (vasen ikkuna) saadaan dstat-komennolla esiin idlestä muuttuminen käyttöön prosessorien saralla. Käyttö on kovaa ja idlessä ei olla enää melkein ollenkaan, kaikki menee käyttäjien ja järjestelmän prosesseihin.
Huomioina voidaan sanoa, että hidastelua ei vielä tapahtunut, ja muistiin ei vaikutettu ihan hirveästi, vaikka muistiin vaikuttavia ohjelmistoja laitettiin pyörimään myös stress-komennon avulla. Tässä auttaa varmasti muistin isohko määrä (16 Gt) ja muistin DDR4-väylänopeus.
Tehtävä C)
Iotop on ohjelmisto, jolla voidaan tarkastella I/O-tyyppisiä toimintoja ja kuormituksia tietokoneessa. Tässä tilanteessa käytännössä tarkastelemme write ja read -ominaisuuksia kovalevyllä.
Komentoina voi käyttää esimerkiksi seuraavia komentoja:
sudo iotop -oa
Tällä komennolla näemme yhteissummat kirjoittamisesta, ja vain ne prosessit, jotka kirjoittavat / lukevat juuri tarkasteltavalla hetkellä.
Kun laitoin samalla komennolla kuin yllä mainittu (stress -c 12 -i 10 -m 12 –vm-bytes 512M -t 15s) vielä lisäksi komentoon määritteen -d 5, sain myös levylle kirjoittamista selvästi demottua.
Iotopin komennolla kirjoittamisnopeus oli noin 23 megatavua sekunnissa (23 Mt/s), ja disk käyttöaste 87 %.
Huom! Ylempänä on vielä käyty läpi, miten esimerkiksi iotopilla voi tarkastella vain tietyn prosessin I/O-ominaisuuksia, prosessin ID:n avulla.
Tehtävä D)
Dstat on ohjelmisto, jolla saadaan terminaaliin printattua reaaliaikaista dataa prosessorien sekä I/O:n (write and read) käytöstä. Erittäin kätevää, kun ajamme Stress-testejä tietokoneella. Alla tulostetta ja komentoja liittyen Dstat-ohjelmistoon:
dstat
Komennolla saadaan suoraan tulostettua jatkuvasti päivittyvää tietoa järjestelmästä, ja esimerkiksi ylempänä olevassa kohdassa (A) käytin dstat-toimintoa nähdäkseni kuormituksen aikaisen muutoksen prosessorien sekä levylle kirjoittamisen aikana.
Dstat oikea ikkuna. Testit vasemmalla. Idlestä aloitettu.
Tehtävä E)
Tarkoituksena on tarkastella erilaisia järjestelmän portteja, yhteyksiä ja Internettiin liittyviä statistiikkoja. Voimme ajaa esimerkiksi seuraavan komennon yhteyksien ja sockettien tarkastelemiseksi:
Huomataan, että esimerkiksi Apache on selvästi päällä, ja localhost-osoitetta kuunnellaan. Lisäksi on kattava listaus lähettävistä ja vastaanottavista socketeista kommunikointia varten, toimivat niin sanotusti endpointteina.
Ajetaan myös seuraavat komennot:
ss --listening --tcp
ss --listening --tcp --numeric #// incoming connections, outgoing connections, checked
ss --listening --udp
ss --listening --udp --numeric #// outgoing connections, incoming connections, not checked
Tulokset (lisäksi viereen ajettu yleinen ss -l komento, joka listaa kaiken yhteyden):
Kokeiltu ss -komentoja.
Kuten listauksista nähdään, saamme selville sekä portit että nimelliset arvot monelle eri sovellukselle. Huomaamme, että esimerkiksi Apache kuuntelee porttia 80, ja Munin on myös päällä lähettämässä tietoa ja toimimassa palvelimen kautta, jotta pääsen käsiksi HTML-tiedostoihin, joihin Munin kirjoittaa koko järjestelmän käytön ajan tietoa suorituskyvystä ja kuormista.
Tehtävä F)
Error logit näyttivät seuraavia tietoja seuraavilla komennoilla, kronologisessa järjestyksessä:
Logeissa näkyy järjestelmän erilaisia virheilmoituksia, ja paketteihin sekä moduuleihin liittyviä virheitä. Lisäksi kernel-ominaisuuksista näkyy tietoa, ja ajettavasta ydinkoodista. Mitään hyvin erikoista ei ole havaittavissa, eikä kriittisiä virheitä tietokoneen toiminnan kannalta ole näkyvillä. Ajamiini testeihin ei liittynyt virheitä logien mukaan tämän työn aikana.
On hyvä huomata, että jos olisin esimerkiksi antanut sudo-komennolla erittäin raskaan, mahdollisesti ei-suoritettavan kuorman tietokoneelle, olisi prosessi mahdollisesti tapettu, ja tästä olisi tietoa logeissa. Koska ajoin kuitenkin erittäin suuria core load -rasituksia ja muistirasituksia koneellani, en riskeerannut hidastumista ja työni menettämistä ajamalla jotain aivan ylisuurta määrää kuormitusta koneen komponenttien läpi.
Tehtävä G)
Core load on erittäin tärkeä osa suorittimien kuorman tarkastelua. Ajoin ensimmäiseksi seuraavat komennot prosessorien kokonaismäärän (threads, multithreading, etc…) näkemiseksi, sekä idlessä olevien kuormien tarkastelemiseksi:
Kuten näemme, järjestelmässäni on 12 ydintä, ja jokaisen ytimen komennon aikainen load näkyy ylempänä.
Kun kirjoitamme terminaaliin komennon uptime, näemme kolme lukua. Ensimmäinen luku kertoo viimeisen minuutinkeskiarvon, toinen viimeisen 5 minuutinkeskiarvon ja kolmas luku viimeisen 15 minuutin keskiarvon. On hyvä huomioida, että jos ensimmäinen arvo on vaikka yhden ytimen prosessorin omaavassa koneessa yli 1,00, ei ole vielä todennäköisesti ongelmia – aina välillä kone kuormittuu hetkellisesti paljonkin, ja työmäärää voi olla paljon. Jos taas kolmas luku eli 15 minuutin keskiarvo on jatkuvasti yli 4,00 yhden ytimen omaavassa prosessorissa, on selvästi kuormaa paljon ja kone todennäköisesti hyvin hidas. Tämä siis pätee siinä tilanteessa, että konetta ei kuormita tarkoituksella esimerkiksi tässä työssä mainituilla työkaluilla.
Uptime esimerkki:
Uptime esimerkki dstat-komennon kanssa, uptime vasemmalla.
Load average on verrannollinen tarkastelun kannalta ytimien määrään; esimerkiksi minun testikoneessani on 12 ydintä, joten vielä load averagella 11,90 olisin käyttämättä kaikkea kapasiteettia. Tästä yli mentäessä kuormaa on enemmän, mitä voidaan sillä hetkellä hoitaa samanaikaisesti ja heti. Voisin veikata, että tällä järjestelmällä load average 17,00 (myös testauksen nojalla) alkaa jo jatkuvasti tuossa luvussa olemisella hidastamaan konetta ja sovellukset takkuilevat.
”Kapasiteetin yli” menevät load averaget ja kuormitus isoillakin luvuilla on tietenkin mielenkiintoista testata, ja tämän tyyppisillä testauksilla voidaan tarkastella järjestelmän toimivuutta, lämpöä ja skaalautuvuutta isonkin kuorman alla.
Seuraavaksi käyn läpi Muninin tallettamia erilaisia tietoja järjestelmän käytöstä. Järjestelmä oli vielä stress-testauksen jälkeen avoinna yön yli, joten näemme selvää grafiikkaa järjestelmän käytöstä pidemmältä ajalta.
Ensimmäiseksi prosessorin kuormitus:
Selvä piikki havaittavissa stress-testien aikaan. Mittaa prosessorin käytön koko käynnissäoloajalta, koska asennettu heti Linuxin bootattua.Kuvaaja kertoo prosessien pyynnöistä suorittimelle – prosessi pyytää suoritinta hoitamaan jotain prosessin osa-aluetta. Näkyy piikki stress-testin aikana, sillä testiohjelmisto tarvitsi prosessorin tehoja.Vain yksi käyttäjä on ollut kirjautuneena koko session ajan. Muistin käyttö ollut hyvin tasaista, vaikka muistiin vaikuttavia ohjelmistoja ajettiin – seuraavissa testeissä pitäisi selvästi lisätä myös muistin kuormitusta, tai käyttää stress -ng -työkalua vain muistiin vaikuttamiseen.Nähdään järjestelmän käynnistymisen aika verrattuna Muninin käynnistymiseen, ja kuinka kauan järjestelmä on ollut päällä.Prosessien prioriteetit järjestelmässä, sekä VMstat eli prosessorin ajallista käyttöä liittyen ei-kernelin (”ydinkoodi”) koodiin (running) ja I/O-toimintoihin (odottaa siis joko read tai write -toimintoja kyseisellä ajalla).Lämpötila-arvoja celsiuksissa. Näkyy piikkejä stress-testien aikana – myös tuulettimet kävivät kovilla testien aikana, huomattava ero.Prosessien kokonaismäärä ja prosesseista tietoa. Prosessien määrä kasvoi selvästi stress-testejä ajettaessa.
Munin kerää erittäin paljon mielenkiintoista ja tarpeellista tietoa järjestelmän eri osa-alueista. Tämä yhdistettynä esimerkiksi muihin ohjelmistoihin (kuten esimerkiksi sysstat) antaa paljon arvokasta tietoa järjestelmän käytön aikaisesta kuormituksesta ja toiminnoista.
Lisäksi käytössäni oli Xubuntun Live-USB -tikku, versiolla Xubuntu 18.04.3. Huomiona kellonajat ovat Xubuntun Live-tikulla kaksi tuntia jäljessä Suomen aikaa.
Tehtävä A)
Tehty päivien 15 -16.03.2020 aikana työkiireiden johdosta.
Tarkoituksena on ratkaista jokin edellinen laboratorioharjoitus liittyen Linux-palvelimet kurssiin. Luennoitsijana toimii Tero Karvinen Haaga-Helian Pasilan toimipisteessä. Valitsin ratkaistavaksi harjoitukseksi seuraavan edellisen harjoitustyön:
## LAMP
Asenna LAMP (Linux, Apache, MySQL, PHP) ja testaa sen toiminta.
## Kuormitusta
Kerää kuormitustietoja koneelta koko harjoituksen ajalta. Analysoi tiedot tiiviisti aivan
harjoituksen lopuksi.
## Sorkka ja Rauta Oy:n CRM
Tarvitsemme asiakastietokannan. Tee tietokanta, jossa on seuraavat asiakkaat:
- Kulta ja Kaivos ky
- Piilosana ry
- MetalliMake
Tee PHP-ohjelma, joka lukee nämä tietueet. Laita tämä sivu näkyviin osoitteessa
http://sorkkacrm.example.com
Voit simuloida nimipalvelun toimintaa hosts-tiedoston avulla. Tässä harjoituksessa sivulle
pääsyä ei tarvitse rajoittaa salasanalla, vaan sen tule näkyä kaikkialle nettiin.
## Rosvoja porteilla
Onko koneellemme yritetty murtautua? (Kyllä). Etsi omalta paikalliselta koneeltasi todisteet
tapauksesta, jossa koneellesi on yritetty murtatua. Analysoi tiiviisti tähän liittyvät tiedot.
## Sorkan sivut
Tee staattinen HTML5 weppisivu, jonka otsikkona (molemmat title ja h1) on "Sorkka ja Rauta Oy".
Laita sivu näkyviin osoitteeseen http://rauta.example.com/ . Voit simuloida nimipalvelun toimintaa
hosts-tiedoston avulla.
## Einarin esimerkki
Einari Vähä-aho ryhtyy koodaamaan. Tee einarille käyttäjä 'einari'.
Tee einarille esimerkkikotisivu PHP:lla ja laita se näkymään osoitteessa http://localhost/~einari/ .
Esimerkkisivun pitää tulostaa "Einari" käyttäen PHP:n print-funktiota.
[Ohje päivittyi harjoituksen edetessä]
Ensimmäiseksi Live-tikun käynnistymisen jälkeen ajetaan seuraavat komennot terminaalissa:
setxkbmap fi
sudo apt-get update
sudo apt-get upgrade
Tämän jälkeen voidaan valmiiksi asennella Apache2, sillä virtuaalisen hostaamisen ja Apachen kanssa tulemme varmasti tekemään töitä tämän harjoituksen aikana. Tulimuurin asetukset on myös hyvä aina muistaa, joten lisätään heti valmiiksi SSH-yhteydelle reikä tulimuuriin sekä Apachelle itselleen seuraavilla komennoilla (jonka jälkeen asetetaan tulimuuri päälle):
Apache toimii kuten pitää, ja logit ovat kunnossa. Localhost-osoitteessa näkyy seuraava sivu:
Heti ensimmäiseksi yritin saada toimimaan Munin nimistä ohjelmistoa suorituskyvyn tarkasteluun – kaikista yrityksistäni huolimatta tämä ei onnistunut [EDIT: kokeilua seuraa nyt paljon, mutta lopussa ennen harjoituksen jatkoa sain kuitenkin Muninin toimimaan vain jättämällä oletusasetukset päälle ja menemällä oletuspolkuun, joka selviää munin.conf-tiedostosta]. Polkuni oli seuraavanlainen yrityksissäni saada Muninin nettiselaimella luettavia taulukoita ja grafiikoita toimimaan; ensimmäiseksi installoin Munin ohjelmiston:
sudo apt install -y munin
Tämän jälkeen tutkin tietoa, miten tämä itselleni tuntematon ohjelma oikein toimisi. Löysin monta sivustoa, jotka kertoivat Muninin sekä Apachen yhteistoiminnasta, ja itse asiassa löysin tähän kyseiseen kurssiin liittyvän vanhan artikkelin (https://mikkolaukonsuo.wordpress.com/2015/09/29/munin-ubuntu-monitoring/), jossa opiskelija oli tutkinut Muninin käyttöä saadakseen suorituskykytietoja käytössä olevasta koneestaan kuormituksen aikana. Seurasin tätä lähdettä tutkien myös artikkelin lähteitä, ja vaikka kokeilin kaikkea samalla tavalla ja myös hieman eri tavalla, Munin ei vain Live-tikullani toiminut. Tilanne voisi olla erilainen erilaisessa käyttöympäristössä. Vaatii lisää selvittelyä. Polku oli seuraavanlainen toiminnan kuntoon saattamiseksi:
Ensimmäiseksi muokattiin munin.conf-tiedostoa polussa /etc/munin, jonne munin normaalisti asentuu. Seuraavia kohtia muutettiin:
Seuraavaksi luotiin kansio haluttuun polkuun html-tiedostojen lukuja varten, sekä annettiin oikeuksia munin-ohjelmistolle kirjoittaa polkuun dataa:
ubuntu@xubuntu:/etc/munin$ cd /var/www/
xubuntu@xubuntu:/var/www$ ls
html
xubuntu@xubuntu:/var/www$ sudo mkdir munin
xubuntu@xubuntu:/var/www$ ls
html munin
xubuntu@xubuntu:/var/www$ sudo chwon munin:munin munin
sudo: chwon: command not found
xubuntu@xubuntu:/var/www$ sudo chown munin:munin munin
xubuntu@xubuntu:/var/www$ sudo chown munin:munin munin*
Seuraavaksi muokattiin apache.conf.-tiedostoa muninin alkuperäisessä kansiossa, ja muokattuun seuraavia kohtia ohjeiden mukaisesti, sillä edelleenkään nettiselaimella grafiikoiden tutkiminen ei toiminut:
<Directory>
Order allow,deny
Allow from all
Options None
Require all granted
Options FollowSymLinks SymLinksIfOwnerMatch
<Location /munin-cgi/munin-cgi-html>
#Order allow,deny
Require all granted
Options FollowSymLinks SymLinksIfOwnerMatch
#Allow from localhost 127.0.0.0/8 ::1
<Location /munin-cgi/munin-cgi-graph>
#Order allow,deny
Require all granted
Options FollowSymLinks SymLinksIfOwnerMatch
#Allow from localhost 127.0.0.0/8 ::1
Tämän jälkeen url-haku osoitteeseen ei vieläkään toiminut. Nyt osoitteen olisi kuulunut olla esimerkiksi Firefoxin selaimella localhost/munin/MuninExplorer/index.html, mutta tämä ei vain suostu osoitteena toimimaan. Lisäksi en voinut käynnistää munin.servicea uudelleen, sillä sain tästä vain virheilmoituksia, kuten ylhäällä näkyy. Päätin siirtyä seuraavaan tehtävään, mutta kokeilin vielä viimeistä oljenkortta graafisen suorituskyvyn näyttämiseksi -> asensin siis Munin-ohjelmiston uudelleen, ja .conf-tiedostosta sijoitin Firefoxin selaimeen polun HTML-tiedostojen kirjaamiseen (/var/cache/munin/www/index.html). Tämä vihdoin toimi, ja ulkoasu Muninille oli seuraavanlainen:
Seuraavaksi kokeilin asentaa ohjeiden mukaan MySQL-pakettia, mutta tämä ei vain suostunut Live-tikullani toimimaan. Virheilmoitus oli seuraavanlainen komennon ajamisen jälkeen (tämä on käynyt tietokonelaboratoriossa ennenkin Live-tikulla):
sudo apt install -y mysql-client mysql-server libapache2-mod-php php-mysql php
● mysql.service - MySQL Community Server
Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)
Active: activating (auto-restart) (Result: exit-code) since Sun 2020-03-15 23:44:02 UTC; 4ms ago
Process: 23631 ExecStartPre=/usr/share/mysql/mysql-systemd-start pre (code=exited, status=1/FAILURE)
dpkg: error processing package mysql-server-5.7 (--configure):
installed mysql-server-5.7 package post-installation script subprocess returned error exit status 1
No apport report written because the error message indicates its a followup error from a previous failure.
dpkg: dependency problems prevent configuration of mysql-server:
mysql-server depends on mysql-server-5.7; however:
Package mysql-server-5.7 is not configured yet.
dpkg: error processing package mysql-server (--configure):
dependency problems - leaving unconfigured
Processing triggers for libc-bin (2.27-3ubuntu1) ...
Processing triggers for systemd (237-3ubuntu10.39) ...
Processing triggers for man-db (2.8.3-2ubuntu0.1) ...
Processing triggers for ureadahead (0.100.0-21) ...
Errors were encountered while processing:
mysql-server-5.7
mysql-server
E: Sub-process /usr/bin/dpkg returned an error code (1)
Koska myös PostgreSQL on itselleni hieman tuttu, päätin kokeilla tätä MySQL:n sijasta. Tämä kuitenkin tulee vaatimaan paljon tutkimista ja lisätyötä, sillä MySQL oli selvästi itselleni tutumpi vaihtoehto. En kuitenkaan voinut asentaa PostgreSQL-paketteja enää nykyiseen sessiooni, sillä MySQL:n asennus oli jotenkin tappanut konfiguraatiotiedostojeni toimivuuden. Komento PostgreSQL:n asentamiseen ja virheilmoitukseen olivat seuraavanlaiset:
sudo apt install -y postgresql
...
Ver Cluster Port Status Owner Data directory Log file
10 main 5432 down postgres /var/lib/postgresql/10/main /var/log/postgresql/postgresql-10-main.log
update-alternatives: using /usr/share/postgresql/10/man/man1/postmaster.1.gz to provide /usr/share/man/man1/postmaster.1.gz (postmaster.1.gz) in auto mode
Setting up postgresql (10+190ubuntu0.1) ...
Setting up postgresql-contrib (10+190ubuntu0.1) ...
Processing triggers for doc-base (0.10.8) ...
Processing 1 added doc-base file...
Processing triggers for systemd (237-3ubuntu10.39) ...
Processing triggers for man-db (2.8.3-2ubuntu0.1) ...
Processing triggers for ureadahead (0.100.0-21) ...
Processing triggers for libc-bin (2.27-3ubuntu1) ...
Errors were encountered while processing:
mysql-server-5.7
mysql-server
E: Sub-process /usr/bin/dpkg returned an error code (1)
xubuntu@xubuntu:/etc/munin$
Aloitin siis puhtaalta pöydältä, ja tulen käyttämään PostgreSQL-paketteja ja toiminnallisuutta.
PostgreSQL asennus, tietokanta ja printtaus sivulle
Asennamme siis PHP:n, Apache2:n PHP-moduulin sekä PostgreSQL-paketit. Koska aloitin puhtaalta pöydältä MySQL-asennuksen ja sen tuomien virheiden jälkeen, kaikki toimi nyt erinomaisesti ilman virheilmoituksia. Tämän jälkeen luomme tietokannan PostgreSQL:n avulla, ja luomme virtuaalisen host -asetuksen Apache2 varten, jolloin voimme index.php-tiedostolla lukea tietokannasta tietoa.
Luomme uuden käyttäjän PostgreSQL-tietokantaa ja sen tekemistä varten, ja on optimaalisinta käyttää tietokannalle samaa nimeä kuin Linux käyttäjä on; lisäksi tehdään PostgreSQL-ohjelmistolle käyttäjä samalla nimellä kuin käyttäjä Linux-järjestelmässä on. Lisäksi dokumentaation (https://www.postgresql.org/docs/8.0/sql-alteruser.html) mukaan luomme / muutamme salasanan luomallemme PostgreSQL-käyttäjälle, jotta voimme asettaa salasanan PHP-tiedostossa tietokannasta lukemista varten.
xubuntu@xubuntu:~$ sudo -u postgres createdb xubuntu
xubuntu@xubuntu:~$ sudo -u postgres createuser xubuntu
xubuntu@xubuntu:~$ whoami
xubuntu
xubuntu@xubuntu:~$ psql
psql (10.12 (Ubuntu 10.12-0ubuntu0.18.04.1))
Type "help" for help.
xubuntu=> help
You are using psql, the command-line interface to PostgreSQL.
Type: \copyright for distribution terms
\h for help with SQL commands
\? for help with psql commands
\g or terminate with semicolon to execute query
\q to quit
xubuntu=> CREATE TABLE CUSTOMERS (id INT PRIMARY KEY, fullName VARCHAR(100));
CREATE TABLE
xubuntu=> man CUSOTMERS
xubuntu-> ls
xubuntu-> SELECT * FROM CUSTOMERS;
ERROR: syntax error at or near "man"
LINE 1: man CUSOTMERS
^
xubuntu=> /d
xubuntu-> \d
List of relations
Schema | Name | Type | Owner
--------+-----------+-------+---------
public | customers | table | xubuntu
(1 row)
xubuntu-> \d
List of relations
Schema | Name | Type | Owner
--------+-----------+-------+---------
public | customers | table | xubuntu
(1 row)
xubuntu-> \d CUSTOMERS
Table "public.customers"
Column | Type | Collation | Nullable | Default
----------+------------------------+-----------+----------+---------
id | integer | | not null |
fullname | character varying(100) | | |
Indexes:
"customers_pkey" PRIMARY KEY, btree (id)
xubuntu->
^
xubuntu=> INSERT INTO customers (id, fullName) VALUES (1, 'Kulta ja Kaivos ky');
INSERT 0 1
xubuntu=> SELECT * FROM customers;
id | fullname
----+--------------------
1 | Kulta ja Kaivos ky
(1 row)
xubuntu=> INSERT INTO customers (id, fullName) VALUES (2, 'Piilosana ry');
INSERT 0 1
xubuntu=> INSERT INTO customers (id, fullName) VALUES (3, 'MetalliMake');
INSERT 0 1
xubuntu=> SELECT * FROM customers;
id | fullname
----+--------------------
1 | Kulta ja Kaivos ky
2 | Piilosana ry
3 | MetalliMake
(3 rows)
xubuntu=> ALTER USER xubuntu WITH PASSWORD 'password-of-your-choosing-remember-good-passw';
xubuntu=> \psql
Invalid command \psql. Try \? for help.
xubuntu=> help
You are using psql, the command-line interface to PostgreSQL.
Type: \copyright for distribution terms
\h for help with SQL commands
\? for help with psql commands
\g or terminate with semicolon to execute query
\q to quit
xubuntu=> \q
xubuntu@xubuntu:~$
Tämän jälkeen luomme Apachelle virtuaalista hostaamista varten asetustiedoston polkuun /etc/apache2/sites-available/. Alla terminaalin syötettä ja tulostetta kronologisessa järjestyksessä (tiedosto nimeltä sorkka.conf):
Tämän jälkeen (yllä oleva tiedosto luotiin kohdassa sudo nano sorkka.conf):
xubuntu@xubuntu:~$ cd /etc/apache2/sites-available/
xubuntu@xubuntu:/etc/apache2/sites-available$ ls
000-default.conf default-ssl.conf
xubuntu@xubuntu:/etc/apache2/sites-available$ a2enmod userdir
Could not create /etc/apache2/mods-enabled/userdir.conf: Permission denied
xubuntu@xubuntu:/etc/apache2/sites-available$ sudo a2enmod userdir
Enabling module userdir.
To activate the new configuration, you need to run:
systemctl restart apache2
xubuntu@xubuntu:/etc/apache2/sites-available$ sudo nano sorkka.conf
xubuntu@xubuntu:/etc/apache2/sites-available$ sudo a2ensite sorkka.conf
Enabling site sorkka.
To activate the new configuration, you need to run:
systemctl reload apache2
xubuntu@xubuntu:/etc/apache2/sites-available$ sudo a2dissite 000-default.conf
Site 000-default disabled.
To activate the new configuration, you need to run:
systemctl reload apache2
xubuntu@xubuntu:/etc/apache2/sites-available$ sudo systemctl restart apache2
Tämän jälkeen loimme määrittelemäämme polkuun (/home/xubuntu/sorkkacrm_public/) tiedoston index.php seuraavilla PHP- sekä SQL ja databaseen liittyvillä funktioille ja määritellyllä syntaxilla:
<?php
$host = 'localhost';
$pass = 'your-own-strong-password';
$user = 'xubuntu';
$db = 'xubuntu';
// Alhaalla valmiina pg_connect yms. komentoja PHP:n ja tietokannan välille.
$conn = pg_connect("host=$host dbname=$db user=$user password=$pass")
or die ("Could not connect to server, try configuring again\n");
$names = pg_query($conn, "SELECT fullName FROM customers");
if (!$names) {
echo "An error occurred, please try again.\n";
exit;
}
while ($row = pg_fetch_row($names)) {
echo "Asiakasyritys on: $row[0]";
echo "<br />\n";
}
?>
Lisäksi kävin muokkaamassa polussa /etc/ hosts tiedostoa komennolla sudoedit hosts, jolloin saamme simuloitua virtuaalista palvelinta halutussa osoitteessa. Tiedoston sisältö oli seuraavanlainen muokkausten jälkeen:
127.0.0.1 localhost
127.0.1.1 xubuntu
{my-IP} www.sorkkacrm.example.com
{my-IP} sorkkacrm.example.com
{my-IP} rauta.example.com {NÄMÄ laitettu valmiiksi seuraavaa tehtävää varten}
{my-IP} www.rauta.example.com
# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback\
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts
Nyt tuli mutkia matkaan – olen tehnyt PostgreSQL:llä ennenkin tietokantoja ja lukenut niitä aivan samalla periaatteella (luentojemme aikana samalla käytäntöä opetellen), mutta jonkun takia Live-tikkuni herjaa seuraavaa:
[Mon Mar 16 15:27:49.272106 2020] [php7:error] [pid 32290] [client 192.168.10.43:40368] PHP Fatal error: Uncaught Error: Call to undefined function pg_connect() in /home/xubuntu/sorkkacrm_public/index.php:8\nStack trace:\n#0 {main}\n thrown in /home/xubuntu/sorkkacrm_public/index.php on line 8
Nopealla googlaamisella löysin muutaman artikkelin, jotka sivuavat Live-tikkua ja kuinka heilläkään tietokannasta lukeminen ei ole onnistunut tietyissä kokoonpanoissa. Ihmettelin asioita hetken, tarkastelin koodia ja luin dokumentaatiota – päätin kokeilla vielä pg_connect() metodin sijasta seuraavaa:
<?php
$myPDO = new PDO('pgsql:host=localhost;dbname=xubuntu', 'xubuntu', 'password-of-your-choosing');
?>
<?php
$result = $myPDO->query("SELECT fullName FROM customers");
?>
Myöskään PDO-ominaisuudet eivät nyt toimineet, vaan sain virheilmoitukseksi sen, että ajuria ei löydy.
Päätin siirtyä tehtävässä eteenpäin kokeiltuani index.php:n sisällä vain hyvin yksinkertaista php-koodia (<?php print(’Hei vaan!’ ?>), ja tämä toimi virtuaalisella hostaamisella ongelmitta.
Eli; tietokanta ja PostgreSQL toimivat, samoin toimivat PHP-ominaisuudet ja Apachen PHP-moduulit, mutta ainoana asiana en saanut tulostettua nettisivulle tietokannasta hakemaani tietoa. Tämä vaatii lisää tarkastelua ja tutkimista, sillä olen hyvin varma, että yllä mainituilla koodeilla ja asetuksilla tietokannasta hakemisen pitäisi onnistua.
ADMIN EDIT 20.03.2020 – Kollegoiden töiden tarkastelun jälkeen olen huomannut, että ihan samoilla periaatteilla ja koodipätkillä osa on saanut toimimaan tietokannasta lukemisen, metodina myös pg_connect(). Jos tätä testiä ajetaan uusiksi, pari huomiota:
Ei ajeta sudo apt-get upgrade alussa, varmuuden vuoksi.
Tarkastellaan vielä php.ini-tiedostoa dependenssien sekä exclusioneiden varalta.
Murtautumisyrityksiä ja mistä hakea
Koska tein tehtäviä paikallisella koneella, näin logeista (Apachen omat logit polussa /var/log/apache2/…..) vain omia sivulatauksiani, ja myöskään järjestelmän auth.log ei sisältänyt muita kuin omia toimintojani koneen sisällä. Auth.log olisi erinomainen paikka tarkastella mahdollisia murtautumisyrityksiä, ja access.log Apachen omassa kansiossa on erinomainen toinen työväline tiedonsiirron tarkasteluun. Auth.log sisälsi seuraavaa:
xubuntu@xubuntu:/var/log$ tail -F auth.log
Mar 16 16:07:42 xubuntu sudo: pam_unix(sudo:session): session closed for user root
Mar 16 16:09:01 xubuntu CRON[4166]: pam_unix(cron:session): session opened for user root by (uid=0)
Mar 16 16:09:01 xubuntu CRON[4166]: pam_unix(cron:session): session closed for user root
Mar 16 16:09:26 xubuntu sudo: xubuntu : TTY=pts/0 ; PWD=/home/xubuntu/sorkkacrm_public ; USER=root ; COMMAND=/bin/nano index.php
Mar 16 16:09:26 xubuntu sudo: pam_unix(sudo:session): session opened for user root by (uid=0)
Mar 16 16:09:34 xubuntu sudo: pam_unix(sudo:session): session closed for user root
Mar 16 16:10:01 xubuntu CRON[4245]: pam_unix(cron:session): session opened for user root by (uid=0)
Mar 16 16:10:01 xubuntu CRON[4246]: pam_unix(cron:session): session opened for user munin by (uid=0)
Mar 16 16:10:01 xubuntu CRON[4245]: pam_unix(cron:session): session closed for user root
Mar 16 16:10:06 xubuntu CRON[4246]: pam_unix(cron:session): session closed for user munin
Kuten logista näkyy, olen tehnyt esimerkiksi sudo-oikeuksilla index.php-tiedoston. Huom! Kotikansioon näitä tiedostoja olisi voinut tehdä myös normaalin käyttäjän oikeuksin, ja onkin suotavaa olla sudottelematta käyttäjän kotikansioissa.
Sorkan sivut, staattinen HTML ja Title-tagit
Ideana oli luoda siis staattinen HTML-sivu näkymään halutussa osoitteessa. Aloitin muokkaamalla jo olemassa olevaa sorkka.conf-tiedostoa, eli ideana on hostata saman tiedoston avulla kahta eri sisältöä. Sorkka.conf (polussa /etc/apache2/sites-available) oli muokkausten jälkeen seuraavanlainen:
Tämän jälkeen loin haluttuun polkuun polun lopussa sijaitsevan kansion sisälle index.html-tiedoston seuraavalla sisällöllä:
<!DOCTYPE html>
<html>
<head>
<title>Sorkka ja Rauta Oy</title>
</head>
<body>
<h1>Sorkka ja Rauta Oy</h1>
</body>
</html>
Jotta pystyisin simuloimaan nimipalvelinta, täytyy vielä käydä muokkaamassa hosts-tiedostoa polussa /etc/ – tämä onnistuu komennolla sudoedit hosts kyseisessä polussa. Tiedoston sisältö on seuraavanlainen myös edellisten tehtävien muokkausten jälkeen (IP-osoitteesta saa tietoa komennoilla hostname -I ja ifconfig -a):
127.0.0.1 localhost
127.0.1.1 xubuntu
{my-IP} www.sorkkacrm.example.com
{my-IP} sorkkacrm.example.com
{my-IP} rauta.example.com
{my-IP} www.rauta.example.com
# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback\
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts
Tämän jälkeen navigoin osoitteeseen http://www.rauta.example.com (tai rauta.example.com), ja näkymä oli seuraavanlainen (myöskään logeissa ei ollut virheitä, toiminnallisuus kunnossa):
Einari käyttäjä ja hänelle PHP-koodilla tulostus ’Einari’
Loin ensimmäiseksi käyttäjän einari hyvällä salasanalla varustettuna. Kirjaudutaan myös käyttäjälle einari, jotta ei tarvitse sudotella tai vaihdella oikeuksia käyttäjän kotihakemistossa. Alhaalla terminaalin tulostetta ja syötteitä:
xubuntu@xubuntu:/etc/apache2/sites-available$ sudo adduser einari
Adding user `einari' ...
Adding new group `einari' (1000) ...
Adding new user `einari' (1000) with group `einari' ...
Creating home directory `/home/einari' ...
Copying files from `/etc/skel' ...
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
Changing the user information for einari
Enter the new value, or press ENTER for the default
Full Name []: Einari Test PHP userDir
Room Number []:
Work Phone []:
Home Phone []:
Other []:
Is the information correct? [Y/n]
xubuntu@xubuntu:/etc/apache2/sites-available$ cd /home/einari
xubuntu@xubuntu:/home/einari$ ls
xubuntu@xubuntu:/home/einari$ mkdir public_html
mkdir: cannot create directory ‘public_html’: Permission denied
xubuntu@xubuntu:/home/einari$ sudo su einari
einari@xubuntu:~$ cd /home
einari@xubuntu:/home$ ls
einari xubuntu
einari@xubuntu:/home$ cd einari/
einari@xubuntu:~$ ls
einari@xubuntu:~$ mkdir public_html
einari@xubuntu:~$ ls
public_html
einari@xubuntu:~$ cd public_html/
einari@xubuntu:~/public_html$ nano index.php
einari@xubuntu:~/public_html$
Index.php sisältö on seuraavanlainen (polku on juuri yllä mainittu polku, sillä olemme laittaneet päälle Apachen komennolla a2enmod userdir käyttäjien kotihakemistot ja niiden kautta toimivat sivut):
<?php
print('Einari');
?>
Koska käyttäjän kotihakemistossa on oletuksellisesti poistettu PHP-käytöstä, jouduin etsimään asetustiedostoa Apachen kansion sisältä, jota muokkaamalla saisin PHP:n toimimaan käyttäjän kotihakemistossa. Kokeilin seuraavassa polussa seuraavaa:
Polkuna: /etc/apache2/
Komentona: grep -lr php | less
Tulostus:
sites-available/default-ssl.conf
mods-available/php7.2.load
mods-available/php7.2.conf // VALITAAN TÄMÄ KOKEILUN JÄLKEEN //
mods-available/dir.conf
(END)
Tehdään seuraavat muokkaukset ohjeiden mukaan:
GNU nano 2.9.3 php7.2.conf Modified
<FilesMatch ".+\.ph(ar|p|tml)$">
SetHandler application/x-httpd-php
</FilesMatch>
<FilesMatch ".+\.phps$">
SetHandler application/x-httpd-php-source
# Deny access to raw php sources by default
# To re-enable it's recommended to enable access to the files
# only in specific virtual host or directory
Require all denied
</FilesMatch>
# Deny access to files without filename (e.g. '.php')
<FilesMatch "^\.ph(ar|p|ps|tml)$">
Require all denied
</FilesMatch>
# Running PHP scripts in user directories is disabled by default
#
# To re-enable PHP in user directories comment the following lines
# (from <IfModule ...> to </IfModule>.) Do NOT set it to On as it
# prevents .htaccess files from disabling it.
#<IfModule mod_userdir.c>
# <Directory /home/*/public_html>
# php_admin_flag engine Off
# </Directory>
#</IfModule>
Tämän jälkeen Apachen oma error.log ei näyttänyt virheitä, ja tulostus oli seuraavanlainen nettisivulla käyttäjän nimeä käyttäen:
Munin ja tehtävänaikainen kuormitus
Munin näyttää graafista tietoa tietokoneen suorituskyvystä – Muninin asennus tehtiin heti ensimmäisenä tämän harjoituksen alussa, ja sen on annettu pyöriä koko harjoituksen ajan päällä taustalla. Munin kirjoittaa ja näyttää dataa HTML-muodossa index.html-sivustolla jatkolinkkien myötä.
Kuten alla olevista kuvista nähdään, suoritin on ollut idlenä (eli ”käyttämättömänä”, kuormittumatta) hyvinkin paljon työskentelyajasta – tämä selittyy sillä, että työskentely tapahtui hyvin paljon vain tekstitiedostoja luoden, ja komentoriviä käyttäen. Isoimmat piikit ovat tulleet asennusten ja pakettien hakemisten aikana. Kovaa kuormitusta ei ollut esimerkiksi 3D-grafiikan suhteen tehtävän aikana.
Nettistatistiikat näyttävät piikkejä ja toimintaa juurikin pakettien asennusten aikana ja sivulatausten aikana. Muistin käyttö on pysynyt jatkuvasti alhaisena – ei kovaa kuormitusta. Käyttäjien luontiin on tullut toiminnallisia piikkejä, kun olen esimerkiksi luonut ’einari’ käyttäjän tehtävää varten.
Kokonaisuudessaan Munin tarjoaa erinomaista ja monipuolista tietoa järjestelmästä graafisessa muodossa – Muniniin on lisäksi mahdollista asennella erilaisia zoomaus-vaihtoehtoja taulukoihin ja grafiikoihin nähden, mutta niitä ei tässä työssä kokeiltu. Alhaalla muutamat kuvat Muninin grafiikoista, joiden perusteella päätelmiä olen tehnyt.
Suorittimen tietojaLevytietoja
Rasitusta voi myös testata seuraavasti Apachen Benchmarkilla (sivulataukset, toiminnallisuus):
xubuntu@xubuntu:/home/einari/public_html$ ab -n 2600 -c 200 http://localhost:80/
This is ApacheBench, Version 2.3 <$Revision: 1807734 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking localhost (be patient)
Completed 260 requests
Completed 520 requests
Completed 780 requests
Completed 1040 requests
Completed 1300 requests
Completed 1560 requests
Completed 1820 requests
Completed 2080 requests
Completed 2340 requests
Completed 2600 requests
Finished 2600 requests
Server Software: Apache/2.4.29
Server Hostname: localhost
Server Port: 80
Document Path: /
Document Length: 12 bytes
Concurrency Level: 200
Time taken for tests: 0.215 seconds
Complete requests: 2600
Failed requests: 0
Total transferred: 465400 bytes
HTML transferred: 31200 bytes
Requests per second: 12096.57 [#/sec] (mean)
Time per request: 16.534 [ms] (mean)
Time per request: 0.083 [ms] (mean, across all concurrent requests)
Transfer rate: 2114.54 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.5 0 3
Processing: 1 10 30.9 5 212
Waiting: 1 10 30.9 5 212
Total: 2 10 31.2 5 214
Percentage of the requests served within a certain time (ms)
50% 5
66% 6
75% 6
80% 6
90% 6
95% 7
98% 209
99% 212
100% 214 (longest request)
Kuva kaikesta toiminnallisuudesta tehtävän lopussa
https://medium.com/@dushan14/create-a-web-application-with-python-flask-postgresql-and-deploy-on-heroku-243d548335cc (weird link, had to put into code tags)
Lisäksi käytössäni oli Xubuntun Live-USB -tikku, versiolla Xubuntu 18.04.3. Huomiona kellonajat ovat Xubuntun Live-tikulla kaksi tuntia jäljessä Suomen aikaa.
Tehtävä A, VANHA POHJA)
Tehtävän tarkoituksena on saada kolmella (3) eri ohjelmointikielellä toimimaan Hello World! -tyyppinen tulostus nettisivulle localhost-osoitteeseen.
Asennellaan ensimmäiseksi tuttu ja turvallinen Flask-ympäristö Hello World! -Stringin näyttämiseksi. Ensimmäiseksi ajetaan seuraavat komennot Xubuntun Live-tikun boottaamisen jälkeen:
setxkbmap fi
sudo apt-get update
sudo apt-get upgrade
Tämän jälkeen voimme asentaa kaikki tarvittavat ohjelmistot samalla (Flask, WSGI, Apache2). Tehtävä jätetty kesken, sillä uusi pohja saapui tehtäviä varten.
Tehtävä A + B, uusi pohja)
Tehtävä aloitettu kello 07:30, 09.03.2020. Jatkettu vielä 10.03.2020, kohdasta BASE.HTML.
Tehtävän tarkoituksena on saada lomakkeet toimimaan Mod WSGI -ympäristössä. Testitarkoituksena on luoda tietokantataulun pohjalta lomake, johon käyttäjä voi syöttää tietojaan. Tulemme käyttämään tehtävän tekemisessä ja toteutuksen testaamisessa Tero Karvisen mallipohjaa automaattisille lomakkeille (http://terokarvinen.com/2020/flask-automatic-forms/).
Ensimmäiseksi Live-tikun käynnistämisen jälkeen ajetaan seuraavat komennot:
setxkbmap fi
sudo apt-get update
sudo apt-get upgrade
Tämän jälkeen voimme asennella tarvittavia paketteja sekä kirjastoja, ja näitä ovat esimerkiksi Apache2, python3-flask, mod-wsgi-py3, Flask WTF sekä Flask SQL. Tarkastellaan tilannetta apachen error-login välityksellä asennuksen lomassa, jotta näemme, mitä moduuleita meiltä mahdollisesti puuttuu.
Huom! Asennuksista lisää aikaisemmissa tehtävissä – tarkat kuvaukset löytyvät Apachen testaamisesta, esimerkkikoodeista, virheiden tutkimisesta sekä vianselvityksistä aikaisemmista tehtäväosioista.
Asennetaan ensimmäiseksi Apache2, tarvittava Python 3 Flask sekä Mod WSGI (Python 3) seuraavilla komennoilla:
Tarkastellaan Apachen toimivuutta logien sekä latautuvan localhost-osoitteesta löytyvän tulosteen perusteella. Logit ovat kunnossa, ja kuva saadaan nettiselaimesta seuraavanlaiseksi:
Kaikki siis kunnossa.
Uusi käyttäjä ja kotikansio + WSGI-tiedosto + formed.py ja templatet (muotit)
Seuraavaksi luodaan uusi käyttäjä, jonka automaattisesti luotu samanniminen ryhmä otetaan käyttöön oikeuksineen normaalille käyttäjälle, tässä tilanteessa testikäyttäjänä normaali xubuntu. Komennolla whoami saa lisätietoa käyttäjän nimestä.
Alla näkyy komentorivin syötteitä sekä tulostetta. Komentoina on käytetty muun muassa adduser, passwd (muista aina hyvä salasana!), usermod, usermod–lock, sekä sudoadduser {username} {groupname}. Lisäksi on käytetty touch-komentotyökalua, joka päivittää tiedostojen aikaleimat nykyhetkeen. Niin sanotusti hipaisemalla tiedostoa saadaan se päivittymään, esimerkkinä tulemme käyttäämään apachen uudelleenkäynnistämisen sijasta touch-komentoa tiedostoon, ja sen kuuluisi toimia päivittävänä toimenpiteenä. Lisäksi on käytetty komentoa ls- l, eli tarkastellaan long-tyyppisesti tiedostojen oikeuksia ja aikaleimoja. Lisäksi on mahdollista käyttää pwgen-komentoa, ja luoda näin random-tyyppinen String-rivi salasanaa varten. Touch-lisätietoja: https://www.linux.fi/wiki/Touch.
Alla terminaalin tulostetta ja komentoja kronologisesti ajettuna – luon siis uuden käyttäjän, lisään oman käyttäjän uuden luodun käyttäjän ryhmään, annan ryhmälle sekä tiedostoille oikeuksia, ja lopuksi testaan, miten flaski-pohjainen tuotantoympäristö toimii (sama kuin viime viikon tehtävässä).
xubuntu@xubuntu:~$ sudo apt install -y pwgen
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following package was automatically installed and is no longer required:
libwayland-egl1-mesa
Use 'sudo apt autoremove' to remove it.
The following NEW packages will be installed:
pwgen
0 upgraded, 1 newly installed, 0 to remove and 11 not upgraded.
Need to get 18.0 kB of archives.
After this operation, 52.2 kB of additional disk space will be used.
Get:1 http://archive.ubuntu.com/ubuntu bionic/universe amd64 pwgen amd64 2.08-1 [18.0 kB]
Fetched 18.0 kB in 0s (113 kB/s)
Selecting previously unselected package pwgen.
(Reading database ... 154740 files and directories currently installed.)
Preparing to unpack .../pwgen_2.08-1_amd64.deb ...
Unpacking pwgen (2.08-1) ...
Setting up pwgen (2.08-1) ...
Processing triggers for man-db (2.8.3-2ubuntu0.1) ...
xubuntu@xubuntu:~$ pwgen 20 1
Naizoochee0aiTixoh3a
xubuntu@xubuntu:~$ sudo adduser arttuwsgi
Adding user `arttuwsgi' ...
Adding new group `arttuwsgi' (1000) ...
Adding new user `arttuwsgi' (1000) with group `arttuwsgi' ...
Creating home directory `/home/arttuwsgi' ...
Copying files from `/etc/skel' ...
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
Changing the user information for arttuwsgi
Enter the new value, or press ENTER for the default
Full Name []: Arttu Kesanto WSGI
Room Number []:
Work Phone []:
Home Phone []:
Other []:
Is the information correct? [Y/n] Y
xubuntu@xubuntu:~$ whoami
xubuntu
xubuntu@xubuntu:~$ groups
xubuntu adm cdrom sudo dip plugdev lpadmin sambashare
xubuntu@xubuntu:~$ sudo usermod --lock arttuwsgi
xubuntu@xubuntu:~$ sudo adduser xubuntu arttuwsgi
Adding user `xubuntu' to group `arttuwsgi' ...
Adding user xubuntu to group arttuwsgi
Done.
xubuntu@xubuntu:~$ groups
xubuntu adm cdrom sudo dip plugdev lpadmin sambashare
xubuntu@xubuntu:~$ sudo su
root@xubuntu:/home/xubuntu# sudo su xubuntu
xubuntu@xubuntu:~$ groups
xubuntu adm cdrom sudo dip plugdev lpadmin sambashare arttuwsgi
xubuntu@xubuntu:~$
Tämän jälkeen luodaan virtuaalinen host -tiedosto omilla asetuksilla Apache2 varten (tästä tietoa enemmän aikaisemmissa tehtäväosioissa). Sisältö on seuraavanlainen apachen asetustiedosto sites-available polkuun (/etc/apache2/sites-available):
Seuraavaksi tehdään tiedostot arttu.wsgi (joka toimii sovelluksen käynnistävänä tiedostona) sekä formed.py, joka sisältää puolestaan samat kohdat kuin Tero Karvisen esimerkkikoodissa, mutta tällä kertaa poistamme app.run-rivin tuotantopohjaisen toteutuksen johdosta. Ilman tuotantopohjaista toteutusta voisimme käynnistää tiedoston python3 formed.py -komennolla.
Tiedostot tulevat polkuun /home/arttuwsgi/public_wsgi, jonka lisäksi tehdään oikeuksien ja hallintaan liittyvät muutokset komennoilla sudo chmod g=rwxs /home/arttuwsgi/public_wsgi* sekä sudochown arttuwsgi:arttuwsgi /home/arttuwsgi/public_wsgi*. Tämä asia on käyty läpi myös viime viikon tehtäväosiossa. RWX tarkoittaa oikeuksien antamista parametreilla read, write, execute, ja s tarkoittaa ”sticky” (vrt. setgid, setuid) eli pidämme kansiot arttuwsgi:n alla ja haluamamme ryhmän alla, ryhmän ID:llä, ei käyttäjän ID:llä.
Tässä vielä oikeuksista – samat löytyvät viime tehtäväosiosta:
0 --- ei oikeuksia
1 --x suoritus
2 -w- kirjoitus
3 -wx kirjoitus ja suoritus (2+1)
4 r-- luku
5 r-x luku ja suoritus (4+1)
6 rw- luku ja kirjoitus (4+2)
7 rwx luku, kirjoitus ja suoritus (4+2+1)
Näin saadaan kaikki kansion tiedostot normaalin käyttäjän oikeuksilla muokattavaksi, jos käyttäjä kuuluu ryhmään arttuwsgi, jolloin sudo-komentoa ei tarvitse käyttää. Tätä testataan myöhemmin touch komennolla aikaleimojen saamiseksi nykyhetkeen, jolloin esimerkiksi tiedostoa hello.py muokkaamalla apachea ei tarvitse käynnistää uudestaan, vaan voidaan komennolla touch arttu.wsgi ajaa päivitykset käyttöön.
Sisällöt sekä arttu.wsgi että formed.py -tiedostoille ovat seuraavat:
import sys # arttu.wsgi
assert sys.version_info.major >= 3, "Python version too old in arttu.wsgi!"
sys.path.insert(0, '/home/arttuwsgi/public_wsgi/')
from formed import app as application
Koodissa annetaan polku tiedostoille, jotka käynnistetään ja joita käytetään. Lisäksi kerrotaan tarkasti, mikä funktio halutaan käyntiin tiedostoja ajettaessa. Rivi 2 kirjoitetaan virheiden selventämiseksi, ja rivi liittyy Python 2 ja Python 3 -kielien eroihin.
Rakenne tulee olemaan seuraavanlainen kaikille tiedostoille:
#!/usr/bin/python3. // formed.py-file, Arttu K.
"RSVP autoform"
# Copyright 2020 Tero Karvinen http://TeroKarvinen.com, Modified by Arttu Kesanto
from flask import Flask, render_template, flash, redirect
from flask_sqlalchemy import SQLAlchemy
from wtforms.ext.sqlalchemy.orm import model_form
from flask_wtf import FlaskForm
import wtforms #import
app = Flask(__name__)
db = SQLAlchemy(app)
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///autoformed.db"
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
app.config["SECRET_KEY"] = "dUCF)mtd9MAoZ?;R|8*iB^.+TCV//0"
class Reply(db.Model):
id = db.Column(db.Integer, primary_key=True)
coming = db.Column(db.Boolean, nullable=False)
email = db.Column(db.String, nullable=False)
name = db.Column(db.String, nullable=False)
field_args = { "email": {"validators": [wtforms.validators.Email()]} }
ReplyForm = model_form(model=Reply, base_class=FlaskForm, db_session=db.session, field_args=field_args)
@app.before_first_request
def beforeFirstRequest():
db.create_all()
@app.route("/", methods=["GET", "POST"])
def index():
form = ReplyForm()
if form.validate_on_submit():
reply = Reply()
form.populate_obj(reply)
db.session.add(reply)
db.session.commit()
flash("Your reply has been added. Welcome!")
return redirect("/")
replies = db.session.query(Reply)
return render_template("replies.html", form=form, replies=replies)
#def main(): // Poistetaan käytöstä, koska tuotantototeutus mod wsgi:n kanssa. Just in case.
# app.run(debug=True)
#
#if __name__ == "__main__":
# main()
Lisäksi teemme muotin (muotit) kyseiseen toteutukseen, ja rakenne sekä sisältö muotteihin liittyen on seuraavanlainen:
Base.html
<!doctype html>
<html lang=en>
<head>
<title>Joining an Event Example</title>
<meta charset="utf-8">
</head>
<body>
{% with messages = get_flashed_messages() %}
{% if messages %}
<ul class=flashes>
{% for message in messages %}
<li>{{ message }}</li>
{% endfor %}
</ul>
{% endif %}
{% endwith %}
{% block body %}
<h1>Hello Tero</h1>
{% endblock %}
<p>Learn Flask automatic forms at our teacher's website <a href="TeroKarvinen.com">TeroKarvinen.com</a>
</body>
</html>
Replies.html
{% extends "base.html" %}
{% block body %}
<h1>Replies</h1>
<form method=post action="/">
{{ form.csrf_token }}
{% for field in form if not field.name in ["csrf_token"] %}
<p>{{ field.label }}: {{ field }} <b>{{ " ".join(field.errors) }}</b></p>
{% endfor %}
<input type="submit">
</form>
<h2>Replies</h2>
{% for reply in replies %}
<p>{{ reply.name }}</p>
{% endfor %}
{% endblock %}
Seuraavaksi touch-komennolla ”hipaistaan” aikaleimat kuntoon arttu.wsgi-tiedostoon, ja kokeillaan sivulatausta lomakkeiden toiminnan tarkastamiseksi. Sivusto ei lataudu, ja virheilmoitus polussa on seuraavanlainen:
[Tue Mar 10 13:21:44.131731 2020] [wsgi:error] [pid 21845:tid 140669897783040] [remote 127.0.0.1:33460] ModuleNotFoundError: No module named 'flask_sqlalchemy'
Minulta puuttuu siis vielä moduulit nimeltä flask ja sqlalchemy. Olen importoinut formed.py-tiedostossa kirjastoja, joita en ole asentanut paikallisesti koneelleni. Koska en ollut täysin varma, mitkä moduulit minulta puuttuu, käytin seuraavaa komentoa:
apt-cache search flask | grep flask
Lisäksi käytin grep-työkalua myös sqlalchemyn etsimiseen. Löysin seuraavat sopivat moduulit, jotka kokeilin asentaa seuraavilla komennoilla:
Tämän jälkeen ”hipaisin” arttu.wsgi-tiedostoa, ja tarkastelin localhost sivulatausta sekä apachen error.logia. Tuloste oli seuraavanlainen (parin testisyötön jälkeen), ja logissa ei ollut virheitä:
Mahdollisia muokkauksia ja tiedostoista yleisesti
Formed.py tiedosto sisältää sovelluksen importoidut kirjastot ja viittaukset muihin tiedostoihin, joita käytetään formed.py-tiedoston kanssa. Tiedoston alussa importoidaan kaikki tarvittavat kirjastot, moduulit ja laajennukset. Sen jälkeen tehdään luokka Reply, ja määritellään samanaikaisesti column eli taulu kommenteilla tietokantaan – käytännössä teemme tietokannan pohjalta lomakkeen, joka renderöidään nettisivulle.
Luokan attribuutit eli ominaisuudet näkyvät ylhäällä – ne ovat id, coming, email ja name. Tähän voisi esimerkiksi lisätä kohdan toDo-attribuuttina, jolloin käyttäjä voisi tehdä toDo-listausta tietokantatyyppisesti Internettiin. Arvo olisi esimerkiksi db.String(100), ja nullable=False. Lopuksi nämä kommentit / toDo-merkinnät voisi listata replies.html-tiedostossa for-each rakenteessa {{ reply.toDo }}.
Esimerkissämme email-attribuutti validoidaan virheiden varalta – käyttäjän tulee täten syöttää lomakkeelle tietynlainen email-osoite. Validointi tehdään valmiilla metodikutsulla, toiminnallisuus on moduulissa.
Replies.html toimii renderöitävänä mallina, joka perii base.html-mallista – tämän huomaa kohdasta extends ”base.html”. Nämä tiedostot kommunikoivat keskenään, ja replies.html sijoitetaan base.html:n määrittämään kohtaan (vrt. block content). Lisäksi Flash-viestin määrittely tehdään tiedostossa base.html.
Toiminnallisuus oli kunnossa myös kokeilemassani mallissa, jossa tein tietokantataulun toDo-listan attribuutilla todo, ja kokeilin vielä automaattisella Pythonin datetime -importilla (Handling Forms in Flask with Flask-WTF) ajan saamista todo-listan lisäyksen kylkeen.
Mallipohjana toimi täysin tässä työssä esitelty tietokanta- sekä lomakekoodi.
Lisäksi käytössäni oli Xubuntun Live-USB -tikku, versiolla Xubuntu 18.04.3. Huomiona kellonajat ovat Xubuntun Live-tikulla kaksi tuntia jäljessä Suomen aikaa.
Tehtävä A (Vanha pohja)
Ensimmäiseksi tarkastetaan Xubuntun tilaa, eli ajetaan komennot sudo apt-get update ja sudo apt-get upgrade. Tämän jälkeen asennetaan ssh-demoni seuraavalla komennolla:
Tämän jälkeen tarkastellaan asennuksen tilaa komennoilla sudo systemctl status ssh, ja tarkastellaan ssh-asennuksen tilaa. Komentorivi ilmoittaa kaiken olevan kunnossa, ja ssh on ACTIVE, RUNNING. Edellisistä tehtävistä löytyy tarkempaa terminaalin tulostetta ssh-asennukseen liittyen. Etäyhteyden ottaminen onnistuu hyvin, esimerkiksi kesanto-droplettiin (virtuaalinen palvelin), joka luotiin viime tehtävässä.
Tehtävä A (uusi pohja))
Tehtävä aloitettu 01.03.2020, kello 15:52.
Tehtävän tarkoituksena on saada Flask toimimaan Xubuntun käyttöympäristössä; Flask mahdollistaa muun muassa PHP-tiedostojen näyttämisen nettisivulla, ja on kätevä toteutusympäristö erilaisille ohjelmistoille. Flask toimii kehitysympäristönä (”framework”) erilaisille nettipohjaisille sovelluksille. Flask on avoimen lähdekoodin ohjelmistoa, ja sen käyttäminen on melko suoraviivaista.
Huom! Kannattaa aina muistaa laittaa tulimuuri päälle komennolla sudo ufw enable, ja sallia tietyt mahdollisesti käytettävät yhteydet esimerkiksi komennoilla sudo ufw allowapache sekä sudo ufw allow ssh.
Ensimmäiseksi ajetaan seuraavat komennot Xubuntun terminaalissa:
setxkbmap fi
sudo apt-get update
sudo apt-get upgrade
Seuraavaksi asennellaan Apache2 ja Flask Xubuntun käyttöön. Apachen asennuksesta ja virtuaalisesta hostaamisesta sekä virtuaalipalvelimista ja näiden asetuksista löytyy tietoa aikaisemmista tehtäväkohdista ja sivuston blogeista.
Näiden komentojen jälkeen syslogissa eikä muuallakaan ole virheitä havaittavissa, ja seuraavaksi kokeillaan toimivuutta suoraan asentamalla flask-ympäristöön yksinkertainen Hello World -sovellus. Apachen toimivuus testataan heti aluksi esimerkiksi osoitteella localhost url-hakukenttään, ja komennolla sudo systemctl status apache2. Alla terminaalin tulostetta ja kuva:
Tämän jälkeen suoritetaan nano-komennolla yksinkertaisen tekstitiedoston luominen pythonin käyttöön. Luodaan tekstitiedosto Xubuntu-käyttäjän kotikansioon. Alla komentoja ja polkua liittyen uuden kansion luontiin käyttäjän kotikansioon, ja tämän kansion sisälle luodaan hello.py-tekstitiedosto flaskin kehitysympäristön mukaisesti. (Karvinen 2020.)
Tekstitiedoston sisältö:
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello Flask! This message was created by Arttu Kesanto!"
app.run(debug=True)
Tekstitiedoston sisällössä importoidaan eli otetaan käyttöön flask-moduulista luokka nimeltä Flask. Koska import on kirjoitettu yllä olevalla tavalla, voidaan kirjoittaa flask.Flask sijasta pelkkä Flask (liittyy namespace-syntaxiin, säästetään hieman kirjoittamiselta vaivaa.)
Flask luokasta luodaan seuraavaksi uusi olio (eli viittaus luokkaan), joka talletetaan muuttujaan app. Python luo meille _name_ muuttujan, joka sisältää String-tyyppisen tiedon ”_name_”. Lisäksi nopea kehityksen mahdollistamiseksi Flask sisältää kehitysserverin, joka ei ole optimaalisin vaihtoehto oikeassa toteutusympäristössä. Täten tämän esimerkin kohdalla käytämme vielä app.run(debug=True) riviä, mutta seuraavassa tehtävässä tämä poistetaan käytöstä Apachen sekä WSGI:n käytön johdosta. Koodissa valitaan myös url-kentälle sen toteuttama funktio dekoraattorilla. Funktio hello() palauttaa vain tekstin selaimeen, eli funktion palautus on vain String-tyyppinen teksti.
Huom! Kun python3 hello.py on ajettu, sitä voidaan keskeyttää näppäinyhdistelmällä CTRL + Z, ja myös fg ja bg komennot toimivat (foreground, background) – joko sovellus jää pyörimään taustalle, tai se tuodaan eteen ”muokattavaksi”.
Tehtävä B)
Tarkoituksena on saada nyt ajettua tuotantoympäristössä flask-pohjainen sovellus, käyttäen sekä Apachea että WSGI-modulia. WSGI tulee sanoista Web Server Gateway Interface (https://en.wikipedia.org/wiki/Web_Server_Gateway_Interface), ja se tarkoittaa toiminnallisuutta, jossa serverit voivat lähettää kutsuja netissä toimiville sovelluksille tai kehitysympäristöille – käytössä on Python-ohjelmointikieli.
Ensimmäiseksi asennellaan tarvittavat moduulit ja ympäristö. Edellisessä osassa asensin jo valmiiksi Apachen ja konfiguroin tulimuuria. Myös moduuli flask on asennettuna. Täten tarvitsen enää wsgi-moduulin sekä tarkastan vielä flaskin asennuksen, ja nämä hoidetaan seuraavilla komennolla:
On erittäin tärkeää kirjoittamisen hetkellä muistaa asentaa py3 versio py2:n sijasta, sillä Python 2 versio voi mahdollisesti antaa virheilmoituksia, jotka eivät kerro tarkasti, mikä on mennyt pieleen (Karvinen 2020.)
Tässä osiossa käytetään myös komentoja chown sekä chmod. Chown tarkoittaa komentorivityökalua, jolla voidaan vaihtaa omistajana toimivaa käyttäjää tai ryhmää. Lisätietoa: https://www.linux.fi/wiki/Chown. Chmod tarkoittaa puolestaan oikeuksien antamista tiedostoille tai ohjelmistoille, sekä hakemistoille. Lisätietoa: https://www.linux.fi/wiki/Tiedoston_oikeudet.
Alla tulostetta oikeuksien merkitsemisestä ja tulkitsemisesta (suomeksi):
0 --- ei oikeuksia
1 --x suoritus
2 -w- kirjoitus
3 -wx kirjoitus ja suoritus (2+1)
4 r-- luku
5 r-x luku ja suoritus (4+1)
6 rw- luku ja kirjoitus (4+2)
7 rwx luku, kirjoitus ja suoritus (4+2+1)
Seuraavaksi luodaan uusi käyttäjä, jonka automaattisesti luotu samanniminen ryhmä otetaan käyttöön oikeuksineen normaalille käyttäjälle, tässä tilanteessa testikäyttäjänä normaali Xubuntu. Komennolla whoami saa lisätietoa käyttäjän nimestä.
Alla näkyy komentorivin syötteitä sekä tulostetta. Komentoina on käytetty muun muassa adduser, passwd (muista aina hyvä salasana!), usermod, usermod–lock, sekä sudoadduser {username} {groupname}. Lisäksi on käytetty touch-komentotyökalua, joka päivittää tiedostojen aikaleimat nykyhetkeen. Niin sanotusti hipaisemalla tiedostoa saadaan se päivittymään, esimerkkinä tulemme käyttäämään apachen uudelleenkäynnistämisen sijasta touch-komentoa tiedostoon, ja sen kuuluisi toimia päivittävänä toimenpiteenä. Lisäksi on käytetty komentoa ls- l, eli tarkastellaan long-tyyppisesti tiedostojen oikeuksia ja aikaleimoja. Lisäksi on mahdollista käyttää pwgen-komentoa, ja luoda näin random-tyyppinen String-rivi salasanaa varten. Touch-lisätietoja: https://www.linux.fi/wiki/Touch.
Alla terminaalin tulostetta ja komentoja kronologisesti ajettuna – luon siis uuden käyttäjän, lisään oman käyttäjän uuden luodun käyttäjän ryhmään, annan ryhmälle sekä tiedostoille oikeuksia, ja lopuksi testaan, miten flaski-pohjainen tuotantoympäristö toimii.
xubuntu@xubuntu:~$ sudo apt install -y pwgen
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following package was automatically installed and is no longer required:
libwayland-egl1-mesa
Use 'sudo apt autoremove' to remove it.
The following NEW packages will be installed:
pwgen
0 upgraded, 1 newly installed, 0 to remove and 11 not upgraded.
Need to get 18.0 kB of archives.
After this operation, 52.2 kB of additional disk space will be used.
Get:1 http://archive.ubuntu.com/ubuntu bionic/universe amd64 pwgen amd64 2.08-1 [18.0 kB]
Fetched 18.0 kB in 0s (113 kB/s)
Selecting previously unselected package pwgen.
(Reading database ... 154740 files and directories currently installed.)
Preparing to unpack .../pwgen_2.08-1_amd64.deb ...
Unpacking pwgen (2.08-1) ...
Setting up pwgen (2.08-1) ...
Processing triggers for man-db (2.8.3-2ubuntu0.1) ...
xubuntu@xubuntu:~$ pwgen 20 1
Naizoochee0aiTixoh3a
xubuntu@xubuntu:~$ sudo adduser arttuwsgi
Adding user `arttuwsgi' ...
Adding new group `arttuwsgi' (1000) ...
Adding new user `arttuwsgi' (1000) with group `arttuwsgi' ...
Creating home directory `/home/arttuwsgi' ...
Copying files from `/etc/skel' ...
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
Changing the user information for arttuwsgi
Enter the new value, or press ENTER for the default
Full Name []: Arttu Kesanto WSGI
Room Number []:
Work Phone []:
Home Phone []:
Other []:
Is the information correct? [Y/n] Y
xubuntu@xubuntu:~$ whoami
xubuntu
xubuntu@xubuntu:~$ groups
xubuntu adm cdrom sudo dip plugdev lpadmin sambashare
xubuntu@xubuntu:~$ sudo usermod --lock arttuwsgi
xubuntu@xubuntu:~$ sudo adduser Xubuntu arttuwsgoi
adduser: The user `Xubuntu' does not exist.
xubuntu@xubuntu:~$ sudo adduser Xubuntu arttuwsgi
adduser: The user `Xubuntu' does not exist.
xubuntu@xubuntu:~$ whoami
xubuntu
xubuntu@xubuntu:~$ sudo adduser xubuntu arttuwsgi
Adding user `xubuntu' to group `arttuwsgi' ...
Adding user xubuntu to group arttuwsgi
Done.
xubuntu@xubuntu:~$ groups
xubuntu adm cdrom sudo dip plugdev lpadmin sambashare
xubuntu@xubuntu:~$ sudo su
root@xubuntu:/home/xubuntu# sudo su xubuntu
xubuntu@xubuntu:~$ groups
xubuntu adm cdrom sudo dip plugdev lpadmin sambashare arttuwsgi
xubuntu@xubuntu:~$
Tämän jälkeen luodaan virtuaalinen host -tiedosto omilla asetuksilla (tästä tietoa enemmän aikaisemmissa tehtäväosioissa). Sisältö on seuraavanlainen apachen asetustiedosto sites-available polkuun (/etc/apache2/sites-available):
Seuraavaksi tehdään tiedostot arttu.wsgi (joka toimii sovelluksen käynnistävänä tiedostona) sekä hello.py, joka sisältää puolestaan samat kohdat kuin tehtäväosiossa A, mutta tällä kertaa poistamme app.run-rivin Tiedostot tulevat polkuun /home/arttuwsgi/public_wsgi, jonka lisäksi tehdään oikeuksien ja hallintaan liittyvät muutokset komennoilla sudo chmod g=rwxs /home/arttuwsgi/public_wsgi* sekä sudochown arttuwsgi:arttuwsgi /home/arttuwsgi/public_wsgi*. RWX tarkoittaa oikeuksien antamista parametreilla read, write, execute, ja s tarkoittaa ”sticky” (vrt. setgid, setuid) eli pidämme kansiot arttuwsgi:n alla ja haluamamme ryhmän alla, ryhmän ID:llä, ei käyttäjän ID:llä.
Näin saadaan kaikki kansion tiedostot normaalin käyttäjän oikeuksilla muokattavaksi, jos käyttäjä kuuluu ryhmään arttuwsgi, jolloin sudo-komentoa ei tarvitse käyttää. Tätä testataan myöhemmin touch komennolla aikaleimojen saamiseksi nykyhetkeen, jolloin esimerkiksi tiedostoa hello.py muokkaamalla apachea ei tarvitse käynnistää uudestaan, vaan voidaan komennolla touch arttu.wsgi ajaa päivitykset käyttöön.
Sisällöt sekä arttu.wsgi että hello.py -tiedostoille ovat seuraavat:
import sys
assert sys.version_info.major >= 3, "Python version too old in tero.wsgi!"
sys.path.insert(0, '/home/arttuwsgi/public_wsgi/')
from hello import app as application
Koodissa annetaan polku tiedostoille, jotka käynnistetään ja joita käytetään. Lisäksi kerrotaan tarkasti, mikä funktio halutaan käyntiin tiedostoja ajettaessa. Rivi 2 kirjoitetaan virheiden selventämiseksi, ja rivi liittyy Python 2 ja Python 3 -kielien eroihin.
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "You have arrived at a working Flask environment!"
## Kuten nähdään, app.run ei ole enää käytössä.
Seuraavaksi testataan localhost osoitteessa, toimiiko flask-ympäristö ja tiedostot. On hyvä huomioida, että jokaisessa vaiheessa kannattaa tarkistella apachen kautta esimerkiksi komennolla apache2ctl configtest asennuksen hetkellistä tilannetta, jotta mahdollisia virheitä voi analysoida. Esimerkiksi jos Flask ei ole asennettuna, tai asetustiedostoissa on virheitä, nämä tulostetaan terminaaliin riveihin viittaamalla. Lisäksi Apachen oma error.log sekä syslog Xubuntulle ovat käteviä paikkoja katsoa ja analysoida mahdollisia virhetilanteita. Nämä löytyvät polusta /var/log/.
Kun kaikki logit sekä configtest näyttävät lupaavalta, kuten tarkastelin ennen kuin menin osoitteeseen localhost tai käytin komentoa curl localhost, on aika testailuun. Alla kuvia tilanteesta:
Kaikki toimii kuten pitää. Logit ovat lisäksi kunnossa ilman virheilmoituksia. Firefoxissa ja Chromessa sama näkymä. (02.03.2020)
Seuraavaksi muokataan hello.py-tiedostoa normaalin käyttäjän oikeuksin, ja touch-komennolla ”hipaistaan” arttu.wsgi tiedosta, ja saadaan päivitykset näkymään localhost-sivulla ilman komentoa sudo systemctl restart apache2:
Teksti muutettu kyseiseen muotoon nano-editorilla. Toimii kuten pitää. Logit kunnossa ja testattu myös Firefox sekä Chrome-selaimilla.
Näin ollen voimme siirtyä käyttämään templateja sivulla.
Tehtävä C)
Tarkoituksena on saada tuotantoflaskiin muotit päälle. Muotit eli templatet ovat tyylimuotoiluja, joilla voidaan muokata ulkoasua esimerkiksi hello.py-tiedoston sisältämälle return lauseelle eli esimerkissä tekstille, joka näkyy nettisivulla.
Käytetään tehtävässä samaa pohjaa, jota aikaisemmissa kohdissa on käytetty. Tehdään muutokset ja esimerkiksi render_template olion kutsu tiedostoon hello.py.
Kuten esimerkistä nähdää, templates-kansio on samassa juuressa kuin templates-flask.py (eli tässä esimerkissä hello.py), ja templates kansiossa on esimerkiksi jonkinlainen HTML-tiedosto. Tällä rakenteella tiedostojen sisällöt itselläni ovat hello.py-tiedostossa sekä base.html-tiedostossa seuraavanlaiset:
from flask import Flask, render_template
app = Flask(__name__)
@app.route("/")
def hello():
return render_template("base.html", greeting="Template example FLASK")
Uutena importtina on otettu render_template, ja return-palautuksessa ovat sekä base.html tiedosto että Stringi-muuttuja greeting. Muuttujaa käytetään HTML-tiedostossa viittauksena tekstiin Template example FlASK, eli muuttujan sisältö näytetään sivulla. Seuraavaksi alla HTML-tiedoston sisältö:
Koodi on normaalia ja yksinkertaista HTML-muotoa, sillä ideana on tarkistaa templaten toimivuutta. Asetukset arttu.wsgi-tiedostossa pysyvät ennallaan, sillä käynnistämme hello.py-tiedoston, jonka kautta ajetaan base.html. Alla tulostetta terminaalista sekä esimerkkiä havainnollistava kuva – lisäksi virhelogeista ei löytynyt virheitä ja sivulataukset onnistuivat http 200 -statuksella. Toiminnallisuus siis kunnossa.
Tehtävä D)
Tarkoituksena on näyttää esimerkiksi käyttäjän IP-osoite sivulla flask-ympäristössä. Käytetään samaa pohjaa, mitä aikaisemmissa kohdissa on käytetty. Oikeassa tilanteessa nimeämisiin ja muihin syntaxeihin kannattaa kiinnittää enemmän huomiota selvyyden vuoksi.
Mukaan tulee tässä osiossa importti request, sillä esimerkiksi komennolla request.remote_addr saadaan näkyviin sivun lataavan clientin IP. Alhaalla tuloste hello.py-tiedoston sisällöstä:
from flask import Flask, request
app = Flask(__name__)
jän
@app.route("/")
def hello():
ip = request.remote_addr
user = request.user_agent.string
return "Tässä on IP-osoitteesi: " + ip + " ja tässä sinä itse: " + user
Arttu.wsgi tiedosto pysyy ennallaan, sillä edelleen käynnistämme hello.py-tiedoston samalla pohjalla, mutta eri sisällöllä. Tarkoituksena on siis tulostaa avattavalle sivulle käyttäjän IP-osoite sekä tietoa asiakkaan eli clientin selaimesta ja käyttöjärjestelmästä.
Toiminnallisuus on kunnossa, ja myöskään logeissa ei ole virheitä.
Tämän lisäksi tarkistelin Pythonilla kirjoitettua ja Flaskin ympäristössä toimintaan saatua BMI-painoindeksilaskuria, ja koska Pythonin syntaxi on vielä kirjoitushetkellä itselläni vasta alkeiden tasolla, toiminnallisuuden saattaminen laskurille olisi ollut vain koodin kopioimista, vaikka koodi onkin avoimen lähdekoodin alla. Toiminnallisuus on silti sama, ja metodeina käytetään POST sekä GET, ja base.html sekä hello.py -tiedostot (omassa esimerkissäni) toimisivat keskenään ja arttu.wsgi pysyisi entisellään.
Lisäksi käytössäni oli Xubuntun Live-USB -tikku, versiolla Xubuntu 18.04.3. Huomiona kellonajat ovat Xubuntun Live-tikulla kaksi tuntia jäljessä Suomen aikaa.
Huom! Tehtäväkokonaisuus muuttui kurssin aikana, joten tällä viikolla itselläni on hyvin paljon ekstraa tehtynä, mutta merkittyinä ovat selvästi viikon varsinaiset tehtävät – muut tehtävät on tehty lisäharjoituksena.
A + S (Alkuperäiset, paikallisella koneella, ei DigitalOcean name hosting / Droplet käytössä – sivulla 2 on ajantasaiset tehtävät samalla kokoonpanolla)
Tarkoituksena on luoda Apachen oletussivuksi käyttäjän oma sivu, ja tämän lisäksi antaa mahdollisuus normaalille käyttäjälle tehdä palvelimelle nettisivuja. Tämän tehtävän aikana tehdään myös hosts-tiedostoon muutoksia, jolloin omalle sivulle pääsee myös nimen avulla (vrt. Virtual Hosting, Domain Name) – tämä tarkoittaa, että ip-osoitteen sijasta tässä esimerkissä sivu näytetään myös arttukesanto.com url-haulla.
Aloitin Xubuntun käyttämisen komennoilla sudo apt-get update ja sudo apt-get upgrade, minkä jälkeen aloitin Apachen asentamisen komennolla sudo apt-get install apache2. Paketti asentuu kyseisellä komennolla kokonaan. Lisäksi näppäimistö asetettiin suomalaiseen asetteluun komennolla setxkbmap fi.
Edellisessä osiossa on Apachen asentamisesta ja ufw tulimuurista lisää tietoa, ja nämä asetukset tehtiin myös tämän työn aikana, ja sallittiin Apache-asetus ufw:eehen.
Ensimmäiseksi loin uuden kansion komennolla sudo mkdir -p /var/www/arttukesanto.com/html, ja tämän jälkeen annoin kansioon sekä tiedostoihin käyttöoikeuksia komennoilla chown -R sekä chmod -R 755. Tehtävässä kuvauksena oli, että nettisivu luotaisiin käyttäjän kotihakemistoon, mutta halusin käyttää polkua /var/www/ oppiakseni normaalit polut ja Apachen niin sanotun normaalin käyttäytymisen ja tiedostopolut. Lisäksi kokeilin vielä viime viikon tehtävistä komentoa sudo a2enmod userdir, ja täten pääsin katsomaan myös public_html-kansiosta tiedostoa index.html (sekä kansio että tiedosto luotiin itse) osoitteella {my-ip}/~xubuntu.
Tämän jälkeen luotiin uusi index.html tiedosto polkuun /var/www/arttukesanto.com/html/index.html, jonka sisältö on seuraavanlainen HTML-koodipätkä:
<html>
<head>
<title>Welcome to my page!</title>
</head>
<body>
<h1>This site works! Arttu Kesanto is happy!</h1>
</body>
</html>
Tämän jälkeen tein .conf-tiedoston virtuaalista hostausta varten, ja laitoin a2-työkalulla sivuston käyttöön ja poistin käytöstä alkuperäisen asetustiedoston. Komennot ja polut ovat alla terminaalin syötteestä luettavissa:
xubuntu@xubuntu:~$ sudo nano /etc/apache2/sites-available/arttukesanto.com.conf xubuntu@xubuntu:~$ whoami xubuntu xubuntu@xubuntu:~$ sudo a2ensite arttukesanto.com.conf Enabling site arttukesanto.com. To activate the new configuration, you need to run: systemctl reload apache2 xubuntu@xubuntu:~$ sudo a2dissite 000-default.conf Site 000-default disabled. To activate the new configuration, you need to run: systemctl reload apache2 xubuntu@xubuntu:~$ sudo systemctl reload apache2 xubuntu@xubuntu:~$ sudo systemctl restart apache2
Tiedoston arttukesanto.com.conf sisältö on seuraavanlainen omien lisäyksieni jälkeen:
On hyvä huomata, että tällä hetkellä Apachen oletussivu on jo oma tekemäni pieni HTML-pätkä koodia. Seuraavaksi tarkoituksena on luoda mahdollisuus päästä käsiksi sivuun kirjoittamalla url-kenttään arttukesanto.com. Localhostin ip-osoitteella näkyy seuraava sivu:
Xubuntun versiolla 18.04.3 on olemassa Apachen kanssa oletettava virheilmoitus, joka näkyy korjauksineen alla – käytännössä luomme tiedoston servername.conf, jossa on vain tekstipätkä ServerName arttukesanto.com, jotta Apache ymmärtää, mihin viitataan:
xubuntu@xubuntu:~$ sudo apache2ctl configtest
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1. Set the 'ServerName' directive globally to suppress this message
Syntax OK
xubuntu@xubuntu:~$ echo "ServerName arttukesanto.com" | sudo tee /etc/apache2/conf-available/servername.conf
Tämän jälkeen käytin jälleen a2-työkalua, ja siirsin hyvin vaivattomasti conf-tiedoston available-osiosta enabled-osioon komennolla sudo a2enconf servername. Tämän jälkeen ajettaessa komentoa sudo apache2ctl configtest saadaan ilmoitukseksi vain Syntax ok. Eli jatkan eteenpäin. Kaikki toiminnallisuus edellisissä osissa on testailun jälkeen edelleen kunnossa.
Seuraavaksi oli aika muokata hosts-tiedostoa viittamaan omaan IP-osoitteeseen valmiina olevien käyttäjän xubuntu ja localhost IP-osoitteiden lisäksi. Polku ja komento näkyvät alla olevasta syötteestä, ja sisältö sen jälkeen:
27.0.0.1 localhost
127.0.1.1 xubuntu
{my-ip} www.arttukesanto.com
{my-ip} arttukesanto.com
# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts
Tämän jälkeen kokeilin url-hakua komennoilla http://www.arttukesanto.com ja arttukesanto.com, ja HTML-sivuni latautui moitteettomasti, eikä Apachen logeissa ollut virheitä. Toiminnallisuus näyttäisi siis olevan kunnossa.
Alempana terminaalin syötettä ja tulostetta prosessin selventämiseksi:
xubuntu@xubuntu:~$ hostname -I
{my-ip}
xubuntu@xubuntu:~$ sudo mkdir -p /var/www/arttukesanto.com/html
xubuntu@xubuntu:~$ sudo chown -R $USER:$USER /var/www/arttukesanto.com/html
xubuntu@xubuntu:~$ sudo chmod -R 755 /var/www/arttukesanto.com
xubuntu@xubuntu:~$ nano /var/www/arttukesanto.com/html/index.html
xubuntu@xubuntu:~$ sudo nano /etc/apache2/sites-available/arttukesanto.com.conf
xubuntu@xubuntu:~$ whoami
xubuntu
xubuntu@xubuntu:~$ sudo a2ensite arttukesanto.com.conf
Enabling site arttukesanto.com.
To activate the new configuration, you need to run:
systemctl reload apache2
xubuntu@xubuntu:~$ sudo a2dissite 000-default.conf
Site 000-default disabled.
To activate the new configuration, you need to run:
systemctl reload apache2
xubuntu@xubuntu:~$ sudo systemctl reload apache2
xubuntu@xubuntu:~$ sudo systemctl restart apache2
xubuntu@xubuntu:~$ sudo systemctl restart apache2
xubuntu@xubuntu:~$ sudo apache2ctl configtest
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1. Set the 'ServerName' directive globally to suppress this message
Syntax OK
xubuntu@xubuntu:~$ echo "ServerName arttukesanto.com" | sudo tee /etc/apache2/conf-available/servername.conf
B)
Tehtävänä oli siirtää paikalliselta koneelta tiedostoja palvelimelle scp komennolla.
Tein kolme erilaista HTML-tiedostoa, joiden nimet olivat index1.html, index2.html ja index3.html. Sisältö alla numerojärjestyksessä:
<html>
<head>
<title>Welcome to my page!</title>
</head>
<body>
<h1>This site works! Arttu Kesanto is happy!</h1>
</body>
</html>
<html>
<head>
<title>Welcome to my page, another page!</title>
</head>
<body>
<h1>This site works! Arttu Kesanto is happy! This site works from the same config file with different IP.</h1>
</body>
</html>
<html>
<head>
<title>Welcome to my page! Another one of these...</title>
</head>
<body>
<h1>This site works! Arttu Kesanto is happy! This is the third edition...</h1>
</body>
</html>
Seuraavana vuorossa oli SSH-demonin asennus, ja tämä onnistui komennoilla sudo apt install openssh-server. Seuraavaksi tarkastin ssh:n tilan komennolla sudo systemctl status ssh, ja kaikki oli kunnossa. Lisäksi lisäsin tulimuuriin reiän ssh:lle:
xubuntu@xubuntu:/$ sudo systemctl status ssh ● ssh.service – OpenBSD Secure Shell server Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled) Active: active (running) since Wed 2020-02-12 18:08:30 UTC; 24s ago Main PID: 18519 (sshd) Tasks: 1 (limit: 4915) CGroup: /system.slice/ssh.service └─18519 /usr/sbin/sshd -D
Feb 12 18:08:30 xubuntu systemd[1]: Starting OpenBSD Secure Shell server… Feb 12 18:08:30 xubuntu sshd[18519]: Server listening on 0.0.0.0 port 22. Feb 12 18:08:30 xubuntu sshd[18519]: Server listening on :: port 22. Feb 12 18:08:30 xubuntu systemd[1]: Started OpenBSD Secure Shell server. xubuntu@xubuntu:/$ sudo ufw allow ssh Rule added Rule added (v6) xubuntu@xubuntu:/$
Koska olen muodostamassa yhteyttä ssh:lla Macbook Airistani, täytyi Xubuntun Live-tikun käyttäjälle luoda salasana. Tämä ei tyhjän salasanan johdosta onnistunut itselläni kokeiluhetkellä suoraan käyttäjiä muokkaamalla, joten otin avuksi terminaalin:
sudo passwd root
Lisäksi Live-userille oma salasana komennolla passwd pelkästään. Salasana on aluksi tyhjä, joten voidaan vaan painaa Enteriä.
(Tämän jälkeen salasanojen antaminen. Vahvaan salasanaan pitää kiinnittää huomiota.)
Seuraavaksi tiedostojen siirto /var/www/arttukesanto.com/html/ -kansioon onnistui seuraavalla tavalla (komento annettu MacBook Airilla, jotta tiedostot siirtyvät SSH:n kautta testikoneenani käyttämään serverikoneeseen, ja lisäksi olin MacBook Airilla oikeassa alikansiossa):
Tiedostot siirtyivät salasanan antamisen jälkeen, ja kaikki meni erinomaisesti. Toiminnallisuus kunnossa ja tiedostojen sisällä haluamani ja laittamani koodipätkät. Alempana koodia liittyen tiedostojen tarkastamiseen paikallisella koneella, jonne tiedostot on siirretty ssh:lla remote-tietokoneesta.
ubuntu@xubuntu:/var/www/arttukesanto.com/html$ passwd Changing password for xubuntu. (current) UNIX password: Enter new UNIX password: Retype new UNIX password: passwd: password updated successfully xubuntu@xubuntu:/var/www/arttukesanto.com/html$ ls index.html index1.html index2.html xubuntu@xubuntu:/var/www/arttukesanto.com/html$ ls index.html index1.html index2.html index3.html xubuntu@xubuntu:/var/www/arttukesanto.com/html$
C)
Tehtävän tarkoituksena oli näyttää käyttäjän IP-osoite palvelimella PHP-tiedoston avulla (Kesken!).
PHP-tiedostoni sisälsi seuraavan muokatun ja Internetistä haetun tiedon perusteella muodostetun kokonaisuuden testiä varten:
echo $user_ip; // Output IP address [Ex: 177.87.193.134]
?>
Tämän jälkeen tarkoituksena oli luoda mahdollisuus PHP-koodin ajamiseen ohjemiston avulla, ja laittaa Apache tunnistamaan PHP-tiedostoja.
Asensin siis PhpMyAdmin-ohjelmiston, mutta tehtävänannon muutoksen johdosta keskityin tekemään eri tehtäväkokonaisuuksia, ja palaan tähän asennukseen todennäköisesti myöhemmin.
Lisäksi tein ensimmäistä kohtaa labraluokassa 5004 (Pasila) 06.02.2020, kello 08:00 alkaen. Loput tehty yllä mainitulla kokoonpanolla. Huomiona kellonaika on Xubuntussa kaksi (2) tuntia jäljessä Suomen ajasta.
Lisäksi käytössäni oli Xubuntu 18.04.3 Live-USB -tikku, jolla pääsin kokeilemaan Apachen toimintaa ja erilaisia komentoja Xubuntun sisällä terminaalin avulla.
Tehtävä A + H)
Apachen asentaminen meni mutkattomasti. Ajoin ensiksi komennot sudo apt-get update ja sudo apt-get upgrade, jonka jälkeen ajoin komennon setxkbmap fi näppäimistön näppärämpää käyttöä varten, suomalaisilla asetuksilla.
Seuraavaksi asensin Apachen komennolla sudo apt install apache2, jonka jälkeen tarkistin version ja verifioin installaation komennolla apache2 -version, jolloin terminaali näytti seuraavaa:
Server version: Apache/2.4.29 (Ubuntu)
Server built: 2019-09-16T12:58:48
Logit ilmestyivät var/log/apache2 -polkuun, ja kaikki näytti toimivan kuten pitää, ilman virheilmoituksia. Seuraavaksi tein Apacheen hieman konfigurointimuutoksia oman esimerkkisivuni julkaisemiseen, nimeltä index.html. Seuraavaksi avaan ufw-tulimuuriin Apachen portin 80, ja tarkistan, että Apache toimii ja on aktiivisena. (Buzdar 2018.)
Komennot:
sudo ufw app list (Listaa profiilit, joilla käytetään ohjelmistoja)
Tuloste:
Apache
Apache Full
Apache Secure
CUPS
Sallitaan ylin vaihtoehto terminaalin tulostamista vaihtoehdoista, jolloin portti 80 on auki, mutta turvallisuus serverin puolella edelleen säilyy. Muut mahdolliset vaihtoehdot luovat erilaisia suojatasoja, ja tässä työssä käytetään ylintä vaihtoehtoa. Ekaksi voidaan laittaa tulimuuri päälle sudo ufw enable, ja sen jälkeen komento:
sudo ufw allow ’Apache’
Tuloste:
Rules updated
Rules updated (v6)
Seuraavaksi ajoin komennon sudo systemctl status apache2, ja tuloste oli seurvaanalainen:
● apache2.service - The Apache HTTP Server
Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)
Drop-In: /lib/systemd/system/apache2.service.d
└─apache2-systemd.conf
Active: active (running) since Thu 2020-02-06 05:56:35 UTC; 38min ago
Main PID: 14986 (apache2)
Tasks: 55 (limit: 4915)
CGroup: /system.slice/apache2.service
├─14986 /usr/sbin/apache2 -k start
├─14987 /usr/sbin/apache2 -k start
└─14988 /usr/sbin/apache2 -k start
Feb 06 05:56:35 xubuntu systemd[1]: Starting The Apache HTTP Server...
Feb 06 05:56:35 xubuntu apachectl[14975]: AH00558: apache2: Could not reliably determine the server's fully qualified domain name, usi
Feb 06 05:56:35 xubuntu systemd[1]: Started The Apache HTTP Server.
lines 1-15/15 (END)
Tärkeimpiä kohtia ovat rivi 6 (Active: active (running)), ja Started The Apache HTTP Server. Serveri on siis käynnistetty ja Apache toimii taustalla aktiivisena. Testausta tulee tässä työssä lisää, kun omaa esimerkkisivua yritetään julkaista.
Seuraavaksi kokeilin, näkyykö Apachen defaultti-kotisivu, jolloin Apache toimii kuten pitää. Alla olevalla komennolla tarkastelin labraluokan ip-osoitetta:
hostname -I
Jolloin tietokonelabrassa tehty eka testaus (myöhemmin yllä mainitulla kannettavalla) näytti seuraavaa:
172.28.171.173 2001:708:b1:1ab::1:18b.
Kokeilin seuraavaksi avata default-sivua Apachella, jolloin nettiselaimessa (Mozilla Firefox sekä Safari omalla kannettavallani samassa laajassa verkossa) sain seuraavanlaisen ikkunan:
Tämä tarkoittaa, että yhteys saadaan Default-sivustoon, ja apache toimii, kuten oletetaan. Seuraavaksi lisää testailua, ja siirryn kokeilemaan virtuaalista hostaamista esimerkkini avulla.
Ytimenä on luoda esimerkkidomain.com sivusto, jossa on index.html tiedosto, joka sisältää hyvin simppeliä HTML-koodia, otsikkona esimerkiksi <h1>Esimerkkisivusto</h1>.
Apachessa tulee valmiina server block eli mahdollisuus samalla serverillä pitää yllä monta nettisivua. Luodaan oma esimerkkisivu polkuun xubuntu@xubuntu:/var/www komennolla:
sudo mkdir -p esimerkkidomain.com/html
Seuraavaksi annan käyttöoikeudet tiedostoihin ja kansioon komennoilla:
Virheilmoituksia ei tullut, ja seuraavaksi lisää testailua. -R 755 antaa luku-, kirjoitus- ja käyttöoikeuksia. Sudo chown tarkoittaa, että vaihdetaan käyttäjien välisiä oikeuksia, usein root-tyyppisiin toimenpiteisiin. Vaihdetaan niin sanotusti ”tiedostojen omistuneisuutta”.
Seuraavaksi luodaan nano komennolla index.html-tekstitiedosto polkuun /var/www/esimerkkidomain.com/html. Komento:
nano /var/www/esimerkkidomain.com/html/index.html ja poistutaan tekstieditorista terminaalissa komennolla CTRL + X + Y ja ENTER, kun alla oleva teksti on sidottu tekstitiedostoon:
<html>
<head>
<title>Tervetuloa esimerkkisivulleni - Arttu Kesanto!</title>
</head>
<body>
<h1>Toimii kuten pitää, jos näet tämän sivun. Jee!</h1>
</body>
</html>
Seuraavaksi luodaan vielä oma virtual host asetustiedosto testailun vuoksi ohjeiden (Buzdar 2018) mukaan, ja luodaan tiedosto ja sinne sisälle seuraavaa tekstiä:
<VirtualHost *:80>
ServerAdmin admin@esimerkkidomain.com. // Kannattaa kiinnittää // huomiota adminiin!
ServerName esimerkkidomain.com
ServerAlias www.esimerkkidomain.com
DocumentRoot /var/www/esimerkkidomain.com/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
Seuraavaksi laitetaan uusi, juuri luotu konfigurointitiedosto käyttöön työkalulla a2 komennolla:
sudo a2ensite esimerkkidomain.com.conf
, ja tämän jälkeen restartoidaan ja otetaan käyttöön uusi filu komennolla (poistetaan vanha sivu käytöstä):
sudo a2dissite 000-default.conf
Tämän jälkeen vielä tarkistetaan syntax komennolla:
sudo apache2ctl configtest
(Vastauksena tulee Syntax OK)
echo "ServerName esimerkkidomain.com" | sudo tee /etc/apache2/conf-available/servername.conf
Ja sitten vielä uudestaan:
sudo a2enconf servername
Kokeiltu vielä sivua osoitteessa http://esimerkkidomain.com, ja HTML-teksti näkyy, kuten pitää. Toiminnallisuus kunnossa ilman virheilmoituksia Virtual Hostin ja DomainServerin kohdilta.
Lisäksi on mahdollista, että joudutaan muokkaamaan kansiossa /etc/hosts olevia viittauksia sivustojen nimiin, eli kirjoitetaan terminaaliin sudoedit hosts polussa user/etc/, ja laitetaan localhostin sekä mahdollisten muiden IP-osoitteiden alle viittaukset oman koneen IP-osoitteeseen ja sivustojen nimiin, jotka on määritelty .conf-tiedostoissa sites-available -kohdassa.Esimerkiksi: {my-ip} arttukesanto.com, {my-ip} http://www.arttukesanto.com.
Tehtävä B)
Tarkoituksena oli tutkia erilaisia sivulatauksia.
Tehdään tämä tehtävä yksinkertaisemmalla pohjalla eli luodaan sudo a2enmod userdir ja katsotaan, mitä ilmoituksia saadaan. Asennetaan apache, asetetaan palomuuri, kokeillaan nettisivuja toiminnassa. Tehdään pari sivulatausta, ja katsotaan lokeja:
304-ilmoituksia näkyy kaikissa kolmessa kohdassa, eli lataus on onnistunut. Selain ymmärtää ei-muokatun ja mahdollisesti selaimen säilytetyn osoitteen, ja sivusto toimii. Vaikka 304 on sinänsä luokiteltu ”error”, se ei tarkoita, että sivu ei latautuisi – hyvin usein sivua vain päivitetään, ja sisältö ei ole muuttunut, tai osoite on pysynyt samana. Hostname ja osoite näkyvät ensimmäisenä, jonka jälkeen kerrotaan käyttöjärjestelmästä ja Gecko-selainmoottorista. 304 on itsessään statuskoodi (HTTP) ja seuraava luku tavukoko tulevalle vastaukselle. Lisäksi terminaalin tulosteessa näkyy kellonajat ja aikavyöhyke.
Lisäksi onnistuneita sivulatauksia 200 koodilla sain aikaiseksi lataamalla joko Apachen default-sivua, tai default-sivun korvaavaa index.html tiedostoa lataamalla:
Kuten ylempänä näkyy, koodi on ollut 403 eli yhteyttä ei ole sallittu. Tämä tapahtui, kun sudo a2enmod userdir ei ollut laitettu päälle, ja yritin avata sivustoa käyttäjän avulla polulla: [IP of the computer]/(tilde)xubuntu.
Tehtävä C)
Tehtävän tarkoituksena on tehdä virhe johonkin webbipalvelimella ajettavaan koodiin, ja analysoida tuota koodia logien perusteella. Loin virheitä sekä HTML-tiedostoon index.html, jolloin sivun asettelu ei toiminut kunnolla. Default-sivuna tietoa kuitenkin näytettiin, vaikka HTML-tagit eivät olleet kunnossa, eikä muutenkaan syntaxi ollut oikeanmukainen.
Lisäksi tein muutoksia Apachen sivun tiedostoon —apache2/sites-enabled/lollero.com.conf, jonka koodia ajetaan webbisivulla. Täten virheilmoitus oli seuraavanlainen:
Feb 06 10:04:47 xubuntu apachectl[15797]: The Apache error log may have more information. Feb 06 10:04:47 xubuntu systemd[1]: apache2.service: Control process exited, code=exited status=1 Feb 06 10:04:47 xubuntu systemd[1]: Reload failed for The Apache HTTP Server. Feb 06 10:05:00 xubuntu systemd[1]: Reloading The Apache HTTP Server. Feb 06 10:05:00 xubuntu apachectl[15804]: AH00526: Syntax error on line 3 of /etc/apache2/sites-enabled/lollero.com.conf: Feb 06 10:05:00 xubuntu apachectl[15804]: Invalid command ’ServeAlias’, perhaps misspelled or defined by a module not included in the Feb 06 10:05:00 xubuntu apachectl[15804]: Action ’graceful’ failed. Feb 06 10:05:00 xubuntu apachectl[15804]: The Apache error log may have more information. Feb 06 10:05:00 xubuntu systemd[1]: apache2.service: Control process exited, code=exited status=1 Feb 06 10:05:00 xubuntu systemd[1]: Reload failed for The Apache HTTP Server. lines 1-25/25 (END)
Kuten tekstistä näkee, komennon ServeAlias pitäisi olla kirjoitettuna ServerAlias. Apache ei täten käynnisty, ja ei pysty haluttua sivua näyttämään, koska vaaditut tiedot eivät ole saatavilla.
Tehtävä D)
Tehtävän tavoitetilana oli luoda virheitä Apachen asetustiedostoon, ja tarkastella logeja näiden virheiden tulkitsemiseksi.
Tein virheitä tiedostoon /etc/apache2/apache2.conf poistamalla tärkeitä syntaxeja, ja muuttamalla kuunneltavia portteja muotoon, jotka eivät ole oletuksia, ja joita ei ole avattu palomuurissa. Lisäksi poistin komentojen tägien päätteitä, esimerkiksi </> -päätteiden muodossa.
Virheilmoitus oli seuraavanlainen:
xubuntu@xubuntu:/etc/apache2/sites-available$ systemctl status apache2 ● apache2.service – The Apache HTTP Server Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled) Drop-In: /lib/systemd/system/apache2.service.d └─apache2-systemd.conf Active: failed (Result: exit-code) since Thu 2020-02-06 21:27:14 UTC; 20s ago Process: 16692 ExecStop=/usr/sbin/apachectl stop (code=exited, status=1/FAILURE) Process: 16697 ExecStart=/usr/sbin/apachectl start (code=exited, status=1/FAILURE) Main PID: 15227 (code=exited, status=0/SUCCESS)
Feb 06 21:27:14 xubuntu systemd[1]: Starting The Apache HTTP Server… Feb 06 21:27:14 xubuntu apachectl[16697]: apache2: Syntax error on line 150 of /etc/apache2/apache2.conf: Syntax error on line 9 of /e Feb 06 21:27:14 xubuntu apachectl[16697]: Action ’start’ failed. Feb 06 21:27:14 xubuntu apachectl[16697]: The Apache error log may have more information. Feb 06 21:27:14 xubuntu systemd[1]: apache2.service: Control process exited, code=exited status=1 Feb 06 21:27:14 xubuntu systemd[1]: apache2.service: Failed with result ’exit-code’. Feb 06 21:27:14 xubuntu systemd[1]: Failed to start The Apache HTTP Server.
[Thu Feb 06 20:51:29.645521 2020] [mpm_event:notice] [pid 15227:tid 139787582290880] AH00489: Apache/2.4.29 (Ubuntu) configured — resuming normal operations [Thu Feb 06 20:51:29.645576 2020] [core:notice] [pid 15227:tid 139787582290880] AH00094: Command line: ’/usr/sbin/apache2’ [Thu Feb 06 21:27:14.395342 2020] [mpm_event:notice] [pid 15227:tid 139787582290880] AH00491: caught SIGTERM, shutting down
Apache ei pystynyt käynnistymään ollenkaan, sillä asetustiedostot eivät olleet kunnossa. Nettisivut eivät latautuneet, ja muutenkaan toiminnallisuus ei ollut kunnossa. Virheilmoituksia tuli sekä error.log:iin (Apachen logi) ja komennolla systemctl status apache2 -komennolla.
Tehtävä I)
Erilaisia sivulatauksia, HTTP-statuksia logien mukaan:
200 ja 304 HTTP-statukset lataavat sivun, ja tiedot näytetään oikein. 304 tarkoittaa erilaisia selaimen ja palvelimen cache-muotoja, ei esimerkiksi nimi tai osoite ei ole muuttunut viime kerrasta, ja uutta cachea ei ole tapahtunut. 404 tarkoittaa statuksena NOT FOUND, ja tämä tulee esimerkiksi silloin, kun yritetään päästä sivustolle, jota ei hakemistossa ole paikallisena tiedostona.
403 tarkoittaa puolestaan forbidden eli kiellettyä statusta, ja tämä tulee logiin esimerkiksi, kun yritetään käyttää normikäyttäjän kotihakemistoa tiedostoon käsiksi pääsemiseksi selaimessa, ja Apachessa ei ole laitettu päälle asetusta a2enmd userdir.
(Tarkastelin lisäksi valmiiksi hieman LAMP-mahdollisuuksia, sekä PhpMyAdmin-ohjeita.)
Lisäksi vielä history-komennolla muutamia työvaiheita:
F)
Ideana oli tehdä hyvin yksinkertainen painoindeksi-laskuri sivulle. Helpoin tapa oli luoda tämä suoraan jo toimivaan index.html-tiedostoon <script></script> tägien sisään. Koodi oli index.html-tiedostossa seuraavanlainen:
Haluan heti tehdä huomion, että kun ajan tällä kokoonpanolla komentoa, Xubuntun versiolla 18.04.3, sudo lshw -short -sanitize, terminaali menee tietyllä tavalla jumiin, ja hetken päästä koko Live-tikku ei toimi. Kaikki muu toimii ainakin kirjoittamisen hetkellä moitteetta, joten jatkan tällä kokoonpanolla testailua. Huom! Tunnilla keskusteltujen asioiden johdosta ja muiden saman tyyppisistä ongelmista voisi luonnehtia, että kyseessä on esimerkiksi NVIDIAN tietty näytönohjain, ja esimerkiksi tämän ajuriversio. Vaatii lisää testausta, jos mahdollista.
Ennen tehtäviä ajoin Live-tikulla komennot sudo apt-get update ja sudo apt-get upgrade – näin sain ajankohtaiset package listat ja kaiken toiminnallisuuden ajan tasalle.
A + B) Tarkoituksena oli tehdä muutoksia tietokoneessa, jolloin lokiin tulee muutoksia. Xubuntulla loki (systeemilogi) löytyy polusta xubuntu@xubuntu: /var/logs (olettaen, että henkilöllä on kyseinen käyttäjä), jolloin voidaan käyttää terminaalissa esimerkiksi komentoa tail -F syslog, jolloin on mahdollista seurata viimeisimpiä tapahtumia syslogiin liittyen. Muutin myös näppäimistön asetuksen suomalaiseksi komennolla setxkbmap fi. (Luentomateriaalit Haaga-Helian Linux-palvelimet kurssin aikana 2020.)
Ensimmäinen loki-ilmoitukseni liittyi Internetin liittämiseen Wi-Fin kautta – alhaalla on kopioituna viimeisimpiä lokin (syslog) ilmoituksia tämän toimenpiteen tiimoilta. Kokeilin nettiselata Xubuntulla eri selaimilla (Chromium, Firefox), ja kaikki näytti toimivan erinomaisesti. Terminaalin seurattavaan syslogiin ei tullut mitään virheilmoituksia, ja nopeus oli kotona omassa Wi-Fi:ssäni hyvin nopea. Olen jättänyt tarkoituksella pois IP-tietoja alhaalla olevasta terminaalin ulosannista, tämä näkyy muun muassa kohdassa ##IP##. Rivit, kuten ”registering new address record for ##IP##” ja ”Started Network Manager Script Dispatcher Service” kertovat toimivuudesta, ja että kaikki on mennyt niin kuin pitää. Lisäksi kohta ”Found usable connection” ja ”Succesfully activated service…” ovat haluttuja. Viimeisimpien rivien joukossa oleva ”online”-kohta on myös toivottu.
Terminaalin tulostetta:
Jan 30 19:35:18 xubuntu dhclient[2570]: bound to 192.168.10.43 — renewal in 36401 seconds. Jan 30 19:35:18 xubuntu NetworkManager[1419]: [1580412918.7974] device (wlo1): state change: ip-config -> ip-check (reason ’none’, sys-iface-state: ’managed’) Jan 30 19:35:18 xubuntu whoopsie[1957]: [19:35:18] Cannot reach: https://daisy.ubuntu.com Jan 30 19:35:18 xubuntu NetworkManager[1419]: [1580412918.7979] device (wlo1): state change: ip-check -> secondaries (reason ’none’, sys-iface-state: ’managed’) Jan 30 19:35:18 xubuntu NetworkManager[1419]: [1580412918.7980] device (wlo1): state change: secondaries -> activated (reason ’none’, sys-iface-state: ’managed’) Jan 30 19:35:18 xubuntu NetworkManager[1419]: [1580412918.7981] manager: NetworkManager state is now CONNECTED_LOCAL Jan 30 19:35:18 xubuntu NetworkManager[1419]: [1580412918.7990] manager: NetworkManager state is now CONNECTED_SITE Jan 30 19:35:18 xubuntu NetworkManager[1419]: [1580412918.7990] policy: set ’Internetti (Arttu K.)’ (wlo1) as default for IPv4 routing and DNS Jan 30 19:35:18 xubuntu NetworkManager[1419]: [1580412918.7992] device (wlo1): Activation: successful, device activated. Jan 30 19:35:18 xubuntu dbus-daemon[1392]: [system] Activating via systemd: service name=’org.freedesktop.nm_dispatcher’ unit=’dbus-org.freedesktop.nm-dispatcher.service’ requested by ’:1.15’ (uid=0 pid=1419 comm=”/usr/sbin/NetworkManager –no-daemon ” label=”unconfined”) Jan 30 19:35:18 xubuntu NetworkManager[1419]: [1580412918.7996] manager: NetworkManager state is now CONNECTED_GLOBAL Jan 30 19:35:18 xubuntu systemd[1]: Starting Network Manager Script Dispatcher Service… Jan 30 19:35:18 xubuntu whoopsie[1957]: [19:35:18] The default IPv4 route is: /org/freedesktop/NetworkManager/ActiveConnection/2 Jan 30 19:35:18 xubuntu whoopsie[1957]: [19:35:18] Not a paid data plan: /org/freedesktop/NetworkManager/ActiveConnection/2 Jan 30 19:35:18 xubuntu whoopsie[1957]: [19:35:18] Found usable connection: /org/freedesktop/NetworkManager/ActiveConnection/2 Jan 30 19:35:18 xubuntu dbus-daemon[1392]: [system] Successfully activated service ’org.freedesktop.nm_dispatcher’ Jan 30 19:35:18 xubuntu systemd[1]: Started Network Manager Script Dispatcher Service. Jan 30 19:35:18 xubuntu nm-dispatcher: req:1 ’up’ [wlo1]: new request (1 scripts) Jan 30 19:35:18 xubuntu nm-dispatcher: req:1 ’up’ [wlo1]: start running ordered scripts… Jan 30 19:35:18 xubuntu nm-dispatcher: req:2 ’connectivity-change’: new request (1 scripts) Jan 30 19:35:18 xubuntu whoopsie[1957]: [19:35:18] online Jan 30 19:35:18 xubuntu nm-dispatcher: req:2 ’connectivity-change’: start running ordered scripts… Jan 30 19:35:23 xubuntu systemd-resolved[1375]: Using degraded feature set (UDP) for DNS server ##IP##
Seuraavaksi tein ssh-demonin asennusta, sillä halusin toisen tehtävän A) kohdan olevan virheilmoitus logissa (tällä kertaa auth.log, ei syslog) väärällä salasanalla kirjautumisesta.
Ensimmäiseksi asensin ssh-demonin komennolla sudo apt-get install openssh-client. Installoin myös muita tarpeellisia tiedostoja komennolla sudo apt-get install openssh-server. Alempana terminaalin tulostetta, seuraavan kohdan jälkeen. (How to enable ssh on Ubuntu.)
Seuraavaksi tarkastin ssh-demonin tilaa komennolla sudo systemctl status ssh, ja kaikki näytti olevan kunnossa. Alhaalla terminaalin tulostetta, kun molemmat ohjelmat oli asennettu:
xubuntu@xubuntu:/$ sudo apt-get install openssh-server Reading package lists… Done Building dependency tree Reading state information… Done openssh-server is already the newest version (1:7.6p1-4ubuntu0.3). 0 upgraded, 0 newly installed, 0 to remove and 8 not upgraded. xubuntu@xubuntu:/$ sudo apt-get install openssh-client Reading package lists… Done Building dependency tree Reading state information… Done openssh-client is already the newest version (1:7.6p1-4ubuntu0.3). 0 upgraded, 0 newly installed, 0 to remove and 8 not upgraded. xubuntu@xubuntu:/$ sudo systemctl status ssh ● ssh.service – OpenBSD Secure Shell server Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled) Active: active (running) since Thu 2020-01-30 19:39:38 UTC; 5min ago Main PID: 3218 (sshd) Tasks: 1 (limit: 4915) CGroup: /system.slice/ssh.service └─3218 /usr/sbin/sshd -D
Jan 30 19:43:13 xubuntu systemd[1]: Reloading OpenBSD Secure Shell server. Jan 30 19:43:13 xubuntu sshd[3218]: Received SIGHUP; restarting. Jan 30 19:43:13 xubuntu systemd[1]: Reloaded OpenBSD Secure Shell server. Jan 30 19:43:13 xubuntu sshd[3218]: Server listening on 0.0.0.0 port 22. Jan 30 19:43:13 xubuntu sshd[3218]: Server listening on :: port 22. Jan 30 19:43:13 xubuntu systemd[1]: Reloading OpenBSD Secure Shell server. Jan 30 19:43:13 xubuntu sshd[3218]: Received SIGHUP; restarting. Jan 30 19:43:13 xubuntu systemd[1]: Reloaded OpenBSD Secure Shell server. Jan 30 19:43:13 xubuntu sshd[3218]: Server listening on 0.0.0.0 port 22. Jan 30 19:43:13 xubuntu sshd[3218]: Server listening on :: port 22. xubuntu@xubuntu:/$
Seuraavaksi tarkoituksena oli sallia palomuurin (”tulimuurin”) asetuksista ssh ja ssh:n portti. Tämä onnistui komennolla sudo ufw allow ssh. Tämä on tarpeellista tehdä, sillä Xubuntun versio 18.04 tulee ufw:n kanssa tietoturvan lisäämiseksi. Alla terminaalin tulostetta:
Seuraavaksi tarkastelin kannettavan IP-osoitetta (komennolla ip a) ja loin ssh-yhteyden Macbook Air koneeltani ssh:tä käyttäen, sillä LAN verkko oli molemmille kannettaville sama. Kaikki näytti terminaalin tulostetta myöten toimivan kuten pitää, ei virheilmoituksia. Virheilmoituksia tuli kielletystä yrittämisestä ssh-yhteydellä, sillä annoin väärän salasanan tarkoituksella useamman kerran. Terminaalin tulostetta alhaalla:
xubuntu@xubuntu:/var/log$ tail -F auth.log Jan 30 19:50:49 xubuntu sshd[15432]: Connection closed by authenticating user xubuntu 192.168.10.49 port 52289 [preauth] Jan 30 19:54:47 xubuntu passwd[16048]: pam_unix(passwd:chauthtok): authentication failure; logname= uid=999 euid=0 tty= ruser= rhost= user=xubuntu Jan 30 19:54:55 xubuntu passwd[16051]: pam_unix(passwd:chauthtok): authentication failure; logname= uid=999 euid=0 tty= ruser= rhost= user=xubuntu Jan 30 19:55:09 xubuntu passwd[16060]: pam_unix(passwd:chauthtok): authentication failure; logname= uid=999 euid=0 tty= ruser= rhost= user=xubuntu Jan 30 19:55:18 xubuntu passwd[16061]: pam_unix(passwd:chauthtok): authentication failure; logname= uid=999 euid=0 tty= ruser= rhost= user=xubuntu Jan 30 19:56:14 xubuntu passwd[16074]: pam_unix(passwd:chauthtok): password changed for xubuntu Jan 30 19:56:14 xubuntu passwd[16074]: gkr-pam: changed password for login keyring Jan 30 19:56:29 xubuntu sshd[16237]: Accepted password for xubuntu from 192.168.10.49 port 53719 ssh2 Jan 30 19:56:29 xubuntu sshd[16237]: pam_unix(sshd:session): session opened for user xubuntu by (uid=0) Jan 30 19:56:29 xubuntu systemd-logind[1411]: New session 2 of user xubuntu.
Kuva tilanteesta, kun ssh-yhteys on luoto saman LANin alla olevilla kannettavilla (huom. Macbook Airissa on valmiiksi mahdollisuus ssh-yhteyteen, asennuksia ei tarvittu, versio tarkistettu):
Lopulta vielä varmuuden vuoksi lopetin ssh-toiminnon komennolla sudo systemctl stopssh.
C) Unelmieni apt-get komento ketjuttaa pari ohjelmaa yhteen. Komento on sudo apt-get install vlc browser-plugin-vlc gedit firefox shutter gimp audacity ja alhaalla tulostetta terminaalista:
Virheilmoituksia ei tullut, sovellukset toimivat käytössä kuten piti vaikka hieman nopeahkolla testauksella, ja virheilmoituksia ei tullut auth.- eikä syslogiin.
Ideana oli itselläni luoda Raspberry Pi 3B+ -piirilevyyn asennus Ubuntu-pohjaisesta käyttöjärjestelmästä kurssia varten. Kohtasin lukuisia ongelmia, ja lopuksi päädyin käyttämään Raspbiania pohjana Raspille, sillä tämä versio toimi kaikista parhaiten ilman ongelmia.
Kokeilin asentaa Xubuntua, Ubuntu Classicia, Ubuntu Matea ja paria muuta variaatiota Ubuntusta, mutta ongelmia tuli kohdattua esimerkiksi (login mukaan) external devicen kanssa (possibly faulty SD-card… Ei virheitä asemasta kuitenkaan löytynyt), harvoin sain bootin toimimaan, mutta komennon sudo apt-get update ja sudo reboot now jälkeen Raspi jäi junnaamaan boottilogiin ja ei suostunut käynnistymään. Vihdoin löytyi ratkaisu ja jokin toimiva pohja, sillä Innovaatio- ja projektikurssin aikana tutuksi tullut Raspbian toimi 64 GB SD-kortilta niin kuin piti, ja tämän jälkeen alkoi ohjelmistojen asennus ja etäyhteyden luominen MacBook Airilta piirilevyyn luentoja ja kokeiluja varten ”täydessä Ubuntu ympäristössä”.
Käytän etäyhteyden luomiseen VNC Viewer-nimistä sovellusta (https://www.realvnc.com/en/connect/download/viewer/), ja Raspin sisäisen IP-osoitteen saa terminaalista komennolla ifconfig, ja kun tämä IP-osoite on selvillä, VNC Viewerillä yhdistäminen on helppoa salasanan ja IP-osoitteen johdolla.
Näin ollen minun täytyy vain saada Raspiin virta, antaa Raspin käynnistyä ja yhdistää VNC Viewerillä Raspbianiin etäyhteys, jolloin voin omalta MacBookin työpöydältä käyttää Raspia ja Raspbiania vaivattomasti.
Alempana vielä kuva terminaalin asennuslogeista ja setupeista, ensimmäisen bootin aikana – tämä kuva liittyy Ubuntun asentamiseen, mutta päädyin lopulta itselläni ainakin kirjoittamisen hetkellä tehokkaammin toimivaan Raspbianiin, joka on nimenomaisesti suunniteltu Raspberry Pi -piirilevyä varten.
Asennuksen jälkeen kokeilin vielä muutaman ohjelmiston asentamista – komennot olivat sudo apt-get install vlc, sudo apt-get install gimp ja sudo apt-get install gnome. Gimp toimi vaivattomasti, mutta VLC:n kanssa oli muutamia audio output virheitä, eli kodekkeja varmaan tarvitsisi vielä asennella, sillä VLC:n asennus on hyvin raaka ja puhdas, ja Raspissa ei ollut asennushetkellä ja testauksessa kiinni kaiuttimia vaan ainoastaan näyttö, hiiri ja näppäimistö.
Olen Arttu Kesanto, 26-vuotias opiskelija Haaga-Helian kampukselta Pasilasta. Tämän sivuston ideana on toimia simppelinä portfoliona ja katsauksena Linux-palvelimien kurssiin, jota pitää Tero Karvinen.
Tältä sivulta löytyy muun muassa:
Esimerkkiaineistoja ja omia kokeiluja.
Omia havaintoja ja kuvallisia näyttöjä tehtävien tekemisestä.