Hoe Linux, Nginx, MySQL, PHP (LEMP-stack) op Ubuntu te installeren
Inleiding
De LEMP-softwarestack levert dynamische webpagina's en webapplicaties geschreven in PHP. Dit is een acroniem dat een Linux-besturingssysteem beschrijft, met een Nginx (uitgesproken als “Engine-X”) webserver. De back-endgegevens worden opgeslagen in de MySQL-database en de dynamische verwerking wordt afgehandeld door PHP.
Deze handleiding laat zien hoe je een LEMP-stack installeert op een Ubuntu-server. Het Ubuntu-besturingssysteem verzorgt het Linux-gedeelte van de stack. We zullen beschrijven hoe je de andere componenten aan de praat krijgt.
Opmerking: Deze handleiding is voornamelijk gericht op Ubuntu 22.04 LTS met PHP 8.1. Voor gebruikers van Ubuntu 24.04 LTS, pas de PHP-versieverwijzingen in de opdrachten aan van
php8.1-fpmnaarphp8.3-fpm. Zorg er ook voor dat je eventuele PHP-FPM socketpaden in je Nginx-configuratie bijwerkt (bijvoorbeeld gebruik/run/php/php8.3-fpm.sockvoor Ubuntu 24.04).
Hoe Linux, Nginx, MySQL, PHP (LEMP-stack) op Ubuntu te installeren
- De Nginx-webserver installeren
- MySQL installeren
- PHP installeren
- Nginx configureren om de PHP-processor te gebruiken
- PHP testen met Nginx
- Databaseverbinding testen vanuit PHP
Vereisten
Gebruik een niet-root sudo-gebruiker op Ubuntu met de UFW-firewall ingeschakeld. Volg onze handleiding voor de eerste serverconfiguratie voor Ubuntu om dit in te stellen.
Stap 1 – De Nginx-webserver installeren
Om webpagina's aan sitebezoekers weer te geven, ga je Nginx gebruiken, een webserver met hoge prestaties. Je zult de APT-pakketbeheerder gebruiken om deze software te verkrijgen.
Werk de pakketindex van je server bij en installeer vervolgens Nginx:
sudo apt updateVoer daarna apt install uit om Nginx te installeren:
sudo apt install nginxWanneer daarom wordt gevraagd, druk op Y en ENTER om te bevestigen dat je Nginx wilt installeren. Zodra de installatie is voltooid, zal de Nginx-webserver actief zijn en draaien op je Ubuntu-server.
Controleer of Nginx actief is:
sudo systemctl status nginxJe zou output moeten zien die aangeeft dat Nginx actief is:
● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
Active: active (running) since...Op Ubuntu is Nginx zo geconfigureerd dat het bij installatie automatisch wordt gestart.
Sta HTTP-verkeer toe via de ufw-firewall. Nginx registreert meerdere UFW-toepassingsprofielen bij installatie. Controleer de beschikbare profielen:
sudo ufw app listAvailable applications:
Nginx Full
Nginx HTTP
Nginx HTTPS
OpenSSHSchakel het meest beperkende profiel in dat het vereiste verkeer toestaat. Aangezien SSL nog niet is geconfigureerd, staat alleen HTTP-verkeer op poort 80 toe:
Schakel dit in door het volgende uit te voeren:
sudo ufw allow 'Nginx HTTP'
Controleer de firewallwijziging:
sudo ufw statusDeze uitvoer toont dat HTTP-verkeer nu is toegestaan:
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
Nginx HTTP ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Nginx HTTP (v6) ALLOW Anywhere (v6)Om de domeinfunctionaliteit van de Nginx-server te testen, ga naar http://your_domain met je favoriete webbrowser.
Als je geen domeinnaam naar je server laat verwijzen en je het publieke IP-adres van je server niet weet, kun je dit vinden door een van de volgende opdrachten uit te voeren:
ip addr showhostname -IDit zal een paar IP-adressen weergeven. Je kunt ze een voor een proberen in je webbrowser.
Als alternatief kunt u controleren welk IP-adres toegankelijk is, zoals gezien vanaf andere locaties op het internet:
curl -4 icanhazip.comSchrijf het adres dat je in je webbrowser ontvangt en het zal je naar de standaard startpagina van Nginx brengen:
http://<server_domain_or_IP>Als u deze pagina ontvangt, betekent dit dat u Nginx succesvol hebt geïnstalleerd en HTTP-verkeer voor uw webserver hebt ingeschakeld.
Stap 2 — MySQL installeren
Installeer MySQL om sitegegevens op te slaan en te beheren. MySQL is het standaarddatabasesysteem voor PHP-omgevingen.
Gebruik opnieuw apt om deze software te verkrijgen en te installeren:
sudo apt install mysql-serverBevestig de installatie wanneer hierom wordt gevraagd door Y in te drukken en vervolgens op ENTER te drukken.
Voer na de installatie het beveiligingsscript uit om onveilige standaardinstellingen te verwijderen en de database toegang te beveiligen:
sudo mysql_secure_installationEr wordt u een vraag gesteld of u de VALIDATE PASSWORD PLUGIN wilt configureren.
Opmerking: Het inschakelen van deze functie is een soort van beoordelingskwestie. Als deze is ingeschakeld, worden wachtwoorden die niet aan de gespecificeerde criteria voldoen door MySQL afgewezen met een foutmelding. Het is veilig om de validatie uitgeschakeld te laten, maar je moet altijd sterke, unieke wachtwoorden gebruiken voor database-inloggegevens.
Antwoord Y voor ja, of iets anders om door te gaan zonder inschakelen:
VALIDATE PASSWORD COMPONENT can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD component?
Press y|Y for Yes, any other key for No: Als je 'ja' antwoordt, wordt je gevraagd een niveau van wachtwoordvalidatie te selecteren. Houd er rekening mee dat als je 2 invoert voor het sterkste niveau, je fouten krijgt wanneer je probeert een wachtwoord in te stellen dat geen cijfers, hoofd- en kleine letters en speciale tekens bevat:
There are three levels of password validation policy:
LOW Length >= 8
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary file
Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 1Ongeacht of je ervoor kiest om de VALIDATE PASSWORD PLUGIN in te stellen, zal je server je vragen om een wachtwoord voor de MySQL root-gebruiker te kiezen en te bevestigen. Dit mag niet worden verward met de system root. De database root-gebruiker is een administratieve gebruiker met volledige rechten over het databasesysteem. Hoewel de standaard authenticatiemethode voor de MySQL root-gebruiker het gebruik van een wachtwoord overbodig maakt, zelfs wanneer er een is ingesteld, moet je hier een sterk wachtwoord definiëren als extra veiligheidsmaatregel. We zullen hier zo dadelijk op ingaan.
Als je wachtwoordvalidatie hebt ingeschakeld, wordt de sterkte van het rootwachtwoord dat je hebt ingevoerd weergegeven en zal je server vragen of je wilt doorgaan met dat wachtwoord. Als je tevreden bent met je huidige wachtwoord, druk dan op Y voor „ja” bij de prompt:
Estimated strength of the password: 100
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : yVoor de rest van de vragen, druk op Y en druk op de ENTER-toets bij elke prompt. Dit zal enkele anonieme gebruikers en de testdatabase verwijderen, externe root-aanmeldingen uitschakelen en deze nieuwe regels laden zodat MySQL de wijzigingen die je hebt aangebracht onmiddellijk respecteert.
Wanneer je klaar bent, test dan of je kunt inloggen op de MySQL-console:
sudo mysqlDit zal verbinding maken met de MySQL-server als de administratieve databasegebruiker root, wat wordt afgeleid uit het gebruik van sudo bij het uitvoeren van dit commando. U zou de volgende output moeten ontvangen:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 8.0.28-0ubuntu4 (Ubuntu)
Copyright (c) 2000, 2022, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>Om de MySQL-console te verlaten, typ het volgende:
exitMerk op dat je geen wachtwoord hoefde op te geven om als root-gebruiker verbinding te maken, zelfs niet als je er een hebt ingesteld bij het uitvoeren van het mysql_secure_installation-script. Dit komt doordat, wanneer MySQL op Ubuntu wordt geïnstalleerd, de standaard authenticatiemethode voor de administratieve MySQL-gebruiker auth_socket is, in plaats van een methode die een wachtwoord gebruikt. Dit lijkt in eerste instantie misschien een beveiligingsprobleem, maar het maakt de database server juist veiliger, omdat alleen systeemgebruikers met sudo-rechten die verbinding maken vanaf de console of via een applicatie met dezelfde rechten, als root MySQL-gebruiker mogen inloggen. In praktische termen betekent dit dat je de administratieve database root-gebruiker niet kunt gebruiken om verbinding te maken vanuit je PHP-toepassing.
Voor een betere beveiliging is het het beste om voor elke database speciale gebruikersaccounts met minder uitgebreide rechten aan te maken, vooral als je van plan bent meerdere databases op je server te hosten.
Opmerking: Sommige oudere versies van de native MySQL PHP-bibliotheek mysqlnd ondersteunen caching_sha2_authentication niet, de standaardauthenticatiemethode voor aangemaakte gebruikers in MySQL 8. Om die reden moet u, bij het aanmaken van databasegebruikers voor PHP-toepassingen op MySQL 8, mogelijk zorgen dat ze zijn ingesteld om mysql_native_password te gebruiken. We zullen in Stap 6 laten zien hoe u dat doet.
Je MySQL-server is nu geïnstalleerd en beveiligd. Vervolgens zul je PHP installeren, het laatste onderdeel van de LEMP-stack.
Stap 3 – PHP installeren
Installeer PHP om code te verwerken en dynamische inhoud te genereren. Nginx heeft een extern programma nodig voor PHP-verwerking.
PHP-FPM („FastCGI-processorbeheerder“) verwerkt PHP-efficiënt met extra beveiligingsfuncties en biedt betere prestaties voor op PHP gebaseerde websites. Installeer php-fpm om PHP-verzoeken via Nginx te routeren, en php-mysql om PHP-MySQL-communicatie mogelijk te maken. Kern-PHP-pakketten worden automatisch als afhankelijkheden geïnstalleerd.
Om de pakketten php8.1-fpm en php-mysql te installeren, voer uit:
sudo apt install php8.1-fpm php-mysqlWanneer daarom wordt gevraagd, druk op Y en ENTER om de installatie te bevestigen.
Controleer of PHP-FPM actief is:
sudo systemctl status php8.1-fpmJe zou uitvoer moeten zien die laat zien dat PHP-FPM actief is:
● php8.1-fpm.service - The PHP 8.1 FastCGI Process Manager
Loaded: loaded
Active: active (running)Je kunt ook de PHP-versie controleren:
php -vPHP 8.1.x (cli) (built: ...)
Copyright (c) The PHP Group
Zend Engine v4.1.xConfigureer Nginx om deze PHP-componenten te gebruiken.
Stap 4 — Nginx configureren om de PHP-processor te gebruiken
Maak Nginx serverblokken (vergelijkbaar met Apache virtual hosts) om configuraties te encapsuleren en meerdere domeinen op één server te hosten. Deze gids gebruikt your_domain als voorbeeld van een domeinnaam.
Info: Om meer te leren over het instellen van een domeinnaam bij Linux-Console.net, lees onze introductie tot Linux-Console.net DNS.
Op Ubuntu 22.04 stelt Nginx één standaard serverblok in dat documenten bedient vanuit /var/www/html. Voor meerdere sites, maak een mappenstructuur binnen /var/www voor your_domain, waarbij /var/www/html als standaard fallback-map blijft.
Maak de hoofdwebmap voor your_domain als volgt aan:
sudo mkdir /var/www/your_domainKen vervolgens het eigendom van de map toe met de $USER omgevingsvariabele, die naar je huidige systeemgebruiker verwijst:
sudo chown -R $USER:$USER /var/www/your_domainOpen vervolgens een nieuw configuratiebestand in de sites-available-map van Nginx met je favoriete commandoregel-editor. Hier gebruiken we nano:
sudo nano /etc/nginx/sites-available/your_domainDit zal een nieuw leeg bestand aanmaken. Voeg de volgende minimale configuratie in:
server {
listen 80;
server_name your_domain www.your_domain;
root /var/www/your_domain;
index index.html index.htm index.php;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
}
location ~ /\.ht {
deny all;
}
}Dit is wat elk van deze richtlijnen en locatieblokken doet:
listen— Bepaalt op welke poort Nginx zal luisteren. In dit geval luistert het op poort80, de standaardpoort voor HTTP.root— Bepaalt de documentroot waar de bestanden die door deze website worden geserveerd, zijn opgeslagen.index— Bepaalt in welke volgorde Nginx indexbestanden voor deze website zal prioriteren. Het is gebruikelijk omindex.html-bestanden hoger te laten prioriteren danindex.php-bestanden, zodat het snel opzetten van een onderhoudspagina in PHP-toepassingen mogelijk is. Je kunt deze instellingen aanpassen om beter aan de behoeften van je toepassing te voldoen.server_name— Bepaalt op welke domeinnamen en/of IP-adressen dit serverblok moet reageren. Verwijs deze directive naar de domeinnaam of het publieke IP-adres van je server.location /— Het eerste location-blok bevat eentry_filesdirectief, die controleert op het bestaan van bestanden of mappen die overeenkomen met een URL-verzoek. Als Nginx de juiste resource niet kan vinden, zal het een 404-fout retourneren.location ~ \.php$— Dit locatieblok behandelt de daadwerkelijke PHP-verwerking door Nginx te wijzen naar het configuratiebestandfastcgi-php.confen het bestandphp8.1-fpm.sock, dat aangeeft welke socket is gekoppeld aanphp8.1-fpm.location ~ /\.ht— Het laatste locatieblok behandelt.htaccess-bestanden, die Nginx niet verwerkt. Door dedeny all-richtlijn toe te voegen, worden eventuele.htaccess-bestanden die per ongeluk in de document root terechtkomen, niet aan bezoekers geserveerd.
Wanneer je klaar bent met bewerken, sla je het bestand op en sluit je het. Als je nano gebruikt, kun je dat doen door CTRL+X te drukken en vervolgens Y en ENTER om te bevestigen.
Activeer uw configuratie door te linken naar het configuratiebestand vanuit de sites-enabled-map van Nginx:
sudo ln -s /etc/nginx/sites-available/your_domain /etc/nginx/sites-enabled/Koppel vervolgens het standaardconfiguratiebestand los van de /sites-enabled/-map:
sudo unlink /etc/nginx/sites-enabled/defaultOpmerking: Als u ooit de standaardconfiguratie moet herstellen, kunt u dit doen door de symbolische koppeling opnieuw te maken, zoals volgt:
sudo ln -s /etc/nginx/sites-available/default /etc/nginx/sites-enabled/Dit vertelt Nginx om de configuratie te gebruiken de volgende keer dat het wordt herladen. U kunt uw configuratie testen op syntaxisfouten door het volgende uit te voeren:
sudo nginx -tAls er fouten worden gemeld, ga dan terug naar je configuratiebestand om de inhoud te controleren voordat je verdergaat.
Wanneer je klaar bent, start Nginx opnieuw om de wijzigingen toe te passen:
sudo systemctl reload nginxUw nieuwe website is nu actief, maar de webroot /var/www/your_domain is nog leeg. Maak een index.html-bestand op die locatie zodat u kunt testen of uw nieuwe serverblok werkt zoals verwacht:
nano /var/www/your_domain/index.htmlNeem de volgende inhoud op in dit bestand:
<html>
<head>
<title>your_domain website</title>
</head>
<body>
<h1>Hello World!</h1>
<p>This is the landing page of <strong>your_domain</strong>.</p>
</body>
</html>Ga nu naar je browser en ga naar de domeinnaam of het IP-adres van je server, zoals vermeld in de server_name-instructie in je serverblokconfiguratiebestand:
http://server_domain_or_IPJe ontvangt een pagina zoals de volgende:
Als je deze pagina ontvangt, betekent dit dat je Nginx-serverblok naar verwachting werkt.
Je kunt dit bestand op zijn plaats laten als een tijdelijke landingspagina voor je applicatie totdat je een index.php-bestand instelt om het te vervangen.
Waarschuwing: Nadat je je index.php bestand hebt toegevoegd, zorg ervoor dat je het index.html bestand uit je document root verwijdert of hernoemt. Als beide bestanden bestaan, zal Nginx standaard index.html serveren, en zal je PHP-pagina niet worden weergegeven—dit is een veelvoorkomende bron van verwarring voor nieuwe gebruikers.
Je LEMP-stack is nu volledig geconfigureerd. In de volgende stap maak je een PHP-script om te testen of Nginx daadwerkelijk in staat is om .php-bestanden te verwerken binnen je nieuw geconfigureerde website.
Stap 5 – PHP testen met Nginx
Je LEMP-stack zou nu volledig ingesteld moeten zijn. Je kunt het testen om te controleren of Nginx correct .php-bestanden kan doorgeven aan je PHP-processor.
U kunt dit doen door een test-PHP-bestand aan te maken in uw documentroot. Open een nieuw bestand genaamd info.php in uw documentroot in uw favoriete teksteditor:
nano /var/www/your_domain/info.phpVoeg de volgende regels toe aan het nieuwe bestand. Dit is geldige PHP-code die informatie over je server zal teruggeven:
<?php
phpinfo();Wanneer je klaar bent, sla het bestand op en sluit het.
Je kunt nu deze pagina in je webbrowser openen door het domeinnaam of het publieke IP-adres te bezoeken dat je hebt ingesteld in je Nginx-configuratiebestand, gevolgd door /info.php:
http://server_domain_or_IP/info.phpJe ontvangt een webpagina met gedetailleerde informatie over je server:
Na het controleren van de relevante informatie over je PHP-server via die pagina, is het het beste om het bestand dat je hebt aangemaakt te verwijderen, aangezien het gevoelige informatie bevat over je PHP-omgeving en je Ubuntu-server. Je kunt rm gebruiken om dat bestand te verwijderen:
sudo rm /var/www/your_domain/info.phpJe kunt dit bestand altijd opnieuw genereren als je het later nodig hebt.
Stap 6 — Databaseverbinding testen vanuit PHP (optioneel)
Als je wilt testen of PHP verbinding kan maken met MySQL en databasequery's kan uitvoeren, kun je een testtabel maken met voorbeeldgegevens en de inhoud ervan opvragen vanuit een PHP-script. Voordat je dit doet, moet je een testdatabase aanmaken en een nieuwe MySQL-gebruiker correct configureren om toegang te krijgen.
Opmerking: Sommige oudere versies van de native MySQL PHP-bibliotheek mysqlnd ondersteunen caching_sha2_authentication, de standaardauthenticatiemethode voor MySQL 8, mogelijk niet. U moet ervoor zorgen dat ze zijn geconfigureerd om in plaats daarvan mysql_native_password te gebruiken.
We zullen een database aanmaken met de naam example_database en een gebruiker met de naam example_user, maar je kunt deze namen vervangen door andere waarden.
Verbind eerst met de MySQL-console met het root-account:
sudo mysqlOm een nieuwe database te maken, voert u het volgende commando uit vanuit uw MySQL-console:
CREATE DATABASE example_database;Nu kunt u een nieuwe gebruiker aanmaken en deze volledige privileges geven op de aangepaste database die u hebt gemaakt.
Het volgende commando maakt een nieuwe gebruiker aan met de naam example_user, waarbij mysql_native_password wordt gebruikt als de standaard authenticatiemethode. We stellen het wachtwoord van deze gebruiker in op password, maar je moet deze waarde vervangen door een veilig wachtwoord naar keuze.
CREATE USER 'example_user'@'%' IDENTIFIED WITH mysql_native_password BY 'password';Nu moeten we deze gebruiker toestemming geven over de example_database database:
GRANT ALL ON example_database.* TO 'example_user'@'%';Dit geeft de gebruiker example_user volledige privileges over de database example_database, terwijl wordt voorkomen dat deze gebruiker andere databases op uw server kan aanmaken of wijzigen.
Verlaat nu de MySQL-shell met het volgende commando:
exitJe kunt testen of de nieuwe gebruiker de juiste machtigingen heeft door opnieuw in te loggen op de MySQL-console, dit keer met de aangepaste gebruikersreferenties. Let op de -p vlag in dit commando, die je zal vragen om het wachtwoord dat is gebruikt bij het aanmaken van de example_user gebruiker:
mysql -u example_user -pLog na het inloggen op de MySQL-console dat u toegang hebt tot de example_database database:
SHOW DATABASES;Dit zal de volgende uitvoer opleveren:
+--------------------+
| Database |
+--------------------+
| example_database |
| information_schema |
+--------------------+
2 rows in set (0.000 sec)Vervolgens maken we een testtabel genaamd todo_list. Voer vanuit de MySQL-console de volgende instructie uit:
CREATE TABLE example_database.todo_list (
item_id INT AUTO_INCREMENT,
content VARCHAR(255),
PRIMARY KEY(item_id)
);Voeg een paar rijen inhoud toe aan de testtabel. Je wilt misschien het volgende commando een paar keer herhalen, met verschillende waarden:
INSERT INTO example_database.todo_list (content) VALUES ("My first important item");Om te bevestigen dat de gegevens succesvol in uw tabel zijn opgeslagen, voert u uit:
SELECT * FROM example_database.todo_list;Je uitvoer zou als volgt moeten worden weergegeven:
+---------+--------------------------+
| item_id | content |
+---------+--------------------------+
| 1 | My first important item |
| 2 | My second important item |
| 3 | My third important item |
| 4 | and this one more thing |
+---------+--------------------------+
4 rows in set (0.000 sec)Nadat je hebt bevestigd dat je geldige gegevens in je testtabel hebt, kun je de MySQL-console afsluiten:
exitNu kunt u het PHP-script maken dat verbinding maakt met MySQL en uw inhoud opvraagt. Maak een nieuw PHP-bestand aan in uw aangepaste webrootdirectory met behulp van uw favoriete editor. We gebruiken daarvoor nano:
nano /var/www/your_domain/todo_list.phpHet volgende PHP-script maakt verbinding met de MySQL-database en vraagt de inhoud van de todo_list-tabel op, waarbij de resultaten in een lijst worden weergegeven. Als er een probleem is met de databaseverbinding, wordt er een uitzondering gegooid.
Voeg de volgende inhoud toe aan je todo_list.php-script:
<?php
$user = "example_user";
$password = "password";
$database = "example_database";
$table = "todo_list";
try {
$db = new PDO("mysql:host=localhost;dbname=$database", $user, $password);
echo "<h2>TODO</h2><ol>";
foreach($db->query("SELECT content FROM $table") as $row) {
echo "<li>" . $row['content'] . "</li>";
}
echo "</ol>";
} catch (PDOException $e) {
print "Error!: " . $e->getMessage() . "<br/>";
die();
}
Sla het bestand op en sluit het wanneer je klaar bent met bewerken.
Je kunt nu deze pagina in je webbrowser openen door naar de domeinnaam of het openbare IP-adres te gaan dat voor je website is ingesteld, gevolgd door /todo_list.php:
http://server_domain_or_IP/todo_list.phpJe zou een pagina zoals de volgende moeten ontvangen, waarop de inhoud te zien is die je in je testtabel hebt ingevoegd:
Dat betekent dat je PHP-omgeving klaar is om verbinding te maken en te communiceren met je MySQL-server.
Veelgestelde vragen
Waar wordt de LEMP-stack voor gebruikt?
De LEMP-stack host dynamische, op PHP gebaseerde websites en applicaties, waaronder WordPress, Laravel, Magento, Drupal en aangepaste PHP-projecten. Het is vooral effectief voor websites met veel verkeer die efficiënt gelijktijdige verbindingen moeten verwerken.
Wat is het verschil tussen LEMP- en LAMP-stacks?
LEMP gebruikt Nginx, dat verbindingen asynchroon afhandelt met een gebeurtenisgestuurde architectuur—efficiënt voor gelijktijdige gebruikers. LAMP gebruikt Apache, dat traditioneel een thread per verzoek aanmaakt (hoewel moderne Apache gebeurtenisgestuurde modes ondersteunt). LEMP biedt over het algemeen betere prestaties voor statische inhoud en scenarios met hoge gelijktijdigheid, terwijl LAMP eenvoudiger .htaccess-configuratie en bredere moduleondersteuning biedt.
Welke Ubuntu-versie moet ik gebruiken voor LEMP?
Ubuntu 22.04 LTS is het primaire doelwit van deze handleiding en bevat PHP 8.1, MySQL 8.0 en Nginx met langdurige ondersteuning. Ubuntu 24.04 LTS (laatste release) bevat standaard PHP 8.3 en werkt met deze handleiding door de PHP-FPM socketpaden en versienummers overeenkomstig aan te passen.
Hoe installeer ik de LEMP-stack op Ubuntu 24.04?
Volg deze kernstappen:
- Installeer Nginx:
sudo apt install nginx - Installeer MySQL:
sudo apt install mysql-server - Voer het MySQL-beveiligingsscript uit:
sudo mysql_secure_installation - Installeer PHP-FPM:
sudo apt install php-fpm php-mysql - Configureer Nginx-serverblok met PHP-FPM-integratie
- Test met
info.phpen databaseverbinding
Bekijk de volledige handleiding in de stappen 1-6 hierboven.
Welke versie van PHP moet ik installeren met Nginx en MySQL?
Gebruik de standaard PHP-versie van je Ubuntu-versie voor de beste compatibiliteit:
- Ubuntu 22.04: PHP 8.1 (geïnstalleerd via
php8.1-fpm) - Ubuntu 24.04: PHP 8.3 (pas de opdrachten aan naar
php8.3-fpmvoor deze versie)
Beide versies werken uitstekend met Nginx en MySQL 8.0, ondersteunen moderne frameworks en krijgen actieve beveiligingsupdates.
Hoe configureer ik Nginx om PHP-bestanden te verwerken?
Voeg een location ~ \.php$-blok toe aan je Nginx-serverconfiguratie dat PHP-verzoeken naar PHP-FPM via een Unix-socket doorstuurt:
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}Pas het socketpad aan op basis van jouw PHP-versie, test met sudo nginx -t, en laad opnieuw met sudo systemctl reload nginx.
Waarom krijg ik een "502 Bad Gateway"-fout nadat ik PHP-FPM heb geïnstalleerd?
502-fouten geven aan dat Nginx niet kan communiceren met PHP-FPM. Veelvoorkomende oorzaken:
- PHP-FPM draait niet: Controleer met
sudo systemctl status php8.1-fpmen start indien nodig - Verkeerd socketpad: Controleer of
/run/php/php8.1-fpm.sockbestaat en overeenkomt met je Nginx-configuratie - Probleem met machtigingen: Zorg ervoor dat de Nginx-gebruiker (www-data) toegang heeft tot de socket
- PHP-FPM configuratiefout: Controleer de logbestanden op
/var/log/php8.1-fpm.log
Oplossing: Start beide diensten opnieuw:
sudo systemctl restart php8.1-fpm nginxHoe beveilig ik MySQL na de installatie?
Voer het ingebouwde beveiligingsscript uit:
sudo mysql_secure_installationVolg de aanwijzingen om te:
- Schakel het wachtwoordvalidatieplugin in
- Stel een sterk rootwachtwoord in
- Verwijder anonieme gebruikers
- Schakel externe root-login uit
- Verwijder testdatabase
- Herlaad bevoegdheden
Voor applicatiedatabases, maak speciale gebruikers aan met beperkte rechten in plaats van het root-account te gebruiken.
Kan ik meerdere websites draaien op één LEMP-server?
Ja, maak aparte Nginx-serverblokken voor elk domein:
- Maak directory aan:
sudo mkdir -p /var/www/second_domain - Maak een serverblok aan:
sudo nano /etc/nginx/sites-available/second_domain - Configureer met unieke
server_nameenrootrichtlijnen - Inschakelen:
sudo ln -s /etc/nginx/sites-available/second_domain /etc/nginx/sites-enabled/ - Test en herlaad:
sudo nginx -t && sudo systemctl reload nginx
Elke site kan aparte PHP-instellingen en databasegebruikers hebben.
Hoe kan ik PHP upgraden naar een nieuwere versie?
Ubuntu-pakketupdates behandelen automatisch kleine versies. Voor upgrades van hoofdversies:
Voeg de PHP PPA van Ondřej toe (vertrouwde externe repository):
sudo add-apt-repository ppa:ondrej/php sudo apt updateInstalleer nieuwe PHP-FPM-versie:
sudo apt install php8.3-fpm php8.3-mysql -yUpdate het Nginx-configuratie socketpad naar
/run/php/php8.3-fpm.sockTest en herlaad Nginx
Verwijder indien gewenst de oude versie:
sudo apt purge php8.1-fpm
Test altijd eerst in de stagingomgeving voordat u productiesystemen bijwerkt.
Veelvoorkomende problemen oplossen
502 Fout bij Gateway
Het meest voorkomende LEMP-stapelpuntprobleem doet zich voor wanneer Nginx niet met PHP-FPM kan communiceren:
Controleer PHP-FPM-status:
sudo systemctl status php8.1-fpmControleer socketpad:
ls -la /run/php/De verwachte uitvoer moet het php8.1-fpm.sock-bestand tonen.
Veelvoorkomende oplossingen:
- Herstart PHP-FPM:
sudo systemctl restart php8.1-fpm - Controleer of het socketpad van het Nginx-serverblok overeenkomt met de daadwerkelijke PHP-FPM-socket
- Controleer de bestandsrechten:
sudo chown www-data:www-data /run/php/php8.1-fpm.sock
Toestemming geweigerd-fouten
Webdirectory permissies herstellen:
sudo chown -R www-data:www-data /var/www/your_domain
sudo chmod -R 755 /var/www/your_domainMySQL-verbindingproblemen
MySQL root-wachtwoord resetten:
sudo mysql
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'new_password';
FLUSH PRIVILEGES;
EXIT;Controleer MySQL-service:
sudo systemctl status mysqlPHP verwerkt niet
Controleer PHP-modules:
php -m | grep -E 'mysql|fpm'Controleer PHP-FPM-configuratie:
sudo nginx -t
sudo php-fpm8.1 -tFouten 404 oplossen:
- Controleer of
index.phpis opgenomen in de Nginxindex-directive - Controleer of het bestand bestaat:
ls -la /var/www/your_domain/ - Controleer Nginx-foutlogboeken:
sudo tail -f /var/log/nginx/error.log
Conclusie
In deze gids heb je een flexibele basis opgebouwd voor het aanbieden van PHP-websites en -toepassingen aan je bezoekers, met Nginx als webserver en MySQL als databasesysteem. Je kunt dit ook doen met een Apache-webserver; bekijk onze handleiding over hoe je de Linux, Apache, MySQL, PHP (LAMP) stack op Ubuntu installeert. Je kunt je site ook beveiligen met Let’s Encrypt, dat gratis, vertrouwde certificaten levert. Leer hoe je dit doet met onze gids over Let’s Encrypt voor Apache.
Bedankt dat je samen met de Linux-Console.net-community hebt geleerd.



