Apache, nimipalvelimet porteille, virtuaalinimipalvelimet (korjattu) ja hyvät käytännöt.
*Korjattu 11.2.2025 - Virtual name base system asennettu väärin portteihin
• Name-based Virtual Hosting mahdollistaa usean verkkosivuston yhden IP-osoitteen alla.
• Edellyttää Apache2:n asennusta ja konfigurointia
• Jokainen sivusto vaatii oman VirtualHost-määrittelyn
Hyödyt:
• Kustannustehokas tapa hostata useita sivustoja
• Helppo ylläpitää
• Skaalautuva ratkaisu pienille ja keskisuurille projekteille
Moi maailma ja apache-serveri alustana -kahdella sisänimellä ja kahdella sivustolla.
Vanhojen pakettien poisto ja tehtävän alustus
Aloitetaan perinteisillä keinoilla, eli päivitetään paketit ja poistetaan vanha apache serveri, asetukset ja käyttäjätiedot. Ihan selkeyden vuoksi.
sudo apt-get update
Tähän väliin suljetaan mahdollinen juokseva kokonaisuus.
sudo systemctl stop apache2
Purge komennolla poistetaan kokonaisuus ihan käyttäjä-asetukset mukaanlukien.
sudo apt purge apache2 apache2-utils apache2-bin apache2-data
Poistetaan myös turhat riippuvuudet ja kotikansiosta vanhat sivustot.
sudo apt autoremove
rm -rf public_html/*
Ja vielä lopputarkistus, että apache2 paketteja ei paikalla
dpkg -l | grep apache2

Aloitetaan alusta ja asennetaan apache serveri!
sudo apt install apache2
Luodaan kansiot kahdelle sivustolle kotikansioon /public_html/ nimillä laiskottelu ja rapsuttelu
mkdir -p /home/henry/public_html/laiskottelu;
mkdir -p /home/henry/public_html/rapsuttelu
Ja näihin kansioihin tehdään index.html osoittamaan mitä sisällä.
echo "<h1>Laiskottelu Sivusto</h1>" > /home/henry/public_html/laiskottelu/index.html;echo "<h1>Rapsuttelu Sivusto</h1>" > /home/henry/public_html/rapsuttelu/index.html
Meillä kaksi sivua niin meidän täytyy konfiguroida sivustot kahteen porttiin.
sudo nano /etc/apache2/ports.conf
Lisätään ’Listen 80’ alapuolelle ’Listen 81’.

Konfiguraatiot
Luodaan molemmille sivuille konfiguraatiot
sudo nano /etc/apache2/sites-available/laiskottelu.conf
sudo nano /etc/apache2/sites-available/rapsuttelu.conf
Laiskottelu asetetaan portille 80, rapsuttelu portille 81. Molemmille sivuille tehdään omat loki-paikat josta voi ottaa kopin vain kyseisen sivuston lokeista.
<VirtualHost *:80>
ServerName laiskottelu.lokaali.fi
DocumentRoot /home/henry/public_html/laiskottelu
ErrorLog ${APACHE_LOG_DIR}/laiskottelu_error.log
CustomLog ${APACHE_LOG_DIR}/laiskottelu_access.log combined
<Directory /home/henry/public_html/laiskottelu>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
<VirtualHost *:81>
ServerName rapsuttelu.lokaali.fi
DocumentRoot /home/henry/public_html/rapsuttelu
ErrorLog ${APACHE_LOG_DIR}/rapsuttelu_error.log
CustomLog ${APACHE_LOG_DIR}/rapsuttelu_access.log combined
<Directory /home/henry/public_html/rapsuttelu>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
KORJAUS 11.2.2025. Minun ohjeella saa jaettua portit osaksi, jolloin saan toimimaan eri porteissa sivut. Virtual name base - ei tarvitse tätä.
Eli
<VirtualHost *:80>
ServerName laiskottelu.lokaali.fi
DocumentRoot /home/henry/public_html/laiskottelu
ErrorLog ${APACHE_LOG_DIR}/laiskottelu_error.log
CustomLog ${APACHE_LOG_DIR}/laiskottelu_access.log combined
<Directory /home/henry/public_html/laiskottelu>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
<VirtualHost *:80>
ServerName rapsuttelu.lokaali.fi
DocumentRoot /home/henry/public_html/rapsuttelu
ErrorLog ${APACHE_LOG_DIR}/rapsuttelu_error.log
CustomLog ${APACHE_LOG_DIR}/rapsuttelu_access.log combined
<Directory /home/henry/public_html/rapsuttelu>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
Näin virtual name base toimii samassa portissa. Tästä syystä eri porteissa ’CURL osoite’ osoittaa molemmat samaan osoitteeseen seuraavissa. Jos portit halutaan erikseen ’virtual base’ ei toimi.
Loppuasetukset, nimipalvelimet ja systeemi pyörimään.
Poistetaan apachen perus-sivusto\
sudo rm /var/www/html/index.html
sudo a2dissite 000-default.conf
Varmistetaan oman kansion ja sivuston oikeudet ihan varalta
sudo chown -R $USER:$USER /home/henry/public_html/laiskottelu;sudo chown -R $USER:$USER /home/henry/public_html/rapsuttelu
Jos saitti tulisi julkiseen internettiin tässä ohjaisimme portit omasta VLAN/porttiasetuksista eteenpäin. Nyt kuitenkin sivusto vain demomielessä paikallisesti.
Tehdään kuitenkin merkinnät lokaaliin verkkoon.
sudo nano /etc/hosts
Lisätään paikallisen koneen ohjaukset konfiguraatioiden mukaan.
127.0.0.1 laiskottelu.lokaali.fi
127.0.0.1 rapsuttelu.lokaali.fi
Ja vihdoin saamme liittää symlinkit paikalleen sites-enabled kansioon. Käytetään apachen omaa a2ensite työkalua.
sudo a2ensite laiskottelu.conf;
sudo a2ensite rapsuttelu.conf
Ja käynnistetään prosessi uudelleen.
sudo systemctl restart apache2
JA VALMISTA TULI!
Kokeillaan molemmat sivut curl läpi. Curl lähettää ja vastaanottaa yksinkertaisia HTML pyyntöjä. Printattava kokonaisuus on teksti vastaanotettavasta datasta. -L lisällä sivu ohjataan myös seuraamaan uudelleenohjaukset. Nyt sitä ei tarvita.
curl rapsuttelu.lokaali.fi
curl laiskottelu.lokaali.fi
TÄSSÄ VIRHE Eli oikein portit laitettuna tämä toimii. Huomatkaa, että kuvassa molemmat ohjaa samaan osoitteeseen.

Koska minulla palvelin yhdistetty wireguard tunnelilla ja fyysisesti eri verkossa, porteista saan kiinni sivut selaimella ip-osoitteella ja portilla.
http://42.0.0.126:80 johtaa rapsutteluun ja http://42.0.0.126:81 johtaa laiskotteluun. Nimipalvelimet eivät toimi ilman, että ajan muutoksia myös omaan DNS järjestelmään. Nyt en sitä tee tähän kokonaisuuteen. SSH yli curlin ajaa toimivan demon.

HTML5, doctype ja rakenne.
Html5 sivustossa on oltava hakukoneille osoittava doctype kunnossa, merkistöinti-ilmoitus ja ideaalisti hyvin selkeä semaattinen pohja.
Esimerkki hyvästä pohjasta.
<!DOCTYPE html>
<html lang="fi">
<head>
<!-- Merkistökoodaus -->
<meta charset="UTF-8">
<!-- Responsiivinen ikkunaportti -->
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- Sivun metadata -->
<title>Sivun Otsikko</title>
<meta name="description" content="Sivun kuvaus hakukoneita varten">
<meta name="keywords" content="avainsanat, hakusanat">
<!-- Suosikki-iconi -->
<link rel="icon" href="/favicon.ico" type="image/x-icon">
<!-- Open Graph metatiedot somea varten -->
<meta property="og:title" content="Sivun Otsikko">
<meta property="og:description" content="Sivun kuvaus">
<meta property="og:image" content="url_kuva_sosiaaliseen_mediaan">
<meta property="og:url" content="sivun_url">
<!-- CSS-tiedostot -->
<link rel="stylesheet" href="styles.css">
<!-- Ulkoiset fontit (esim. Google Fonts) -->
<link href="https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;700&display=swap" rel="stylesheet">
</head>
<body>
<!-- Navigaatio -->
<header>
<nav>
<ul>
<li><a href="#home">Etusivu</a></li>
<li><a href="#about">Tietoa</a></li>
<li><a href="#contact">Yhteystiedot</a></li>
</ul>
</nav>
</header>
<!-- Pääsisältö -->
<main>
<section id="home">
<h1>Tervetuloa sivustollemme</h1>
<p>Tämä on sivuston pääsisältö</p>
</section>
</main>
<!-- Footer -->
<footer>
<p>© 2023 Sivuston Nimi. Kaikki oikeudet pidätetään.</p>
</footer>
<!-- JavaScript-tiedostot -->
<script src="script.js" defer></script>
</body>
</html>
Loppusanat
Apache on erittäin helppokäyttöinen http-palvelin joka skaalautuu pienestä yhden sivun kokonaisuudesta, suureen monen sivuston palvelinkokonaisuuteen todella helpolla.
Lähteet
Apache Docs https://httpd.apache.org/docs/
Dokumentissa käytetty apuna formatoinnissa ja tekstinkäsittelyssä LLM mistra-small:24b järkeily + gemma2:27b sanoitus malleja sekoitettuna kirjoittajan omalla opetusdatalla. WilmerAI välissä. https://ollama.com/library/mistral-small:22b https://ollama.com/library/gemma2:27b https://github.com/SomeOddCodeGuy/WilmerAI
Kuvat optimoitu https://optimage.app
Nimipalvelimien tietopankki https://httpd.apache.org/docs/2.4/vhosts/name-based.html https://terokarvinen.com/2018/04/10/name-based-virtual-hosts-on-apache-multiple-websites-to-single-ip-address/
Käytetty aika 1h 6min