Actus Circuit Libre
Posté le
⚙️ Hébergement

Configuration Nginx pour Nextcloud avec PHP-FPM, Whiteboard et Notify Push

Auteur

enter image description here

Cette page présente une configuration Nginx complète permettant d'héberger un serveur Nextcloud avec PHP-FPM 8.4, une architecture officiellement prise en charge par l'équipe Nextcloud et largement utilisée en production.

L'exemple proposé ci-dessous est destiné à une installation de Nextcloud directement à la racine du domaine (par exemple : https://cloud.example.fr/). Il intègre également les composants optionnels Notify Push pour les notifications en temps réel et Whiteboard / Excalidraw pour les tableaux blancs collaboratifs.

!!info Ces blocs doivent être commentés si vous ne les utilisez pas. !!

Avant de déployer cette configuration, plusieurs paramètres doivent être adaptés à votre environnement :

  • Vérifiez la directive upstream php-handler afin qu'elle corresponde au socket ou au port utilisé par votre installation PHP-FPM. Une erreur à ce niveau provoquera généralement un message 502 Bad Gateway.
  • Remplacez les valeurs des directives server_name par le nom de domaine réel de votre instance.
  • Adaptez la directive root au répertoire d'installation de Nextcloud sur votre serveur.
  • Modifiez les directives ssl_certificate et ssl_certificate_key afin de pointer vers votre certificat TLS et votre clé privée.
  • Assurez-vous que les fichiers de certificat sont lisibles par l'utilisateur exécutant Nginx.
  • Vérifiez soigneusement les retours à la ligne lors d'un copier-coller depuis cette page, certaines directives longues pouvant être tronquées ou mal interprétées.
  • Selon la distribution Linux, la version de PHP ou certains hébergements mutualisés, il peut être nécessaire d'activer cgi.fix_pathinfo=1 dans le fichier php.ini.

{nextcloud.conf}

# Dernière révision : 2026-04

# ---------------------------------------------------------------------
# PHP-FPM
# ---------------------------------------------------------------------
#
# Déclare le backend PHP utilisé par Nextcloud.
# Socket Unix recommandé pour de meilleures performances.

upstream php-handler {
    # server 127.0.0.1:9000;
    server unix:/run/php/php8.4-fpm.sock;
}

# ---------------------------------------------------------------------
# Cache des ressources statiques
# ---------------------------------------------------------------------
#
# Ajoute automatiquement le mot-clé "immutable" aux ressources
# contenant un paramètre de version (?v=xxxx).
#
# Cela permet aux navigateurs de conserver les fichiers très longtemps
# sans risque lors des mises à jour de Nextcloud.

map $arg_v $asset_immutable {
    "" "";
    default ", immutable";
}

# =====================================================================
# REDIRECTION HTTP -> HTTPS
# =====================================================================

server {
    listen 80;
    listen [::]:80;

    server_name cloud.example.fr;

    # Masque la version de Nginx
    server_tokens off;

    # Force l'utilisation du HTTPS
    return 301 https://$server_name$request_uri;

}

# =====================================================================
# SERVEUR HTTPS
# =====================================================================

server {
    listen 443 ssl;
    listen [::]:443 ssl;

    # Syntaxe moderne Nginx
    http2 on;

    server_name cloud.example.fr;

    # Répertoire racine de Nextcloud
    root /var/www/nextcloud;

# -----------------------------------------------------------------
# TLS / SSL
# -----------------------------------------------------------------

    # Certificat TLS
    ssl_certificate     /etc/letsencrypt/live/cloud.example.fr/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/cloud.example.fr/privkey.pem;

    # Active HSTS pendant 1 an
    add_header Strict-Transport-Security "max-age=31536000" always;

    # Décommentez uniquement après avoir lu :
    # https://hstspreload.org/
    #
    # add_header Strict-Transport-Security \
    # "max-age=31536000; includeSubDomains; preload" always;

    # Active l'OCSP Stapling
    ssl_stapling on;
    ssl_stapling_verify on;

    # Résolveurs DNS nécessaires au fonctionnement de l'OCSP Stapling
    resolver 1.1.1.1 1.0.0.1 valid=300s;
    resolver_timeout 5s;

    # Masque la version de Nginx
    server_tokens off;

    # -----------------------------------------------------------------
    # Taille des transferts
    # -----------------------------------------------------------------

    # Taille maximale d'upload
    client_max_body_size 1024M;

    # Délai maximal pour la réception du corps d'une requête
    client_body_timeout 300s;

    # Buffers FastCGI
    fastcgi_buffers 64 4K;

    # Optimisation HTTP/2 pour les uploads importants
    client_body_buffer_size 512k;

    # -----------------------------------------------------------------
    # Compression
    # -----------------------------------------------------------------

    # Compression gzip
    # Conserve les en-têtes ETag pour éviter les problèmes de cache

    gzip on;
    gzip_vary on;
    gzip_comp_level 4;
    gzip_min_length 256;

    gzip_proxied expired no-cache no-store private no_last_modified no_etag auth;

    gzip_types
        application/atom+xml
        text/javascript
        application/javascript
        application/json
        application/ld+json
        application/manifest+json
        application/rss+xml
        application/vnd.geo+json
        application/vnd.ms-fontobject
        application/wasm
        application/x-font-ttf
        application/x-web-app-manifest+json
        application/xhtml+xml
        application/xml
        font/opentype
        image/bmp
        image/svg+xml
        image/x-icon
        text/cache-manifest
        text/css
        text/plain
        text/vcard
        text/vnd.rim.location.xloc
        text/vtt
        text/x-component
        text/x-cross-domain-policy;

    # Si Nginx est compilé avec ngx_pagespeed,
    # il est recommandé de le désactiver pour Nextcloud.
    #
    # pagespeed off;

    # -----------------------------------------------------------------
    # En-têtes de sécurité
    # -----------------------------------------------------------------

    add_header Referrer-Policy                   "no-referrer"       always;
    add_header X-Content-Type-Options            "nosniff"           always;
    add_header X-Frame-Options                   "SAMEORIGIN"        always;
    add_header X-Permitted-Cross-Domain-Policies "none"              always;
    add_header X-Robots-Tag                      "noindex, nofollow" always;

    # Supprime l'en-tête révélant PHP
    fastcgi_hide_header X-Powered-By;

    # -----------------------------------------------------------------
    # Types MIME supplémentaires
    # -----------------------------------------------------------------

    include mime.types;

    types {
        text/javascript mjs;
        application/wasm wasm;
    }

    # -----------------------------------------------------------------
    # Gestion des index
    # -----------------------------------------------------------------
    #
    # Garantit le comportement attendu de Nextcloud
    # pour les répertoires et les URL réécrites.

    index index.php index.html /index.php$request_uri;

    # -----------------------------------------------------------------
    # Robots
    # -----------------------------------------------------------------

    location = /robots.txt {
        allow all;
        access_log off;
        log_not_found off;
    }

    # -----------------------------------------------------------------
    # Well-Known
    # -----------------------------------------------------------------
    #
    # Nécessaire pour CardDAV, CalDAV, ACME et autres services.

    location ^~ /.well-known {

        location = /.well-known/carddav {
            return 301 /remote.php/dav/;
        }

        location = /.well-known/caldav {
            return 301 /remote.php/dav/;
        }

        location /.well-known/acme-challenge {
            try_files $uri $uri/ =404;
        }

        location /.well-known/pki-validation {
            try_files $uri $uri/ =404;
        }

        return 301 /index.php$request_uri;
    }

    # -----------------------------------------------------------------
    # Protection des répertoires internes
    # -----------------------------------------------------------------

    location ~ ^/(?:build|tests|config|lib|3rdparty|templates|data)(?:$|/) {
        return 404;
    }

    location ~ ^/(?:\.|autotest|occ|issue|indie|db_|console) {
        return 404;
    }

    # -----------------------------------------------------------------
    # Traitement PHP
    # -----------------------------------------------------------------

    location ~ \.php(?:$|/) {

        # Compatibilité Nextcloud
        rewrite ^/(?!index|remote|public|cron|core\/ajax\/update|status|ocs\/v[12]|updater\/.+|ocs-provider\/.+|.+\/richdocumentscode(_arm64)?\/proxy) /index.php$request_uri;

        fastcgi_split_path_info ^(.+?\.php)(/.*)$;
        set $path_info $fastcgi_path_info;

        try_files $fastcgi_script_name =404;

        include fastcgi_params;
        fastcgi_pass php-handler;

        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $path_info;
        fastcgi_param HTTPS on;

        # Empêche l'envoi en double des en-têtes de sécurité
        fastcgi_param modHeadersAvailable true;

        # Active les URL simplifiées
        fastcgi_param front_controller_active true;

        # Laisse nginx gérer les erreurs envoyées depuis PHP-FPM. À désactiver pour debug.
        fastcgi_intercept_errors on;

        # PHP-FPM ne gère pas le chunked encoding
        fastcgi_request_buffering on;

        # Décommenter si des erreurs 504 apparaissent
        #
        # fastcgi_read_timeout 300s;
        # fastcgi_send_timeout 300s;
        # fastcgi_connect_timeout 300s;

        fastcgi_max_temp_file_size 0;
    }

    # -----------------------------------------------------------------
    # Ressources statiques
    # -----------------------------------------------------------------

    location ~ \.(?:css|js|mjs|svg|gif|ico|jpg|png|webp|wasm|tflite|map|ogg|flac)$ {

        try_files $uri /index.php$request_uri;

        add_header Cache-Control                    "public, max-age=15778463$asset_immutable";
        add_header Referrer-Policy                   "no-referrer"       always;
        add_header X-Content-Type-Options            "nosniff"           always;
        add_header X-Frame-Options                   "SAMEORIGIN"        always;
        add_header X-Permitted-Cross-Domain-Policies "none"              always;
        add_header X-Robots-Tag                      "noindex, nofollow" always;
        access_log off;
    }

    location ~ \.(otf|woff2?)$ {

        try_files $uri /index.php$request_uri;
        expires 7d;
        access_log off;
    }

    # =================================================================
    # CONFIG NEXTCLOUD WHITEBOARD / EXCALIDRAW
    # =================================================================

    location /whiteboard/ {

        proxy_pass http://localhost:3002/;

        proxy_http_version 1.1;

        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        # Support WebSocket
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }

    # =================================================================
    # CONFIG NEXTCLOUD NOTIFY PUSH
    # =================================================================

    location ^~ /push/ {

        proxy_pass http://localhost:7867/;

        proxy_http_version 1.1;

        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        # Support WebSocket
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";
    }

    # -----------------------------------------------------------------
    # Compatibilité Microsoft WebDAV
    # -----------------------------------------------------------------

    location = / {

        if ($http_user_agent ~ ^DavClnt) {
            return 302 /remote.php/webdav/$is_args$args;
        }
    }

    # -----------------------------------------------------------------
    # Redirection DAV
    # -----------------------------------------------------------------

    location /remote {
        return 301 /remote.php$request_uri;
    }

    # -----------------------------------------------------------------
    # Frontal Nextcloud
    # -----------------------------------------------------------------

    location / {
        try_files $uri $uri/ /index.php$request_uri;
    }

}