Tämän julkaisun sisältö oli yksi osa Järjestelmäprojektia, jonka toteutin yhdessä toisen opiskelijan, Oliver Sirénin, kanssa.
Virtuaalipalvelin (VPS)
Palveluprototyyppi tullaan hostaamaan virtuaalipalvelimella (VPS), jonka hankimme IaaS-palveluntarjoaja DigitalOceanilta. Valitsimme DigitalOceanin siksi, että aikaisemmalla Linux-palvelimet -kurssilla käytimme kyseistä palvelua, ja se on sopivan edullinen omiin tarpeisiimme. Olimme myös tietoisia GitHub Education -paketista, joka sisälsi mm. 50 dollarin edestä credittiä palveluun. https://www.digitalocean.com/
Toinen vaihtoehto olisi hostata palvelua webhotellissa, mutta virtuaalipalvelin antaa meille parhaat hallintamahdollisuudet. DigitalOcean käyttää pilvipalvelussaan virtuaalipalvelimistaan nimistystä ”droplet”. Hankimme tällaisen dropletin konfiguroiden sen seuraavasti:
- Nimi: jprojekti-ubuntu
- Sijainti: Frankfurt (FRA1)
- IPv4-osoite: 138.68.98.9
- Käyttöjärjestelmä: Ubuntu 16.04.2 x64
- Prosessoriytimiä: 1
- Keskusmuistia: 512 Mt
- Tallennustilaa: 20 Gt
Jatkuvalla käytöllä palvelin kustantaa meille 5€ kuukaudessa.
Domain-nimi NameCheapilta
Sivuston domain-nimen vuokrasimme Namecheap:iltä. Vuokrausta varten loimme käyttäjätunnukset palveluun, jonka jälkeen etsimme vapaista nimistä itsellemme sopivan. https://www.namecheap.com/.
Vuokrattavaksi nimeksi otettiin: dc-jarjestelmaprojekti.info. Tämä paristakin syystä:
- Emme ole oikeasti kehittämässä tästä liiketoimintaa, vaan toteutamme tätä projektia harjoitustyönä. Palvelulle oli sen kehityksen aikana annettu nimi Desktop Customs, mutta pari domain-nimen variaatiota oli jo jonkun omistuksessa. Emme halua aiheuttaa konfliktia kenenkään kanssa, joten meille riittää tämä melko epämääräinen nimi.
- Nimet vuokrataan vähintään yhdeksi vuodeksi. Vähemmän yksityiskohtainen nimi helpottaa kyseisen nimen uudelleenkäyttöä tarvittaessa esimerkiksi toisessa projektissa.
- .info-pääte oli huomattavasti halvempi verrattuna .fi tai .com-päätteisiin. Mainittakoon toki, että oikean yrityksen kohdalla haluttaisiin ottaa tunnetumpi domain-pääte.
Nimen kustannukseksi koitui 0,82€ vuodessa, mikä on erittäin halpaa. Verrattuna esimerkiksi .com-päätteinen nimi olisi maksanut 10€ vuodessa. Huomattava on, että nimiä vuokrattaessa tulee aina muistaa uusia omat oikeudet kyseiseen nimeen, sillä muuten sen voi menettää. Vuokraustilanteessa voi valita vuokrauksen suoraan useammaksi vuodeksi kerrallaan. Käyttäjätilin hallinnasta voi myös lisätä vuosia jo vuokrattuun nimeen tai nimen uusimisen voi kokonaan automatisoida, mikä on hyvin suositeltavaa oikeassa tapauksessa. Nimen lisäksi voi vuokrata ylimääräisiä palveluita, kuten PremiumDNS, joka tarjoaa mm. suojausta palvelunestohyökkäyksiä varten.
Nimen osoittaminen palvelimeen
Aivan ensimmäisenä meidän tuli osoittaa vuokraamamme Domain-nimi virtuaalipalvelimeemme, jotta käyttäjät löytäisivät sen helpommin tarvitsematta IP-osoitetta. Menimme NameCheap-profiiliimme, josta valitsimme vuokraamamme domain-nimen muokattavaksi.
Nimipalvelinasetusten kohdalla valitsimme ”Custom DNS”, jonka jälkeen lisäsimme vaadittavat ohjaukset DigitalOceanin nimipalvelimiin seuraavasti:
Tämän jälkeen siirryimme DigitalOceaniin palvelimemme hallintatyökaluihin. Sieltä navigoimme osastoon ”Networking”, jossa lisäsimme oman domain-nimemme seuraavan näköiseen kenttään:
Tämän jälkeen tuli luoda uusi A Record, jossa määriteltiin palvelimemme IP-osoite, jolla haluamme domain-nimeä hostata:
Siirto voi viedä jonkin aikaa, joten siirryimme eteenpäin työskentelemään palvelimen parissa.
LAMP palvelimelle (Linux, Apache, MySQL ja PHP)
Ensiksi seuraavat alustavat toimet:
SSH-yhteys ja Root-tunnusten sulkeminen
Aloitimme palvelimella työskentelemisen Haaga-helian laboratorioluokassa 5005 Xubuntu 16.04.2 LTS käyttöjärjestelmällä. Alustavina toimina asensimme tietokoneelle SSH:n, jotta pääsimme palvelimeen etäyhteydellä käsiksi. Tätä ennen kuitenkin päivitimme pakettivarastot ennen paketinhallinnan hyödyntämistä SSH:n asennukseen.
$ sudo apt-get update $ sudo apt-get install ssh
Aivan ensimmäisenä otimme SSH-yhteyden virtuaalipalvelimeemme DigitalOceanin antamin root-tunnuksin terminaalin komennolla:
$ ssh root@138.68.98.9
Vaihdoimme DigitalOceanin antaman root-salasanan, vaikka emme sitä enää tulekaan jatkossa käyttämään turvallisuussyistä. Loimme uuden käyttäjätunnuksen, jolle annoimme hyvän salasanan. Käyttäjä liitettiin myös sudo- ja adm-ryhmiin, jotta voimme suorittaa komentoja pääkäyttäjäoikeuksin.
$ sudo adduser markus $ sudo adduser markus sudo $ sudo adduser markus adm
Kirjauduimme ulos root-käyttäjän SSH-yhteydestä komennolla $ exit, jonka jälkeen kokeilimme kirjautua palvelimelle uudella tunnuksella:
$ ssh markus@46.101.199.190
Koska kirjautuminen onnistui toivotusti, seuraavaksi poistimme DigitalOceanin myöntämät root-tunnukset kokonaan pois käytöstä. Tämä tehtiin turvallisuussyistä, sillä haluamme, että ainoastaan tuolla meidän luomallamme uudella ”markus”-käyttäjällä on käyttöoikeuksia palvelimella. Ollessamme SSH-yhteydessä omalla käyttäjällämme, lukitsimme root-tunnukset terminaalin komennolla:
$ sudo usermod --lock root.
^ Huomaa, että ylläolevassa komennossa on kaksi väliviivaa. WordPressillä on satunnaisesti tapana näyttää se väärin.
Testasimme vielä kirjautua root-tunnuksin, mikä ei tarkoituksenmukaisesti onnistunut.
Palomuuri palvelimelle (UFW)
Tietoturvan takia haluamme hallinnoida sisään- ja ulosmenevää liikennettä palomuurilla. Oletustyökalu palomuurin konfigurointiin Xubuntussa on ufw, mutta se ei ole oletuksena otettu käyttöön. Ennen palomuurin käyttöönottoa meidän tuli kuitenkin sallia portti 22:n (SSH) liikenne sisäänpäin, jotta emme vahingossa lukitse itseämme palvelimelta, kun otamme palomuurin käyttöön. Sallimme samalla myös HTTP-portin 80 sisään menevän liikenteen.
$ sudo ufw allow 80/tcp Rules updated Rules updated (v6) $ sudo ufw allow 22/tcp Rules updated Rules updated (v6)
Tämän jälkeen otimme palomuurin käyttöön komennolla: $ sudo ufw enable.
Kuten alla olevan komennon tulostuksesta nähdään, palomuuri estää oletuksena kaiken sisääntulevan liikenteen ja sallii kaiken ulosmenevän liikenteen. Tällä hetkellä ssh- ja http-liikenne sallitaan kuitenkin sisäänpäin tekemiemme sääntöpäivitysten vuoksi:
$ sudo ufw status verbose Status: active Logging: on (low) Default: deny (incoming), allow (outgoing), disabled (routed) New profiles: skip To Action From -- ------ ---- 80/tcp ALLOW IN Anywhere 22/tcp ALLOW IN Anywhere 80/tcp (v6) ALLOW IN Anywhere (v6) 22/tcp (v6) ALLOW IN Anywhere (v6)
Apache webpalvelin
Voidaksemme hostata verkkosivustoa virtuaalipalvelimeltamme, tarvitsimme webpalvelimen. Tätä varten asensimme Apachen:
$ sudo apt-get install apache2
Nyt, kun navigoimme selaimella palvelimen IP-osoitteeseen http://138.68.98.9/, saimme seuraavan näkymän:
Kyseessä on Apachen oletussivu, joka tarkoittaa, että palvelinohjelma toimii. Hetken odottelun jälkeen myös selainhaku toimi myös domain-nimellämme, kun aikaa oli kulunut tarpeeksi nimen ohjauksesta.
Apachen lokitiedot löytyivät hakemistosta /var/log/apache2/. Komento $ ls listasi sijainnin kaikki eri lokit, joita olivat: access.log, error.log, other_vhosts_access.log
Kyseisistä lokeista tarkastelimme access.log:ia, josta näimme kaikki tekemämme yhteydenotot palvelimelle, kun esimerkiksi päivitimme selainta:
$ tail -F /var/log/apache2/access.log
MySQL-tietokanta
Vaikka tämänhetkinen palveluprototyyppimme ei hyödynnäkään MySQL-tietokantaa, olemme kuitenkin luomassa sopivaa ja perusteellista webkehitys- ja ylläpitoympäristöä, johon MySQL sopisi erinomaisesti. Asensimme tietokannan ja clientin palvelimelle komennolla:
$ sudo apt-get install mysql-server mysql-client
Sitten keksittiin uusi monimutkainen root-salasana MySQL:n root-tunnuksille, jatkettiin eteenpäin. MySQL:n root-käyttäjällä ei ole tekemistä itse käyttöjärjestelmän root-käyttäjän kanssa. Salasanan vaihdon jälkeen kirjauduimme MySQL root-käyttäjälle komennolla $ mysql -u root -p ja syöttämällä salasanan. Pääsimme sisään ja MySQL oli valmiina käytettäväksi.
PHP-ohjelmointikieli
PHP on ohjelmointikieli, joka prosessoi koodia näyttääkseen dynaamista sisältöä. Sillä voidaan esimerkiksi suorittaa skriptejä tai yhdistää MySQL-tietokantaan tiedonhakua varten. Prototyypin kannalta tämä ei ole tarvittava, mutta se olisi oleellinen komponentti palvelua kehitettäessä pitemmälle. Näin ollen on sopivaa asentaa se jo tässä vaiheessa, jolloin saadaan myös koko LAMP-pino kasaan.
$ sudo apt-get install libapache2-mod-php
PHP on asennettu, mutta sen toimivuus voidaan vielä helposti varmistaa luomalla tiedosto nimetä info.php palvelimen hakemistoon /var/www/html/.
$ sudo nano /var/www/html/info.php
Tiedostoon kirjoitettiin seuraava koodinpätkä:
Nyt, kun navigoimme selaimella osoitteeseen dc-jarjestelmaprojekti.info/info.php, saamme alla olevan näkymän. PHP on asentunut oikein ja toimii palvelimella. LAMP on nyt asennettu. Lopuksi vielä käynnistimme Apachen uudelleen terminaalin komennolla:
$ sudo service apache2 restart
Huomaa, että normaalisti Apachea ei kannata käynnistää uudelleen turhaan, koska se heittäisi mm. asiakkaat takaisin etusivulle kesken tilauksen, ja tyhjentäisi heidän ostoskorinsa. Tämä todennäköisesti ajaisi asiakkaat muualle.
Lähteet:
DigitalOcean 2017. Virtuaalipalvelin. URL: https://www.digitalocean.com/.
NameCheap 2017. Domain-nimiä. URL: https://www.namecheap.com/.
DigitalOcean 2012. How to set up a host name with DigitalOcean. URL: https://www.digitalocean.com/community/tutorials/how-to-set-up-a-host-name-with-digitalocean. Luettu 2.4.2017.
DigitalOcean 2014. How to launch your site on a new ubuntu 14.04 server with LAMP, SFTP and DNS. URL: https://www.digitalocean.com/community/tutorials/how-to-launch-your-site-on-a-new-ubuntu-14-04-server-with-lamp-sftp-and-dns. Luettu: 2.4.2017
Markus Pyhäranta 2016. Linux palvelimet – LAMP. URL: https://markuspyharanta.wordpress.com/2016/10/10/harjoitus-3/. Luettu: 4.4.2017.
Markus Pyhäranta 2016. Linux palvelimet – Virtuaalipalvelin VPS. URL: https://markuspyharanta.wordpress.com/2016/10/10/harjoitus-4/. Luettu: 4.4.2017.
Markus Pyhäranta 2016. Linux palvelimet – Muistiinpanoja. URL: https://markuspyharanta.wordpress.com/muistiinpanoja/. Luettu: 4.4.2017.
Pingback: Varnish-käänteisproxy ja webpalvelimen suorituskyvyn testaus ApacheBenchmark:illa – Markus Pyhäranta