Host flere nettsteder med NGINX og HTTPS
Installer NGINX på Ubuntu 26.04, sett opp to separate nettsteder, test routingen og aktiver HTTPS med Certbot.
Denne guiden setter opp to statiske nettsteder på én Ubuntu 26.04-VPS. Hvert domene får egen document root, NGINX server block, access log, error log og TLS-sertifikat.
Bytt ut app.example.com og docs.example.net med domener du kontrollerer i alle kommandoer og config-filer.
Før du begynner
- Du har en Ubuntu 26.04-VPS og en vanlig bruker med sudo-tilgang.
- Du har fulgt grunnoppsettet for en sikker VPS.
- Hvert domene har en A-record som peker til VPS-ens IPv4-adresse.
- Du bruker bare AAAA-record hvis IPv6 er satt opp på VPS-en.
- TCP-port 80 og 443 er åpne i en eventuell firewall hos leverandøren.
Installer dig hvis kommandoen mangler (sudo apt install dnsutils). Sjekk DNS A-records før du ber om sertifikater:
dig +short A app.example.com
dig +short A docs.example.net
Begge resultatene må inneholde VPS-ens offentlige IPv4-adresse. Hvis du har satt opp AAAA-records, sjekk hvert domene med dig +short AAAA og bekreft at resultatet inneholder VPS-ens offentlige IPv6-adresse.
Installer NGINX og Certbot
sudo apt update
sudo apt install nginx certbot python3-certbot-nginx
sudo systemctl enable --now nginx
sudo systemctl status nginx --no-pager
Hvis UFW er aktiv, tillater du SSH før du aktiverer den. Deretter åpner du for webtrafikk:
sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full'
sudo ufw enable
sudo ufw status verbose
Reglene i UFW og en eventuell firewall hos leverandøren må samsvare.
Opprett en mappe for hvert nettsted
sudo install -d -o "$USER" -g www-data -m 0755 /var/www/app.example.com/public
sudo install -d -o "$USER" -g www-data -m 0755 /var/www/docs.example.net/public
Opprett /var/www/app.example.com/public/index.html:
<!doctype html>
<html lang="no">
<head><meta charset="utf-8"><title>App</title></head>
<body><h1>App</h1></body>
</html>
Opprett /var/www/docs.example.net/public/index.html:
<!doctype html>
<html lang="no">
<head><meta charset="utf-8"><title>Dokumentasjon</title></head>
<body><h1>Dokumentasjon</h1></body>
</html>
Filene trenger bare lesetilgang for www-data-gruppen. Ikke gi skrivetilgang til alle på document root.
Sett opp det første domenet
Opprett /etc/nginx/sites-available/app.example.com:
server {
listen 80;
listen [::]:80;
server_name app.example.com;
root /var/www/app.example.com/public;
index index.html;
access_log /var/log/nginx/app.example.com.access.log;
error_log /var/log/nginx/app.example.com.error.log;
location / {
try_files $uri $uri/ =404;
}
}
Sett opp det andre domenet
Opprett /etc/nginx/sites-available/docs.example.net:
server {
listen 80;
listen [::]:80;
server_name docs.example.net;
root /var/www/docs.example.net/public;
index index.html;
access_log /var/log/nginx/docs.example.net.access.log;
error_log /var/log/nginx/docs.example.net.error.log;
location / {
try_files $uri $uri/ =404;
}
}
Aktiver begge nettstedene og fjern standardoppsettet:
sudo ln -s /etc/nginx/sites-available/app.example.com /etc/nginx/sites-enabled/app.example.com
sudo ln -s /etc/nginx/sites-available/docs.example.net /etc/nginx/sites-enabled/docs.example.net
sudo unlink /etc/nginx/sites-enabled/default
sudo nginx -t
sudo systemctl reload nginx
nginx -t må fullføres uten feil før hver reload.
Test routing mellom domenene
Test NGINX lokalt før du blander inn offentlig DNS og TLS:
curl --fail --header 'Host: app.example.com' http://127.0.0.1/
curl --fail --header 'Host: docs.example.net' http://127.0.0.1/
Det første svaret skal inneholde App, og det andre skal inneholde Dokumentasjon. Hvis begge viser samme innhold, sjekker du de aktiverte server block-filene og verdiene for server_name.
Aktiver HTTPS
Be om ett sertifikat per domene når DNS fungerer offentlig:
sudo certbot --nginx -d app.example.com
sudo certbot --nginx -d docs.example.net
Velg redirect fra HTTP til HTTPS når Certbot spør. Test deretter config, begge nettstedene og automatisk fornyelse:
sudo nginx -t
curl --fail --head https://app.example.com/
curl --fail --head https://docs.example.net/
sudo certbot renew --dry-run
systemctl list-timers 'certbot*'
Certbot oppdaterer riktig server block og installerer en timer for fornyelse. Dry run skal fullføres uten feil.
Deploy og drift
Last opp hvert nettsted til sin egen public-mappe. Test alltid config før reload, og bruk loggen for riktig domene når en request feiler:
sudo nginx -t
sudo systemctl reload nginx
sudo tail -n 100 /var/log/nginx/app.example.com.error.log
sudo tail -n 100 /var/log/nginx/docs.example.net.error.log
Hold Ubuntu og NGINX oppdatert, ta backup av innhold og NGINX-config, og monitorer sertifikatfornyelsen. Legg til flere nettsteder ved å gjenta stegene for mappe, server block, routing-test og sertifikat. Ikke bygg videre i config-filen til et annet nettsted.
Se flere nettsteder med NGINX for valg av serverstørrelse når nettstedene deler vert.
Kilder: NGINX request processing, Ubuntu NGINX server blocks og Certbot med NGINX.