- Posté le
- • ⚙️ Hébergement
Configuration Nginx pour Nextcloud avec PHP-FPM, Whiteboard et Notify Push
- Auteur
-
-
- Utilisateur
- Thibaud
- Billets de cet auteur
- Billets de cet auteur
-

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-handlerafin 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_namepar le nom de domaine réel de votre instance. - Adaptez la directive
rootau répertoire d'installation de Nextcloud sur votre serveur. - Modifiez les directives
ssl_certificateetssl_certificate_keyafin 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=1dans le fichierphp.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;
}
}