VPS: LAMP-stack installeren - Linux, Apache, MySQL, PHP
Deze handleiding is gemaakt met de volgende producten:
(Details kunnen verschillen bij producten van verschillende aanbieders, maar de hoofdconcepten blijven hetzelfde)
Introductie
De LAMP stack is een populaire set open-source software die samen wordt geïnstalleerd om eenvoudig dynamische websites te hosten, met een focus op PHP-websites en apps. De afkorting staat voor: Linux als besturingssysteem, Apache als webserver, MySQL als database en tenslotte PHP voor verwerking. In deze handleiding behandelen we het opzetten van een LAMP-stack op een Linux VPS, met een gedetailleerde uitleg en een voorbeeld van het opzetten van een to-do lijst website.
Voorbereiding
Begin met verbinden met je server via SSH. Als je niet weet hoe dat moet, bekijk dan onze Eerste toegang (SSH) gids.
In deze handleiding gebruiken we Ubuntu als Linux distributie. De instructies zijn hetzelfde voor Debian en vergelijkbaar voor andere distributies, al kan de syntax van sommige commando’s iets verschillen. Zorg dat je een OS geïnstalleerd hebt en verbonden bent met de server via SSH.
Zoals altijd, zorg ervoor dat alle pakketten up-to-date zijn voordat je verder gaat met de installatie, met het volgende commando:
// Ubuntu & Debian
sudo apt update
// CentOS
sudo yum update
// OpenSUSE
sudo zypper up
// Fedora
sudo dnf upgrade --refresh
Installatie
De installatie splitsen we makkelijk op per kernonderdeel van LAMP, te beginnen met de Apache webserver, gevolgd door de MySQL database en tenslotte PHP. Tijdens de installatie zetten we een testwebsite op die in PHP geschreven is en de MySQL database aanspreekt. Elke webrequest wordt uiteindelijk verwerkt en geserveerd via Apache.
Apache installeren
Apache is de webserver die inkomende webverzoeken verwerkt en antwoorden serveert. Installeer het met het volgende commando:
sudo apt install apache2
Zodra geïnstalleerd, moet je ervoor zorgen dat de juiste firewallregels zijn ingesteld zodat de webserver toegankelijk is vanaf het internet. In dit voorbeeld gebruiken we de UFW Firewall, omdat Apache hiervoor een geregistreerde applicatie heeft.
Gebruik je een andere firewall, zorg dan dat poort 80 (HTTP) openstaat. Meer info over firewalls in Linux vind je in onze Firewall beheren gids.
Zorg dat UFW firewall aanstaat en dat er een regel voor SSH is aangemaakt:
# Regel aanmaken om SSH toe te staan
sudo ufw allow OpenSSH
# UFW Firewall inschakelen
sudo ufw enable
Zorg dat je een regel voor SSH hebt als je UFW gebruikt! Zonder deze regel kun je niet meer inloggen via SSH als je huidige sessie wegvalt!
Maak nu de regel aan om Apache toe te staan en controleer daarna of de regels aanwezig zijn:
# Regel aanmaken om Apache toe te staan
sudo ufw allow in "Apache Full"
# UFW firewall regels controleren
sudo ufw status
Je kunt zien welke profielen beschikbaar zijn met het commando ufw app list. In het voorbeeld hierboven zorgt Apache Full ervoor dat zowel HTTP (poort 80) als HTTPS (poort 443) openstaan.
Je zou regels moeten zien voor Apache en Apache (v6) met de actie ALLOW, wat bevestigt dat de firewall klaar is. Ook zie je andere regels die je eerder hebt ingesteld, inclusief de SSH-regel.
Met de firewall open voor Apache, check je of Apache werkt door je IP-adres in een browser te openen, bijvoorbeeld: http://[jouw_ipadres]
Als het werkt, zie je een standaard welkomstpagina. Zo niet, check dan de status van de service met: systemctl status apache2
MySQL installeren
Installeer nu de MySQL server die als database fungeert om data relationeel op te slaan:
sudo apt install mysql-server
Na installatie is het aan te raden om het beveiligingsscript te draaien om je MySQL server veilig te houden. Dit is optioneel maar sterk aanbevolen. Voer uit met sudo mysql_secure_installation.
Je doorloopt een interactieve setup. Eerst wordt gevraagd naar wachtwoordvalidatie. Kies Y om alleen veilige wachtwoorden toe te staan en selecteer MEDIUM met 1 of STRONG met 2.
Vervolgens wordt gevraagd om de anonymous gebruiker te verwijderen en root login op afstand uit te schakelen. Accepteer beide met Y voor betere beveiliging. Zo wordt de testgebruiker verwijderd en kan root alleen lokaal via SSH gebruikt worden.
Tot slot wordt gevraagd om de test database te verwijderen en de privileges te herladen. Accepteer ook dit met Y.
Controleer of MySQL draait door in te loggen met: sudo mysql -u root. Als het lukt, zie je een welkombericht. Verlaat met quit.
PHP installeren
PHP is de laatste LAMP-component en eenvoudig te installeren. Dit commando installeert PHP plus de Apache plugin en MySQL ondersteuning:
sudo apt install php libapache2-mod-php php-mysql
Controleer of PHP werkt door de versie te checken:
php -v
Voor geavanceerde toepassingen heb je misschien extra PHP extensies nodig. Bekijk ze met apt search php- | less.
Scroll met pijltjestoetsen en druk op Q om te stoppen. Installeer extensies met:
sudo apt install [php_extensie] [...]
Je kunt meerdere extensies tegelijk installeren door ze te scheiden met een spatie.
We raden aan om de directory index aan te passen zodat index.php voorrang krijgt boven .html. Open het bestand:
sudo nano /etc/apache2/mods-enabled/dir.conf
Verwijder index.php uit de lijst en zet het vooraan, zo:
DirectoryIndex index.php index.html index.cgi index.pl index.xhtml index.htm
Sla op en sluit nano met CTRL + X, dan Y en ENTER. Herstart Apache met:
sudo systemctl restart apache2
Testwebsite maken
Nu alles geïnstalleerd is, maken we een testwebsite om te laten zien hoe de LAMP stack samenwerkt. Dit is optioneel, maar handig om te begrijpen hoe je eigen sites kunt opzetten.
We maken een kleine to-do lijst website in PHP die taken ophaalt uit een MySQL database. Dit wordt geserveerd via Apache.
We gebruiken het testdomein zapdocs.example.com. In de praktijk moet je een A DNS-record aanmaken dat naar je server-IP wijst. Hulp nodig? Bekijk onze Domein Records gids.
Je kunt ook zonder domein werken en [your_domain] vervangen door een naam. Dan bezoek je de site via het IP-adres. Verwijder dan wel de ServerName regel in het virtual host bestand.
Apache configureren
Websites staan meestal in /var/www. Apache heeft standaard een html map met een standaardpagina. Voor overzicht, zeker bij meerdere sites, raden we aan elke site in een eigen map te zetten.
Maak een map aan voor je domein, bijvoorbeeld:
sudo mkdir /var/www/[your_domain]
Maak nu een nieuw Apache virtual host configuratiebestand aan:
sudo nano /etc/apache2/sites-available/[your_domain].conf
Plak deze template en vervang [your_domain] door je domein:
<VirtualHost *:80>
ServerName [your_domain]
ServerAlias www.[your_domain]
ServerAdmin webmaster@localhost
DocumentRoot /var/www/[your_domain]
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
Dit bestand behandelt poort 80 (HTTP) en checkt of het verzoek overeenkomt met ServerName. Het wijst naar de map die je net hebt aangemaakt.
Sla op en sluit nano (CTRL + X, Y, ENTER). Test de configuratie met:
sudo apache2ctl configtest
Activeer de nieuwe site:
sudo a2ensite [your_domain]
Gebruik je geen domein, verwijder of commentarieer dan de ServerName regel (zet er een # voor). Schakel ook de standaard site uit met:
sudo a2dissite 000-default
Herstart Apache:
sudo systemctl restart apache2
Website maken
De map is nu leeg, dus we maken een kleine to-do website.
Database voorbereiden
Log in op MySQL:
sudo mysql -u root
Maak een database en tabel aan:
# Database aanmaken
CREATE DATABASE todowebsite;
# Gebruik de database
USE todowebsite;
# Tabel aanmaken
CREATE TABLE todoitems (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
is_completed BOOLEAN DEFAULT FALSE,
creation_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Voeg wat voorbeeldtaken toe:
INSERT INTO todoitems (name, is_completed) VALUES ('Create ZAP-Docs Guide', 0);
INSERT INTO todoitems (name, is_completed) VALUES ('Buy a ZAP-Hosting Server', 1);
INSERT INTO todoitems (name, is_completed) VALUES ('Join ZAP-Hosting Discord', 0);
INSERT INTO todoitems (name, is_completed) VALUES ('Have a great day!', 0);
Maak een aparte gebruiker aan voor deze site:
# Vervang [your_password] door je eigen wachtwoord
CREATE USER todo@localhost IDENTIFIED BY '[your_password]';
# Rechten toekennen (alles in één regel kopiëren)
GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,ALTER
ON todowebsite.*
TO todo@localhost;
# Privileges herladen
FLUSH PRIVILEGES;
Verlaat MySQL met quit.
PHP website bestanden
Maak het PHP-bestand aan:
sudo nano /var/www/[your_domain]/index.php
Plak deze code in nano. Vergeet niet [your_password] te vervangen door het wachtwoord van de todo gebruiker.
<?php
// MySQL verbinding voorbereiden
$servername = "localhost";
$username = "todo";
$password = "[your_password]";
$dbname = "todowebsite";
// Verbinding maken
$conn = new mysqli($servername, $username, $password, $dbname);
// Check verbinding
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
// SQL query uitvoeren
$sql = "SELECT id, name, is_completed, creation_date FROM todoitems ORDER BY creation_date DESC";
$result = $conn->query($sql);
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF--8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>To-Do List</title>
</head>
<body>
<h1>Awesome To-Do List :D</h1>
<p>Voor onze coole ZAP-Hosting gids: <a href="https://zap-hosting.com/guides/docs/vserver-linux-lamp-stack">https://zap-hosting.com/guides/docs/vserver-linux-lamp-stack</a></p>
<ul>
<?php
if ($result->num_rows > 0) {
foreach ($result as $entry) {
echo "<li>";
echo htmlspecialchars($entry["name"]);
if ($entry["is_completed"]) {
echo " <strong>(Completed)</strong>";
} else {
echo " <strong>(Incomplete)</strong>";
}
echo " - Creation Date: " . htmlspecialchars($entry['creation_date']);
echo "</li>";
}
} else {
echo "<li>No to-do items found.</li>";
}
?>
</ul>
</body>
</html>
<?php
$conn->close();
?>
Sla op en sluit nano (CTRL + X, Y, ENTER).
Website testen
Je hebt nu een test to-do website opgezet die de hele LAMP stack gebruikt!
Je kunt de site bereiken via het domein (http/poort 80) dat je hebt ingesteld, in dit voorbeeld zapdocs.example.com. Het resultaat zou er zo uit moeten zien:
Conclusie
Gefeliciteerd, je hebt de LAMP stack succesvol geïnstalleerd en ingesteld! Als volgende stap raden we sterk aan om een domein en SSL-certificaat te regelen zodat data veilig wordt verzonden. Bekijk onze Certbot gids met focus op de Apache Plugin en volg de interactieve setup om snel een certificaat voor je domein te installeren.
Heb je vragen of hulp nodig? Neem gerust contact op met onze support, we staan dagelijks voor je klaar! 🙂