Je bepaalt welke diensten wij mogen inschakelen voor analyse, personalisatie en externe inhoud.
We gebruiken cookies en vergelijkbare technologieën op onze website om inhoud te personaliseren, externe media te integreren en het gebruik van afzonderlijke onderdelen beter te begrijpen.
Noodzakelijke cookies
Deze vermeldingen waarborgen basisfuncties zoals beveiliging, stabiliteit en formulierverwerking.
Optionele secties
AnalysesMarketingPersonalisatieExterne media
Gegevensverwerking kan plaatsvinden met je toestemming of op basis van gerechtvaardigde belangen. In de cookie-instellingen kun je elke optionele categorie weigeren of afzonderlijk toestaan.
Sommige diensten verwerken persoonsgegevens in derde landen. Met je toestemming accepteer je ook deze doorgifte. Meer informatie vind je in onze privacyverklaring.
Je kunt je selectie later op elk moment opnieuw openen en aanpassen. · 1.0.2
LEMP-stack instellen op een Linux-server – hoogwaardige webapplicaties implementeren
Ontdek hoe je een LEMP-stack instelt voor het hosten van dynamische PHP-websites op Linux VPS-servers → Lees meer
10 november 20268 min leestijd1 Weergaven0 nuttig
Inleiding
De LEMP-stack is een populaire combinatie van opensourcesoftware die samen wordt geïnstalleerd om het hosten van dynamische websites eenvoudig te maken, met speciale aandacht voor PHP-websites en -apps. Het acroniem staat voor: Linux als besturingssysteem, "Engine x" (nginx) als webserver, MySQL als database en tot slot PHP voor de verwerking. In deze handleiding laten we je zien hoe je een LEMP-stack instelt op een Linux-VPS, inclusief een gedetailleerde stapsgewijze uitleg en een voorbeeld van een to-dowebsite.
FAQ
Veelgestelde vragen
Linux als besturingssysteem, Engine x (nginx) als webserver, MySQL als database en PHP voor de verwerking: een populaire combinatie van software voor het hosten van dynamische PHP-websites.
Ubuntu. De opdrachten zijn hetzelfde voor Debian en zouden vergelijkbaar moeten zijn voor andere distributies, al kan de syntaxis iets verschillen.
Maak via SSH verbinding met je server en werk alle pakketten bij met de juiste updateopdracht, bijvoorbeeld 'sudo apt update' voor Ubuntu/Debian.
Voer 'sudo apt install nginx' uit. Zorg daarna voor de juiste firewallregels, zodat de webserver bereikbaar is vanaf het internet.
Feedback
Was dit artikel nuttig?
Je feedback helpt ons inhoud beter te prioriteren en te verbeteren.
0 van 0 Gebruikers vonden dit artikel nuttig.
Persoonlijke hulp
Is de handleiding niet voldoende?
Onze ZAP-support kent je product — beschrijf kort je vraag en wij helpen je persoonlijk verder.
Zappy kent deze handleiding en antwoordt je direct in de chat.
Navigatie
VPS
Voorbereiding
Maak eerst via SSH verbinding met je server. Als je niet weet hoe dat moet, bekijk dan onze handleiding Eerste toegang (SSH).
In deze handleiding gebruiken we Ubuntu als Linux-distributie. De opdrachten zijn identiek voor Debian en zouden vergelijkbaar moeten zijn voor andere distributies, al kan de syntaxis van de opdrachten iets verschillen. Zorg ervoor dat er een besturingssysteem is geïnstalleerd en dat je via SSH bent verbonden.
Zoals altijd werk je vóór de installatie alle pakketten bij met de volgende opdracht:
Gefeliciteerd, je hebt de LEMP-stack succesvol geïnstalleerd en ingesteld! Als volgende stap raden we dringend aan om een domein en een SSL-certificaat in te stellen, zodat je gegevens veilig worden verzonden. Bekijk hiervoor onze Certbot-handleiding, die zich richt op de Nginx-plugin, en volg de interactieve configuratie om snel en eenvoudig een certificaat voor je domein te verkrijgen.
Ons supportteam staat elke dag voor je klaar als je vragen hebt of problemen ondervindt. Aarzel niet om contact met ons op te nemen! 🙂
Serverhosting vanaf € 2,49 / maand, direct online, inclusief DDoS-bescherming.
Je kunt de installatie goed opdelen in de afzonderlijke kerncomponenten van de LEMP-stack: eerst de Nginx-webserver, daarna de MySQL-database en tot slot PHP. Tijdens de installatie zetten we een testwebsite op die is geschreven in PHP en verbinding maakt met de MySQL-database. Vervolgens wordt elk webverzoek verwerkt en afgehandeld door de Nginx-webserver.
Nginx instellen
Nginx is de webserver die binnenkomende webverzoeken verwerkt en antwoorden verstuurt. Installeer Nginx met de volgende opdracht:
Code
sudo apt install nginx
Na de installatie moet je ervoor zorgen dat de juiste firewallregels zijn ingesteld, zodat de webserver bereikbaar is vanaf het internet. In dit voorbeeld gebruiken we de UFW-firewall, omdat Nginx hiervoor een geregistreerde applicatie heeft.
Als je een andere firewall gebruikt, zorg er dan voor dat poort 80 (HTTP) is toegestaan. Meer informatie over firewalls onder Linux vind je in onze handleiding Firewall beheren.
Schakel de UFW-firewall in en maak een regel aan voor SSH:
Code
# Regel für SSH erstellen
sudo ufw allow OpenSSH
# UFW Firewall aktivieren
sudo ufw enable
Let op
Zorg ervoor dat je een regel voor SSH hebt ingesteld als je UFW gebruikt! Zonder deze regel kun je geen verbinding meer maken met je server via SSH als de huidige sessie wordt verbroken!
Maak nu de regel voor Nginx aan en controleer vervolgens of de regels zijn ingesteld:
Code
# Regel für Nginx erstellen
sudo ufw allow in "Nginx Full"
# UFW Firewall Regeln anzeigen
sudo ufw status
Tip
Met de opdracht ufw app list kun je zien welke profielen beschikbaar zijn. In het bovenstaande voorbeeld zorgt Nginx Full ervoor dat zowel HTTP (poort 80) als HTTPS (poort 443) is toegestaan.
Je zou de regels Nginx en Nginx (v6) met de status ALLOW moeten zien. Dat bevestigt dat de firewall correct is ingesteld. Je ziet ook eventuele andere regels die je al hebt ingesteld, waaronder de SSH-regel.
Nadat de firewall is geopend voor Nginx, test je of Nginx werkt. Open daarvoor je browser en voer je IP-adres in, bijvoorbeeld: http://[deine_ipadresse]
Als alles werkt, zie je een standaardwelkomstpagina. Zo niet, controleer dan de status van de service met: systemctl status nginx
MySQL instellen
Nu installeer en configureer je een MySQL-server, die als database dient om gegevens permanent relationeel op te slaan. Installeer deze met:
Code
sudo apt install mysql-server
Na de installatie raden we aan het beveiligingsscript uit te voeren om je MySQL-server te beveiligen. Dit is optioneel, maar sterk aanbevolen. Start het script met:
Code
sudo mysql_secure_installation
Het script begeleidt je interactief bij de configuratie. Eerst wordt je gevraagd naar wachtwoordvalidatie. We raden aan Y te kiezen, zodat voortaan alleen veilige wachtwoorden zijn toegestaan. Kies vervolgens MEDIUM met 1 of STRONG met 2.
Vervolgens wordt je gevraagd of de gebruiker anonymous moet worden verwijderd en of inloggen als root op afstand moet worden uitgeschakeld. Om veiligheidsredenen raden we aan beide opties met Y te bevestigen. Zo wordt de testgebruiker verwijderd en is root-toegang alleen lokaal via SSH mogelijk, waardoor het risico wordt beperkt.
Tot slot wordt je gevraagd of de database test moet worden verwijderd en of de privilegetabellen opnieuw moeten worden geladen. Ook hier raden we Y aan, omdat de testdatabase niet nodig is en de privilegetabellen opnieuw moeten worden geladen om wijzigingen toe te passen.
Controleer nu of de MySQL-database actief is door je met de volgende opdracht aan te melden: sudo mysql -u root. Als alles goed gaat, verschijnt er een welkomstbericht. Met quit verlaat je de MySQL-shell.
PHP instellen
De laatste LEMP-component is PHP. Voor Nginx wordt hiervoor het externe programma php-fpm (PHP FastCGI Process Manager) gebruikt. Nginx wordt zo geconfigureerd dat verzoeken worden doorgestuurd naar php-fpm, voordat ze worden verwerkt en afgehandeld.
Installeer de nieuwste versie van php-fpm en de PHP-MySQL-plugin met:
Code
sudo apt install php-fpm php-mysql
Controleer of de installatie is geslaagd door de PHP-versie op te vragen. Als er een versie wordt weergegeven, werkt PHP correct:
Code
php -v
Tip
PHP-extensies
Voor geavanceerdere toepassingen heb je misschien extra PHP-extensies nodig. Je kunt een lijst weergeven met apt search php- | less.
Blader met de pijltoetsen en sluit af met Q. Installeer een extensie eenvoudig met:
Code
sudo apt install [php_erweiterung] [...]
Je kunt meerdere extensies tegelijk installeren door ze met spaties van elkaar te scheiden.
Een testwebsite maken
Nadat alle LEMP-componenten zijn geïnstalleerd, maken we een testwebsite om te laten zien hoe de stack samenwerkt en een dynamische website mogelijk maakt. Dit is optioneel, maar nuttig om te begrijpen hoe je je eigen websites kunt opzetten.
In dit voorbeeld bouwen we een kleine to-dolijst in PHP die items uit een MySQL-database ophaalt en weergeeft. De website wordt via Nginx aangeboden.
We gebruiken zapdocs.example.com als voorbeelddomein, omdat je in de praktijk waarschijnlijk een domein zult gebruiken. Je moet een DNS-A-record voor het domein aanmaken dat naar het IP-adres van je server verwijst. Je vindt hierover meer informatie in onze handleiding Domeinrecords.
Info
Je kunt ook zonder domein werken en [your_domain] vervangen door een willekeurige naam. Je opent de website dan via het IP-adres. Houd er wel rekening mee dat je later de regel server_name uit het serverblokbestand moet verwijderen.
Nginx configureren
Webservers slaan alle websitebestanden normaal gesproken op in de map /var/www. Standaard heeft Nginx daar een map html met een standaardpagina. Om alles overzichtelijk te houden, vooral als je meerdere websites host, raden we aan voor elke website een eigen map aan te maken.
Maak daarom een nieuwe map aan onder /var/www/[your_domain]. In ons voorbeeld is dat /var/www/zapdocs.example.com.
Code
sudo mkdir /var/www/[your_domain]
Maak nu een nieuw configuratiebestand voor het Nginx-serverblok voor dit domein in de map sites-available:
PHP-versie
Belangrijk: vervang [your_phpversion] door de PHP-versie die momenteel is geïnstalleerd. Controleer deze met php -v, bijvoorbeeld PHP 8.3.6 (cli) (built: Mar 19 2025 10:08:38) (NTS).
In dit voorbeeld is dat 8.3. De regel wordt dus: fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;
Dit serverblokbestand verwerkt verzoeken op poort 80 (HTTP) en controleert of het verzoek overeenkomt met de opgegeven server_name, oftewel je domein. Het verwijst ook naar de map /var/www/[your_domain] die je eerder hebt aangemaakt om de bestanden aan te bieden.
Sla het bestand op en sluit Nano af met CTRL + X, druk vervolgens op Y om te bevestigen en daarna op ENTER.
Activeer de configuratie door een symbolische link aan te maken in de map sites-enabled:
Geen domein gebruikt
Als je geen domein gebruikt, verwijder of becommentarieer dan de regel server_name (door er # voor te zetten). Je moet ook het standaardserverblok uitschakelen met:
Code
sudo unlink /etc/nginx/sites-enabled/default
We raden aan de syntaxis te controleren met de volgende opdracht:
Code
sudo nginx -t
Herstart Nginx zodat de wijzigingen van kracht worden:
Code
sudo systemctl reload nginx
De website maken
Nadat Nginx is geconfigureerd, maken we de website die daadwerkelijk wordt aangeboden. De map is nu nog leeg, dus er wordt nog niets weergegeven. Zoals hierboven beschreven maken we een kleine to-dolijst.
De database voorbereiden
Meld je aan bij je MySQL-server:
Code
sudo mysql -u root
Maak een nieuwe database todowebsite en daarin een tabel todoitems aan:
Code
# Datenbank erstellen
CREATE DATABASE todowebsite;
# Datenbank auswählen
USE todowebsite;
# Tabelle erstellen
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 enkele voorbeelditems toe:
Code
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 todo aan voor de website:
Code
# Benutzer erstellen
# Ersetze [your_password] durch dein eigenes Passwort
CREATE USER todo@localhost IDENTIFIED BY '[your_password]';
# Rechte vergeben (alles in einer Zeile kopieren)
GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,ALTER
ON todowebsite.*
TO todo@localhost;
# Rechte neu laden
FLUSH PRIVILEGES;
Verlaat de MySQL-shell met quit.
PHP-websitebestanden
Nu maken we het PHP-bestand voor de to-dopagina. Open de Nano-editor:
Code
sudo nano /var/www/[your_domain]/index.php
Voeg de volgende code toe. Het eerste PHP-blok maakt verbinding met MySQL.
Belangrijk
Vervang [your_password] door het wachtwoord dat je aan de gebruiker todo hebt toegewezen.
Het HTML-gedeelte toont de to-dolijst door de gegevens uit de database op te halen.
Code
<?php
// MySQL-Verbindung vorbereiten
$servername = "localhost";
$username = "todo";
$password = "[your_password]";
$dbname = "todowebsite";
// Verbindung erstellen
$conn = new mysqli($servername, $username, $password, $dbname);
// Verbindung prüfen, bei Fehler abbrechen
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
// SQL-Abfrage ausführen und Ergebnis speichern
$sql = "SELECT id, name, is_completed, creation_date FROM todoitems ORDER BY creation_date DESC";
$result = $conn->query($sql);
?>
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>To-Do Liste</title>
</head>
<body>
<h1>Coole To-Do Liste :D</h1>
<p>Für unseren tollen ZAP-Hosting Guide: <a href="https://zap-hosting.com/guides/docs/vserver-linux-lemp-stack">https://zap-hosting.com/guides/docs/vserver-linux-lemp-stack</a></p>
<ul>
<?php
// Prüfen, ob Ergebnisse vorhanden sind
if ($result->num_rows > 0) {
// Durch alle Einträge iterieren
foreach ($result as $entry) {
echo "<li>";
// Name anzeigen, htmlspecialchars schützt vor XSS
echo htmlspecialchars($entry["name"]);
// Status anzeigen
if ($entry["is_completed"]) {
echo " <strong>(Abgeschlossen)</strong>";
} else {
echo " <strong>(Offen)</strong>";
}
// Erstellungsdatum anzeigen
echo " - Erstellungsdatum: " . htmlspecialchars($entry['creation_date']);
echo "</li>";
}
} else {
// Falls keine Einträge vorhanden sind
echo "<li>Keine To-Do Einträge gefunden.</li>";
}
?>
</ul>
</body>
</html>
<?php
// Verbindung schließen
$conn->close();
?>
Sla het bestand op en sluit Nano af met CTRL + X, vervolgens Y en ENTER.
De website testen
Je hebt met succes een test-to-dowebsite opgezet die alle componenten van de LEMP-stack gebruikt!
Je zou de website nu moeten kunnen bereiken via het domein (poort 80 / http) dat je in het serverblok hebt ingesteld, in ons voorbeeld zapdocs.example.com. Het resultaat zou er als volgt uit moeten zien: