Avainsanaan ‘HTTP Status code’ liitetyt artikkelit

Harjoitustehtävä 5: Apache

24.9.2012

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
        &lt/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
        &lt/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


Seuraa

Get every new post delivered to your Inbox.