Harjoitustehtävän aiheena oli nimipohjaisten “virtuaalipalvelimien” (name based virtual host) määritteleminen Apache HTTP palvelimella.
Harjoituksessa määriteltiin neljä virtuaalipalvelinta, joille annettiin erilaisia asetuksia liittyen PHP:n käyttöön sekä automaattiseen
hakemistolistaukseen. Lisäksi tutkittiin Apachen lokitiedostoista erilaisia HTTP statuskoodeja.
Harjoitusympäristö
Harjoitus suoritettiin 23.09.2012 opiskelijan kotona käyttäen henkilökohtaista tietokonetta. Internet-yhteytenä oli Elisa Oyj:n tarjoama VDSL tyyppinen 100/10 mbit kiinteä laajakaistayhteys. Harjoituksessa käytettiin Lenovo R60 kannettavaa tietokonetta, johon oli asennettu Xubuntu versio 12.04 32-bittinen Linux käyttöjärjestelmä.
Lenovo R60 kokoonpano:
- Suoritin: Intel Core 2 Duo T56000 @1.83 Ghz
- Keskusmuisti: 4 Gt DDR2
- Kiintolevy: 100 Gt SATA150 54000rpm
- Käyttöjärjestelmä: Xubuntu versio 12.04 32-bittinen
Virtuaalipalvelimen määrittely Apache palvelimessa
Aloitin harjoitustehtävän tekemisen päivittämällä Ubuntun pakettivarastot komennolla:
$sudo apt-get update
Pakettivarastojen päivitys kesti muutamia sekunteja.
Apache palvelin oli jo valmiiksi asennettuna koneella ja siihen oli otettu käyttöön käyttäjäkohtaiset public_html kansiot. Tein omaan kotihakemistooni kansion Apachen “virtuaalipalvelinta” varten komennolla:
$mkdir ~/public_html/eliimatt.com
Seuraavaksi siirryin muokkaamaan /etc/hosts tiedostoa komennolla:
$sudo nano /etc/hosts
Määrittelin /etc/hosts tiedostoon “virtuaalipalvelimen” nimitiedot lisäämällä rivit:
192.168.xxx.xxx www.eliimatt.com
192.168.xxx.xxx eliimatt.com
Määrittelyn mukaan “www.eliimatt.com” ja “eliimatt.com” viittaavat harjoitusympäristön tietokoneen paikalliseen IP-osoitteeseen.
Seuraavaksi ryhdyin muokkaamaan Apache:n asetustiedostoja. Siirryin Apache:n asetuskansioon sites-available, johon Apachen “virtuaalipalvelimet” määritellään:
$cd /etc/apache2/sites-available/
Tein Apachen oletuspalvelimen default tiedostosta eliimatt.com nimisen kopion:
$sudo cp default eliimatt.com
Muokkasin eliimatt.com tiedostoa nano editorilla:
$sudo nano eliimatt.com
Tiedoston sisällöksi tuli:
<VirtualHost *:80>
ServerName www.eliimatt.com
ServerAlias eliimatt.com
DocumentRoot /home/eino/public_html/eliimatt.com
</VirtualHost>
Apachen asetusdirektiivit tarkoittavat seuraavaa:
• VirtualHost lohkon sisällä on varsinainen “virtuaalipalvelimen” määrittely. Asteriskimerkki * merkitsee kaikkia tietokoneen IP-osoitteita ja “:80″ TCP porttia 80, josta tämä “virtuaalipalvelin” ottaa vastaan HTTP liikennettä.
• ServerName on “virtuaalipalvelimen” nimi, jolle osoitettuun HTTP liikenteeseen tämä virtuaalipalvelin “vastaa”.
• ServerAlias on “virtuaalipalvelimen” vaihtoehtoinen nimi, johon “virtuaalipalvelin” myös reagoi.
• DocumentRoot viittaa tiedostojärjestelmän polkuun, jossa “virtuaalipalvelimen” sisältö sijaitsee.
Seuraavaksi tein testisivun “virtuaalipalvelimelle” komennolla:
$sudo nano ~/public_html/eliimatt.com/index.html
Tiedosto sisällön pohjana käytettiin Tero Karvisen lyhyttä HTML5 testisivua:
<!doctype html>
<html>
<head>
<title>www.eliimatt.com</title>
<meta charset="utf-8" />
</head>
<body>
<h1>www.eliimatt.com</h1>
<p>Terve, maailma! Tämä on Apachen nimipohjainen "virtuaalipalvelin"</p>
</body>
</html>
Tämän jälkeen otin käyttöön uuden “virtuaalipalvelimen” komennolla:
$sudo a2ensite eliimatt.com
Käynnistin Apache palvelimen uudelleen komennolla:
$sudo service apache2 reload
Testasin “virtuaalipalvelimen” toimivuutta Firefox selaimessa avaamalla osoitteen “www.eliimatt.com” sekä “eliimatt.com”:
Testi osoitti, että “virtuaalipalvelin” toimii molemmilla nimillään.
PHP:n asentaminen Apache palvelinta varten
Asensin PHP:n komennolla:
$sudo apt-get install libapache2-mod-php5
Seuraavaksi muutin Apachen PHP lisäosan asetuksia niin, että PHP:tä voidaan ajaa käyttäjäkohtaisesta public_html kansiosta:
$sudo nano /etc/apache2/mods-enabled/php5.conf
Asetustiedostosta kommentoitiin ulos seuraavat rivit lisäämällä rivien alkuun ristikkomerkki #:
<IfModule mod_userdir.c>
<Directory /home/*/public_html>
php_admin_value engine Off
</Directory>
</IfModule>
Käynnistin Apache palvelimen uudelleen komennolla:
$sudo service apache2 reload
Testakseni PHP:n toimivuutta, tein kotihakemistoni public_html kansioon index.php tiedoston komennolla:
$nano ~/public_html/index.php
Tiedoston sisällöksi tuli:
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">
<?php
print_r('<h1>Terve maailma</h1>');
print_r('<p>Käyttämäsi selaimen tiedot:</p>');
echo $_SERVER['HTTP_USER_AGENT'] . "\n\n";
?>
Seuraavaksi avasin Firefox selaimessa osoitteen “localhost/~eino”:
Testi osoitti, että PHP sivut toimivat käyttäjäkohtaisessa public_html kansiossa.
Virtuaalipalvelinten lisääminen Apachen käyttöön
Harjoitustehtävää jatkettiin ottamalla käyttöön lisää Apachen virtuaalipalvelimia. Tehtävänä oli määrittää virtuaalipalvelin,jossa voitiin suorittaa PHP koodia sekä toinen, jossa se oli kiellettyä. Palautin aikaisemmin tekemäni Apachen PHP lisäosaan tekemäni asetuksen, joka salli käyttäjäkohtaisessa public_html kansiossa ajettavan PHP koodin. Tein kaksi uutta virtuaalipalvelinta tätä tarkoitusta varten samalla tavoin kuin ensimmäisenkin. Lisäsin molempien virtuaalipalvelimien asetustiedostoihin <Directory> lohkon, jossa määriteltiin PHP kieltäminen tai salliminen asetusdirektiivillä php_admin_value engine Off/1(On):
1. Virtuaalipalvelin nonphp.com – PHP koodin suoritus kielletty
Sisältökansion luominen:
$mkdir ~/public_html/nonphp.com
Nimitiedot /etc/hosts tiedostossa:
192.168.xxx.xxx www.nonphp.com
192.168.xxx.xxx nonphp.com
/etc/apache2/sites-available/nonphp.com tiedoston sisältö:
<VirtualHost *:80>
ServerName www.nonphp.com
ServerAlias nonphp.com
DocumentRoot /home/eino/public_html/nonphp.com
<Directory /home/eino/public_html/nonphp.com>
php_admin_value engine Off
</Directory>
</VirtualHost>
Käyttöön ottaminen komennolla:
$sudo a2ensite nonphp.com
2. Virtuaalipalvelin phpsite.com – PHP koodin suoritus sallittu
Sisältökansion luominen:
$mkdir ~/public_html/phpsite.com
Nimitiedot /etc/hosts tiedostossa:
192.168.xxx.xxx www.phpsite.com
192.168.xxx.xxx phpsite.com
/etc/apache2/sites-available/phpsite.com tiedoston sisältö:
<VirtualHost *:80>
ServerName www.phpsite.com
ServerAlias phpsite.com
DocumentRoot /home/eino/public_html/phpsite.com
<Directory /home/eino/public_html/phpsite.com>
php_admin_value engine 1
</Directory>
</VirtualHost>
Käyttöön ottaminen komennolla
$sudo a2ensite phpsite.com
Kopioin molempiin virtuaalipalvelinten sisältökansioihin aikaisemmin tekemäni index.php tiedoston komennoilla:
$cp ~/index.php ~/nonphp.com/
$cp ~/index.php ~/phpsite.com/
Käynnistin Apache palvelimen uudelleen komennolla:
$sudo service apache2 reload
Testasin virtuaalipalvelinten PHP asetuksia Firefox selaimessa avaamalla osoitteen “www.nonphp.com” sekä “www.phpsite.com”:
Testi osoitti, että virtuaalipalvelimille määritellyt PHP asetukset toimivat kuten oli suunniteltu.
Hakemistolistauksen kieltäminen virtuaalipalvelimessa
Tein kolmannen Apache virtuaalipalvelimen, jossa estettiin automaattisen hakemistolistauksen näyttäminen kun index.html tiedostoa ei löydy. Automaattinen hakemistolistaus estetetään asetusdirektiivillä Options -Indexes.
3. Virtuaalipalvelin noindex.com – automaattinen hakemistolistaus estetty
Sisältökansion luominen:
$mkdir ~/public_html/noindex.com
Nimitiedot /etc/hosts tiedostossa:
192.168.xxx.xxx www.noindex.com
192.168.xxx.xxx noindex.com
/etc/apache2/sites-available/noindex.com tiedoston sisältö:
<VirtualHost *:80>
ServerName www.noindex.com
ServerAlias noindex.com
DocumentRoot /home/eino/public_html/noindex.com
<Directory /home/eino/public_html/noindex.com>
Options -Indexes
</Directory>
</VirtualHost>
Käyttöön ottaminen komennolla
$sudo a2ensite noindex.com
Käynnistin Apache palvelimen uudelleen komennolla:
$sudo service apache2 reload
En tehnyt virtuaalipalvelimen sisältökansioon mitään tiedostoja. Testasin virtuaalipalvelinta avaamalla Firefox selaimessa osoitteen “www.noindex.com”:
Testi osoitti, että virtuaalipalvelimen asetukset estivät automaattisen hakemistolistauksen tekemisen.
HTTP statukset lokitiedostossa
HTTP Status 200 – OK
• Avasin Firefox selaimella osoitteen “www.eliimatt.com”. Sivu latautui normaalisti:
Lokitiedosto /var/log/apache2/other_vhosts_access.log sisältää merkinnän:
eliimatt.com:80 192.168.100.102 - - [24/Sep/2012:00:07:38 +0300] "GET / HTTP/1.1" 200 517 "-" "Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:15.0) Gecko/20100101 Firefox/15.0.1"
Osoite eliimatt.com viittaa virtuaalipalvelimen nimeen. GET / viittaa HTTP pyyntöön, jolla pyydetään juuridokumenttia kun erillistä sivua ei ole määritelty selaimen osoiterivillä. 200 viittaa HTTP statukseen, joka kertoo että sivupyyntöön on vastattu onnistuneesti. Loppuosassa näkyvät selaimen tiedot.
HTTP Status 404 – Not Found
• Avasin Firefox selaimella osoitteen “www.eliimatt.com/omasivu”. Selain ilmoitti, että sivua ei löydy:
Lokitiedosto /var/log/apache2/other_vhosts_access.log sisältää merkinnän::
eliimatt.com:80 192.168.100.102 - - [24/Sep/2012:00:23:45 +0300] "GET /omasivu HTTP/1.1" 404 503 "-" "Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:15.0) Gecko/20100101 Firefox/15.0.1"
Osoite eliimatt.com viittaa virtuaalipalvelimen nimeen. GET /omasivu viittaa HTTP pyyntöön, jolla pyydetään omasivu nimistä dokumenttia. 404 viittaa HTTP statukseen, joka kertoo että sivua ei löydy. Loppuosassa näkyvät selaimen tiedot.
HTTP Status 403 – Forbidden
• Avasin Firefox selaimella osoitteen “www.noindex.com”. Selain ilmoitti, että oikeudet sivun avaamiseen puuttuvat:
Lokitiedosto /var/log/apache2/other_vhosts_access.log sisältää merkinnän::
www.noindex.com:80 192.168.100.102 - - [24/Sep/2012:00:37:59 +0300] "GET / HTTP/1.1" 403 499 "-" "Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:15.0) Gecko/20100101 Firefox/15.0.1"
Osoite eliimatt.com viittaa virtuaalipalvelimen nimeen. GET / viittaa HTTP pyyntöön, jolla pyydetään juuridokumenttia kun erillistä sivua ei ole määritelty selaimen osoiterivillä.. 403 viittaa HTTP statukseen, joka kertoo että oikeudet sivun avaamiseen puuttuvat. Loppuosassa näkyvät selaimen tiedot.
HTTP Status 500 – Internal Server Error
• Tein “huonoa” koodia sisältävän PHP tiedoston badcode.php, jonka sisältö oli:
<?php echo !"#%; ?>
Kopioin tiedoston kotihakemistoni ~/public_html/phpsite.com kansioon. Avasin Firefox selaimella osoitteen “www.phpsite.com/badcode.php”. Selain näytti vain tyhjää ikkunaa:
Lokitiedosto /var/log/apache2/other_vhosts_access.log sisältää merkinnän::
phpsite.com:80 192.168.100.102 - - [24/Sep/2012:01:08:14 +0300] "GET /badcode.php HTTP/1.1" 500 275 "-" "Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:15.0) Gecko/20100101 Firefox/15.0.1"
Osoite eliimatt.com viittaa virtuaalipalvelimen nimeen. GET /badcode.php viittaa HTTP pyyntöön, jolla pyydetään badcode.php nimistää dokumenttia. 500 viittaa HTTP statukseen, joka kertoo että sivun lataamisessa sattui serverin sisäinen virhe. Loppuosassa näkyvät selaimen tiedot.
Lähteet
The Apache Software Foundation 2012. Apache HTTP Server Version 2.4 Documentation.
http://httpd.apache.org/docs/2.4/
Cohen, James 2011. How to Avoid Character Encoding Problems in PHP.
http://webmonkeyuk.wordpress.com/2011/04/23/how-to-avoid-character-encoding-problems-in-php/
Edwards, Christer 2008. Setting Up Name Based Virtual Hosting.
http://ubuntu-tutorials.com/2008/01/09/setting-up-name-based-virtual-hosting/
Emphatic Nonsense 2011. Enabling Apache’s PHP execution in User Directories on Ubuntu Lucid.
http://emphaticnonsense.com/2011/10/06/enabling-apache-php-execution-in-user-directories-on-ubuntu-lucid/
Karvinen, Tero 2012a. Short HTML5 page.
http://terokarvinen.com/2012/short-html5-page
Karvinen, Tero 2012b. Linux palvelimena ICT4TN003-4 kurssin kotisivu.
http://terokarvinen.com/2012/aikataulu-linux-palvelimena-ict4tn003-4-ja-ict4tn003-6-syksylla-2012
PHP Manual 2012. Runtime Configuration.
http://php.net/manual/en/apache.configuration.php#ini.engine
Stackoverflow 2012. How to trigger 500 Internal Server Error in PHP?
http://stackoverflow.com/questions/8687390/how-to-trigger-500-internal-server-error-in-php
Ubuntu Community Help Wiki 2012. ApacheMySQLPHP.
https://help.ubuntu.com/community/ApacheMySQLPHP
About
Tätä dokumenttia saa kopioida ja muokata GNU General Public License (versio 2 tai uudempi) mukaisesti.
http://www.gnu.org/licenses/gpl.html
Pohjana Tero Karvisen Linux-kurssi, www.iki.fi/karvinen