# Nginx-configuratie van een Laravel- of PHP-site aanpassen

> Zo schrijft Vimonto Deploy de Nginx-configuratie van je site, pas je die veilig aan met nginx -t en automatische rollback, en voeg je extra directives toe.

Elke site in Vimonto Deploy heeft een eigen Nginx-configuratie: één bestand met de server blocks voor de domeinen, HTTPS en de applicatie. Vimonto Deploy schrijft dit bestand voor je en houdt het bij als je domeinen, certificaten of instellingen wijzigt.

De pagina **Nginx** van een site toont de configuratie en laat je die aanpassen. Elke wijziging wordt met `nginx -t` getest voordat ze live gaat; keurt Nginx haar af, dan blijft de vorige configuratie actief. Je vindt de pagina in de zijbalk van de site onder **Nginx**.

![De Nginx-pagina van een site met de gegenereerde server blocks in een code-editor en de knop Testen en opslaan](https://ops.vimonto.com/docs-media/nl/site-nginx.webp?v=161e760d "De Nginx-configuratie van een site")

## Waar staat de configuratie op de server?

| Pad | Wat het is |
| --- | --- |
| `/etc/nginx/sites-available/site-{id}` | De configuratie van de site. `{id}` is het nummer van de site in Vimonto Deploy; het pad staat bovenaan de pagina. |
| `/etc/nginx/sites-enabled/site-{id}` | Een symlink naar het bestand hierboven, waardoor Nginx het laadt. |
| `/etc/nginx/vimonto-conf/site-{id}/*.conf` | Extra directives, geladen binnen het server block van de site. |
| `/var/log/nginx/site-{id}-access.log` en `-error.log` | De request- en foutlogs van de site, te lezen op de pagina [Logs](https://ops.vimonto.com/docs/nl/sites/logs). |

Pas deze bestanden niet met de hand aan op de server: de volgende keer dat Vimonto Deploy de configuratie schrijft, worden je wijzigingen overschreven. Pas de configuratie aan op de Nginx-pagina, of zet extra directives in de include-map.

## Wat staat er in de gegenereerde configuratie?

De gegenereerde configuratie hangt af van de domeinen, het certificaat en het type van de site.

- **Domeinen.** De site wordt geserveerd op haar eigen domeinen en haar gegenereerde adres. De www-instelling van elk domein wordt een redirect block, bijvoorbeeld van `www.example.com` naar `example.com`. Zie [domeinen en SSL](https://ops.vimonto.com/docs/nl/sites/domains-and-ssl).
- **HTTPS.** Met een actief certificaat beantwoordt poort 80 alleen Let's Encrypt-challenges en stuurt al het andere door naar HTTPS. Het HTTPS-block luistert op poort 443 met HTTP/2 (`listen 443 ssl http2;`, wat werkt op de Nginx van elke ondersteunde Ubuntu-versie), TLS 1.2 en 1.3, een gedeelde TLS-sessiecache en een HSTS-header (`max-age=31536000`).
- **Webroot.** `root` wijst naar de webmap van de site in de live release, bijvoorbeeld `/home/vimonto/example.com/current/public`.
- **Logs.** Elke site schrijft een eigen access- en errorlog.
- **Include.** De include-map voor extra directives wordt binnen het server block geladen.
- **Applicatie.** Hangt af van het sitetype:

| Sitetype | Wat de configuratie doet |
| --- | --- |
| Laravel en PHP | Stuurt requests die niet bij een bestand horen naar `index.php` en geeft PHP via een Unix-socket door aan PHP-FPM. Laravel-sites sturen ook 404-fouten naar `index.php`. |
| Statisch | Serveert bestanden en probeert `$uri`, `$uri/` en `$uri.html`, anders een 404. |
| Node.js | Stuurt elk request door naar je app op `127.0.0.1` en de poort die je instelt, met WebSocket-ondersteuning en `X-Forwarded-*`-headers. |
| Load balancer | Stuurt elk request door naar de app-servers in een `upstream`-block, of antwoordt `503` zolang er geen zijn. Zie [load balancing](https://ops.vimonto.com/docs/nl/sites/load-balancing#hoe-de-nginx-configuratie-eruitziet). |

- **Beveiliging.** Verborgen bestanden zoals `.env` en `.git` worden geweigerd, behalve `/.well-known`. Requests voor `favicon.ico` en `robots.txt` worden niet gelogd.
- **Achter een load balancer.** Op een app-server achter een van je [load balancers](https://ops.vimonto.com/docs/nl/sites/load-balancing) vertrouwt de site die balancer, en alleen die, voor het IP-adres van de bezoeker (`set_real_ip_from`) en voor HTTPS (`X-Forwarded-Proto`). Heeft een site daar een eigen certificaat, dan serveert hij de balancer ook over gewone HTTP in plaats van hem door te sturen naar HTTPS, zodat de twee elkaar niet in een kringetje rondsturen; alle anderen krijgen nog steeds de doorverwijzing.

Een ingekort voorbeeld voor een Laravel-site met HTTPS:

```nginx
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name example.com;

    ssl_certificate /etc/letsencrypt/live/certificate-3/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/certificate-3/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers off;
    ssl_session_timeout 1d;
    ssl_session_cache shared:VimontoSSL:10m;
    add_header Strict-Transport-Security "max-age=31536000" always;

    root /home/vimonto/example.com/current/public;
    index index.html index.htm index.php;
    charset utf-8;

    access_log /var/log/nginx/site-12-access.log;
    error_log /var/log/nginx/site-12-error.log error;

    # Extra directives for this site, kept when the config is written again.
    include /etc/nginx/vimonto-conf/site-12/*.conf;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    error_page 404 /index.php;

    location ~ \.php$ {
        fastcgi_pass unix:/run/php/php8.4-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        fastcgi_param DOCUMENT_ROOT $realpath_root;
        include fastcgi_params;
        fastcgi_hide_header X-Powered-By;
        fastcgi_read_timeout 120;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }
}
```

Door `$realpath_root` ziet PHP de echte releasemap in plaats van de symlink `current`, zodat een nieuwe release wordt gebruikt zodra die live gaat. Een [geïsoleerde site](https://ops.vimonto.com/docs/nl/sites/site-settings#website-isolatie) gebruikt een eigen PHP-FPM-socket, `/run/php/site-{id}.sock`.

## Extra directives toevoegen zonder de configuratie te vervangen

Voor de meeste wijzigingen hoef je de configuratie zelf niet aan te passen. Zet een `.conf`-bestand in de include-map van de site, `/etc/nginx/vimonto-conf/site-{id}/`. Nginx laadt elk `.conf`-bestand daarin binnen het hoofd-server block van de site, en de map blijft bewaard wanneer Vimonto Deploy de configuratie opnieuw schrijft.

Om bijvoorbeeld security-headers toe te voegen, maak je in de [terminal](https://ops.vimonto.com/docs/nl/servers/terminal) het bestand `/etc/nginx/vimonto-conf/site-12/headers.conf` aan:

```nginx
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
```

Test en herlaad Nginx daarna met `sudo nginx -t && sudo systemctl reload nginx`, of klik bij Nginx op **Herladen** op de pagina [Services](https://ops.vimonto.com/docs/nl/servers/services) van de server.

[Sitefuncties](https://ops.vimonto.com/docs/nl/sites/site-features) gebruiken dezelfde map: **Wachtwoordbeveiliging**, **Reverb** en WordPress-**Beveiliging** schrijven daar elk een eigen bestand `feature-{key}.conf`.

## De configuratie aanpassen

1. Open de site en kies **Nginx** in de zijbalk.
2. Wijzig de configuratie in de editor.
3. Klik op **Testen en opslaan**, of druk op Cmd+S (Ctrl+S op Windows en Linux).

Opslaan draait als achtergrondtaak met de naam *Nginx-configuratie van* je domein *opslaan*:

1. Vimonto Deploy bewaart een kopie van de huidige configuratie en schrijft de jouwe.
2. Het voert `nginx -t` uit om de hele Nginx-configuratie te testen.
3. Slaagt de test, dan wordt Nginx herladen en wordt je configuratie opgeslagen.
4. Mislukt de test, dan wordt de vorige configuratie teruggezet, draait Nginx ongewijzigd door en mislukt de taak met **Nginx keurde de configuratie af; de vorige is nog actief**. De uitvoer van de taak toont de fout van `nginx -t`.

Een typfout kan de andere sites op de server dus nooit platleggen.

### Wat verandert er als je je eigen configuratie gebruikt?

Zodra je een eigen configuratie hebt opgeslagen, toont de pagina **Eigen configuratie**. Vanaf dan schrijft Vimonto Deploy de configuratie niet meer voor je, en beheer je deze zaken zelf:

- domeinen en aliassen, en de www-redirect;
- HTTPS: als je een certificaat installeert, vertelt de taak je welke certificaatpaden je zelf moet toevoegen;
- de webmap, de PHP-versie (de PHP-FPM-socket) en de poort van een Node.js-app, als je die wijzigt in de [site-instellingen](https://ops.vimonto.com/docs/nl/sites/site-settings);
- bij een load-balanced site de app-servers en de methode: wijzigingen op de pagina Load balancing worden opgeslagen maar niet toegepast, tot je de standaardconfiguratie terugzet;
- bij een site achter een load balancer de regels die de balancer vertrouwen.

Houd de regel `include /etc/nginx/vimonto-conf/site-{id}/*.conf;` in je configuratie. Zonder die regel kunnen de sitefuncties die Nginx-directives toevoegen niet worden aangezet.

> [!TIP]
> Gebruik liever de include-map dan een eigen configuratie. Je houdt automatische domeinen en HTTPS, en je directives blijven bij elke wijziging bewaard.

### De gegenereerde configuratie terugzetten

Klik op **Standaard herstellen** en bevestig. Je eigen wijzigingen gaan verloren, de gegenereerde configuratie wordt op dezelfde manier geschreven en getest, en Vimonto Deploy beheert de domeinen en HTTPS weer voor je.

## Wie kan de configuratie aanpassen?

Elk lid kan de configuratie lezen. Opslaan en herstellen vereisen het recht om sites te beheren (eigenaar, beheerder, manager en developer), en de site en server moeten actief zijn; anders is de editor alleen-lezen. Zie [leden en rollen](https://ops.vimonto.com/docs/nl/organization/members-and-roles).

## Veelgestelde vragen

### Hoe verhoog ik de uploadlimiet van mijn Laravel-site?

Wijzig de maximale uploadgrootte op de pagina [PHP](https://ops.vimonto.com/docs/nl/servers/php) van de server. Die stelt de uploadlimieten van PHP en `client_max_body_size` van Nginx in voor de hele server (standaard 64 MB), dus je hoeft de configuratie van de site niet aan te passen.

### Hoe voeg ik headers of redirects toe?

Gebruik de include-map voor headers (`add_header`) en eenvoudige redirects (`location = /old { return 301 /new; }`). Voor wijzigingen buiten het server block, zoals een nieuw `server`-block, pas je de configuratie aan op de Nginx-pagina.

### Waarom is mijn wijziging niet live gegaan?

Open de taak in de activiteit van de server of op de [activiteitenpagina](https://ops.vimonto.com/docs/nl/organization/activity) en lees de uitvoer van `nginx -t`. Die noemt het bestand en de regel die Nginx afkeurde.

### Kan ik de configuratie van elke site op een server zien?

De configuratie van elke site staat op haar eigen Nginx-pagina. Alle bestanden staan op de server in `/etc/nginx/sites-available`.
