Webbserver

nginx-konfigurator

Välj typ av sajt, TLS och cache — få ett komplett server-block för /etc/nginx/sites-available som du kan testa med nginx -t.

/etc/nginx/sites-available/ngssc.se
# ngssc.se — klistra in i /etc/nginx/sites-available/ngssc.se
# och länka: ln -s /etc/nginx/sites-available/ngssc.se /etc/nginx/sites-enabled/

limit_req_zone $binary_remote_addr zone=rl_ngssc_se_65184945:10m rate=10r/s;

# HTTP: allt vidare till HTTPS
server {
    listen 80;
    listen [::]:80;
    server_name ngssc.se www.ngssc.se;
    return 301 https://ngssc.se$request_uri;
}

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name ngssc.se;
    ssl_certificate     /etc/letsencrypt/live/ngssc.se/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/ngssc.se/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 1d;

    root /var/www/ngssc.se;
    index index.html;
    client_max_body_size 8m;
    charset utf-8;

    gzip on;
    gzip_min_length 1024;
    gzip_vary on;
    gzip_comp_level 5;
    gzip_types text/plain text/css text/javascript application/javascript application/json application/xml image/svg+xml;

    add_header X-Content-Type-Options "nosniff" always;
    add_header Referrer-Policy "strict-origin-when-cross-origin" always;
    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

    # Innehållshashat statiskt: cacha ett år, immutable är säkert
    location ~* \.(?:css|js|woff2?|ttf|otf|avif|webp|png|jpe?g|gif|svg|ico)$ {
        expires 1y;
        add_header Cache-Control "public, immutable";
        add_header X-Content-Type-Options "nosniff" always;
        add_header Referrer-Policy "strict-origin-when-cross-origin" always;
        add_header X-Frame-Options "SAMEORIGIN" always;
        add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
        access_log off;
    }

    location / {
        limit_req zone=rl_ngssc_se_65184945 burst=20 nodelay;
        limit_req_status 429;
        try_files $uri $uri/ =404;
    }
}

# www → primärhost (undvik dubbla kanoniska adresser)
# Certifikatet måste täcka båda namnen: certbot --nginx -d ngssc.se -d www.ngssc.se
server {
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name www.ngssc.se;
    ssl_certificate     /etc/letsencrypt/live/ngssc.se/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/ngssc.se/privkey.pem;
    return 301 https://ngssc.se$request_uri;
}

Testa med nginx -t innan du laddar om. Certifikatet skapas eller förnyas med certbot --nginx -d ngssc.se -d www.ngssc.se — båda namnen måste stå med, annars varnar webbläsaren på www-adressen.

StegKommando
1. Skriv filensudo nano /etc/nginx/sites-available/ngssc.se
2. Aktiverasudo ln -s /etc/nginx/sites-available/ngssc.se /etc/nginx/sites-enabled/
3. Testasudo nginx -t
4. Ladda omsudo systemctl reload nginx
5. HTTPSsudo certbot --nginx -d ngssc.se -d www.ngssc.se

Vanliga frågor

Var lägger jag filen?
I /etc/nginx/sites-available/<domän>, länka den i /etc/nginx/sites-enabled/, kör nginx -t och ladda om med systemctl reload nginx.
Varför svarar omvänd proxy 502 (Bad Gateway)?
nginx når inte upstream. Kontrollera att adressen i proxy_pass stämmer, att tjänsten lyssnar på den porten (ss -ltnp) och att den svarar lokalt med curl.
Vad gör try_files i en single page app?
Okända sökvägar skickas till index.html så att klientens router tar dem. En statisk sajt bör i stället svara =404, annars indexeras trasiga länkar som sidor.
Var ska limit_req_zone ligga?
Zonen deklareras en gång i http-kontexten, till exempel i /etc/nginx/conf.d/. Själva limit_req används inne i location. Den här konfigurationen lägger zonen överst i filen, vilket nginx läser i http-kontext via sites-enabled.