Een Nginx-reverseproxy ontvangt verzoeken van websitebezoekers en stuurt ze door naar een andere server of applicatie. Deze wordt vaak gebruikt om applicaties die op poorten zoals 3000 draaien via een domeinnaam bereikbaar te maken, zonder hun interne poorten aan het internet bloot te stellen.
In deze handleiding configureer je Nginx op Ubuntu om verzoeken door te sturen naar een lokale applicatie, koppel je een domein en schakel je HTTPS in.
Wat is een Nginx-reverseproxy?
Een reverseproxy bevindt zich tussen bezoekers en je backendapplicatie.
In plaats van rechtstreeks verbinding te maken met een applicatie op poort 3000, maken bezoekers verbinding met Nginx via de standaardpoorten voor HTTP of HTTPS.
Nginx stuurt het verzoek door naar de applicatie en geeft het antwoord terug.
Het verloop van een verzoek ziet er zo uit:
Bezoeker → Nginx → Backendapplicatie
Deze opzet wordt vaak gebruikt voor Node.js, Python en andere webapplicaties. Ook kan deze TLS-terminatie, loadbalancing en gecentraliseerde verwerking van verzoeken ondersteunen.
Vereisten
Voordat je begint, heb je het volgende nodig:
- Een Ubuntu 24.04 LTS-server met sudo-toegang.
- SSH-toegang tot je server.
- Een domeinnaam die naar het openbare IP-adres van je server verwijst.
- Een backendapplicatie die op een lokale poort luistert.
In dit voorbeeld gebruiken we poort 3000.
Als SSH nieuw voor je is, lees dan onze beginnersgids voor SSH-commando’s voordat je verdergaat.

Stap 1: Installeer Nginx op Ubuntu
Maak via SSH verbinding met je Ubuntu-server.
Werk de pakketindex bij en installeer Nginx:
sudo apt update
sudo apt install nginx -y
Controleer of Nginx draait:
sudo systemctl status nginx
Je zou active (running) moeten zien.
Als Nginx niet is gestart, voer je het volgende uit:
sudo systemctl enable --now nginx
Je kunt ook het openbare IP-adres van je server in een browser openen. Als HTTP-toegang is toegestaan, zou de standaardwelkomstpagina van Nginx moeten verschijnen.
Als je UFW gebruikt, sta dan HTTP- en HTTPS-verkeer toe:
sudo ufw allow 'Nginx Full'
Controleer ook de firewallregels die je via je hostingprovider hebt ingesteld. Schakel de firewall niet uit om Nginx bereikbaar te maken.
Stap 2: Start een backendapplicatie om mee te testen
Voordat we de reverseproxy configureren, hebben we een applicatie nodig waarnaar Nginx verzoeken kan doorsturen.
Maak voor een eenvoudige test een tijdelijke map aan:
mkdir -p ~/nginx-proxy-test
cd ~/nginx-proxy-test
Maak een eenvoudige HTML-pagina aan:
echo '<h1>Nginx Reverse Proxy Works!</h1>' > index.html
Start nu de ingebouwde HTTP-server van Python:
python3 -m http.server 3000 --bind 127.0.0.1
Hiermee wordt je testpagina aangeboden op poort 3000, die alleen via het lokale loopback-adres bereikbaar is.
Laat deze terminal openstaan en start een tweede SSH-sessie.
Controleer of de applicatie reageert:
curl http://127.0.0.1:3000
Je zou het volgende moeten zien:
<h1>Nginx Reverse Proxy Works!</h1>
Deze Python-server dient alleen als demonstratie. Gebruik voor een productieapplicatie de aanbevolen applicatieserver en configuratie voor servicebeheer.
Stap 3: Maak een Nginx-reverseproxyconfiguratie
Maak een nieuw Nginx-serverblok aan:
sudo nano /etc/nginx/sites-available/app.example.com
Vervang app.example.com door je eigen domein.
Voeg de volgende configuratie toe:
server {
listen 80;
server_name app.example.com;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Sla het bestand op.
De configuratie begrijpen
listen 80accepteert HTTP-verzoeken.server_namegeeft aan voor welk domein Nginx verzoeken moet verwerken.proxy_passstuurt verzoeken door naar de applicatie op poort 3000.proxy_set_headergeeft nuttige informatie over het oorspronkelijke verzoek door aan de backend.
De backend moet doorgestuurde headers begrijpen en veilig verwerken. Stel applicaties alleen zo in dat ze deze headers vertrouwen wanneer verzoeken via je vertrouwde proxy binnenkomen.
Stap 4: Schakel de configuratie in en test deze
Schakel je nieuwe serverblok in:
sudo ln -s /etc/nginx/sites-available/app.example.com /etc/nginx/sites-enabled/
Als de link al bestaat, maak deze dan niet opnieuw aan.
Controleer de configuratie op fouten:
sudo nginx -t
Als de test slaagt, laad je de Nginx-configuratie opnieuw:
sudo systemctl reload nginx
Open nu:
http://app.example.com
Als DNS naar de juiste server verwijst en de testbackend nog draait, zou je het volgende moeten zien:
Nginx Reverse Proxy Works!
Als in plaats daarvan de standaardpagina van Nginx verschijnt, controleer dan de DNS-records van je domein en de configuratie van server_name.
Stap 5: Schakel HTTPS in met Let’s Encrypt
Gebruik voor een openbare website HTTPS in plaats van het verkeer onversleuteld te laten.
Controleer eerst of je domein naar de juiste server verwijst en of inkomend verkeer op poort 80 is toegestaan. Dit is belangrijk voor de standaardvalidatie van het certificaat via HTTP.
Installeer Certbot via de officiële methode met Snap:
sudo snap install --classic certbot
Als het commando certbot nog niet beschikbaar is, maak je de commandolink aan:
sudo ln -s /snap/bin/certbot /usr/local/bin/certbot
Vraag vervolgens een certificaat aan:
sudo certbot --nginx -d app.example.com
Volg de aanwijzingen. Certbot kan een certificaat verkrijgen en Nginx configureren om je domein via HTTPS aan te bieden.
Test daarna de certificaatvernieuwing:
sudo certbot renew --dry-run
Ga naar:
https://app.example.com
Je testapplicatie zou nu via een versleutelde verbinding moeten laden.
Stap 6: Controleer je reverseproxy
Controleer het HTTPS-antwoord:
curl -I https://app.example.com
Bij de Python-backend uit het voorbeeld geeft een HTTP-antwoord 200 OK aan dat het verzoek de applicatie heeft bereikt.
Je kunt ook controleren welke processen op je server naar verbindingen luisteren:
sudo ss -ltnp
Je Nginx-installatie zou moeten luisteren op de geconfigureerde openbare HTTP- en HTTPS-poorten, terwijl de backend uit het voorbeeld luistert op 127.0.0.1:3000.
Houd er rekening mee dat de tijdelijke Python-server stopt wanneer je de bijbehorende terminalsessie beëindigt. Productieapplicaties moeten onder een procesbeheerder zoals systemd draaien.
Veelvoorkomende problemen met een Nginx-reverseproxy
502 Bad Gateway
Dit betekent meestal dat Nginx geen geldig antwoord van de backend kon ontvangen.
Controleer of je applicatie draait en of de poort in proxy_pass klopt.
Onze handleiding over het oplossen van 502 Bad Gateway in Nginx gaat dieper in op logbestanden, upstreamservices en verbindingsproblemen.
504 Gateway Timeout
Een 504-fout treedt op wanneer de gateway niet op tijd het benodigde antwoord van de upstreamserver ontvangt.
Onderzoek trage applicatieverzoeken en de prestaties van de backend voordat je de time-outs verhoogt.
Bekijk onze handleiding voor het oplossen van 504 Gateway Timeout voor verdere instructies.
Het domein laadt niet
Controleer of het A-record van je domein naar het juiste openbare IP-adres verwijst, de relevante firewallpoorten openstaan en het Nginx-serverblok overeenkomt met de aangevraagde hostnaam.
Veelgestelde vragen
proxy_pass vertelt Nginx waarheen verzoeken moeten worden doorgestuurd, bijvoorbeeld naar een HTTP-applicatie die draait op 127.0.0.1:3000.
Ja. Je kunt verschillende domeinen, subdomeinen of URL-paden configureren om verzoeken door te sturen naar verschillende backendapplicaties.
Nee. Je kunt een reverseproxy testen met een IP-adres of lokaal. Met een domein wordt het echter eenvoudiger om je applicatie openbaar aan te bieden en een standaard HTTPS-certificaat te verkrijgen.
Ja. De opensourceversie van Nginx biedt reverseproxyfunctionaliteit zonder dat je een commerciële licentie nodig hebt.
Conclusie
Je hebt een Nginx-reverseproxy geconfigureerd op Ubuntu, verzoeken doorgestuurd naar een lokale applicatie en HTTPS ingeschakeld.
Je kunt dezelfde basisconfiguratie aanpassen voor Node.js, Python en andere HTTP-applicaties door het backendadres in proxy_pass te wijzigen.
Voordat je deze opzet in productie gebruikt, moet je ervoor zorgen dat je applicatie automatisch start, met passende machtigingen draait en over voldoende monitoring en beveiligingsmaatregelen beschikt.