Exemples de configurations pour Nginx

Cette page couvre des exemples de configurations Nginx à utiliser pour ownCloud. Veuillez noter que Nginx n’est pas officiellement supporté, et cette page est maintenue par la communauté. Merci aux contributeurs !

  • Vous devez insérer le code suivant dans votre fichier de configuration Nginx ;
  • la configuration suppose qu’ownCloud est installé dans /var/www/owncloud et qu’elle est accédée via http(s)://cloud.example.com ;
  • adaptez les paramètres server_name, root, ssl_certificate et ssl_certificate_key à vos votre configuration ;
  • assurez-vous que vos certificats SSL soient accessibles en lecture par le serveur (conulter la documentation du module SSL HTTP de nginx).
  • les instructions add_header sont prises du niveau courant et ne sont pas héritées d’un autre niveau ou propagées vers un autre niveau. Toutes les instructions add_header doivent être définies dans chaque niveau nécessaire. Pour une meilleure lisibilité, il est possible de déplacer les instructions d’ajout d’en-tête communes dans un fichier séparé et d’inclure ce fichier chaque fois que nécessiare. Cependant, chaque instruction add_header doit être écrite sur une seule ligne pour éviter les problèmes de connexion avec les clients de synchronisation.

Exemples de configurations

Faites attention aux retours à la ligne si vous copiez les exemples, car les lignes longues peuvent être modifiées par le formatage de la page.

Merci à @josh4trunks pour avoir fourni ces exemples de configuration.

Vous pouvez utiliser ownCloud en HTTP, mais nous vous encourageons vivement à utiliser SSL/TLS pour chiffrer tout votre trafic serveur et pour protéger les identifiants utilisateurs et les données en transit.

  • Supprimer le bloc serveur contenant la redirection ;
  • changer listen 443 ssl pour listen 80; ;
  • supprimer ssl_certificate et ssl_certificate_key ;
  • suppriimer fastcgi_params HTTPS on;.

ownCloud dans la racine Web de nginx

La configuration suivante doit être utilisée quand ownCloud est placé dans la racine Web de votre installation nginx.

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

server {
    listen 80;
    server_name cloud.example.com;
    # enforce https
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl;
    server_name cloud.example.com;

    ssl_certificate /etc/ssl/nginx/cloud.example.com.crt;
    ssl_certificate_key /etc/ssl/nginx/cloud.example.com.key;

    # Add headers to serve security related headers
    # Before enabling Strict-Transport-Security headers please read into this topic first.
    #add_header Strict-Transport-Security "max-age=15552000; includeSubDomains";
    add_header X-Content-Type-Options nosniff;
    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Robots-Tag none;
    add_header X-Download-Options noopen;
    add_header X-Permitted-Cross-Domain-Policies none;

    # Path to the root of your installation
    root /var/www/owncloud/;

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

    # The following 2 rules are only needed for the user_webfinger app.
    # Uncomment it if you're planning to use this app.
    #rewrite ^/.well-known/host-meta /public.php?service=host-meta last;
    #rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json last;

    location = /.well-known/carddav {
        return 301 $scheme://$host/remote.php/dav;
    }
    location = /.well-known/caldav {
        return 301 $scheme://$host/remote.php/dav;
    }

    location /.well-known/acme-challenge { }

    # set max upload size
    client_max_body_size 512M;
    fastcgi_buffers 64 4K;

    # Disable gzip to avoid the removal of the ETag header
    gzip off;

    # Uncomment if your server is build with the ngx_pagespeed module
    # This module is currently not supported.
    #pagespeed off;

    error_page 403 /core/templates/403.php;
    error_page 404 /core/templates/404.php;

    location / {
        rewrite ^ /index.php$uri;
    }

    location ~ ^/(?:build|tests|config|lib|3rdparty|templates|data)/ {
        return 404;
    }
    location ~ ^/(?:\.|autotest|occ|issue|indie|db_|console) {
        return 404;
    }

    location ~ ^/(?:index|remote|public|cron|core/ajax/update|status|ocs/v[12]|updater/.+|ocs-provider/.+|core/templates/40[34])\.php(?:$|/) {
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        fastcgi_param HTTPS on;
        fastcgi_param modHeadersAvailable true; #Avoid sending the security headers twice
        fastcgi_param front_controller_active true;
        fastcgi_pass php-handler;
        fastcgi_intercept_errors on;
        fastcgi_request_buffering off; # Disponible depuis nginx 1.7.11
    }

    location ~ ^/(?:updater|ocs-provider)(?:$|/) {
        try_files $uri $uri/ =404;
        index index.php;
    }

    # Adding the cache control header for js and css files
    # Make sure it is BELOW the PHP block
    location ~* \.(?:css|js)$ {
        try_files $uri /index.php$uri$is_args$args;
        add_header Cache-Control "public, max-age=7200";
        # Add headers to serve security related headers (It is intended to have those duplicated to the ones above)
        # Before enabling Strict-Transport-Security headers please read into this topic first.
        #add_header Strict-Transport-Security "max-age=15552000; includeSubDomains";
        add_header X-Content-Type-Options nosniff;
        add_header X-Frame-Options "SAMEORIGIN";
        add_header X-XSS-Protection "1; mode=block";
        add_header X-Robots-Tag none;
        add_header X-Download-Options noopen;
        add_header X-Permitted-Cross-Domain-Policies none;
        # Optional: Don't log access to assets
        access_log off;
    }

    location ~* \.(?:svg|gif|png|html|ttf|woff|ico|jpg|jpeg)$ {
        try_files $uri /index.php$uri$is_args$args;
        # Optional: Don't log access to other assets
        access_log off;
    }
}

ownCloud dans un sous-répertoire de nginx

La configuration suivante doit être utilisée quand ownCloud est placé dans un sous-répertoire de votre installation nginx.

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

server {
    listen 80;
    server_name cloud.example.com;
    # enforce https
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl;
    server_name cloud.example.com;

    ssl_certificate /etc/ssl/nginx/cloud.example.com.crt;
    ssl_certificate_key /etc/ssl/nginx/cloud.example.com.key;

    # Add headers to serve security related headers
    # Before enabling Strict-Transport-Security headers please read into this topic first.
    #add_header Strict-Transport-Security "max-age=15552000; includeSubDomains";
    add_header X-Content-Type-Options nosniff;
    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Robots-Tag none;
    add_header X-Download-Options noopen;
    add_header X-Permitted-Cross-Domain-Policies none;

    # Path to the root of your installation
    root /var/www/;

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

    # The following 2 rules are only needed for the user_webfinger app.
    # Uncomment it if you're planning to use this app.
    #rewrite ^/.well-known/host-meta /owncloud/public.php?service=host-meta last;
    #rewrite ^/.well-known/host-meta.json /owncloud/public.php?service=host-meta-json last;

    location = /.well-known/carddav {
        return 301 $scheme://$host/owncloud/remote.php/dav;
    }
    location = /.well-known/caldav {
        return 301 $scheme://$host/owncloud/remote.php/dav;
    }

    location /.well-known/acme-challenge { }

    location ^~ /owncloud {

        # set max upload size
        client_max_body_size 512M;
        fastcgi_buffers 64 4K;

        # Disable gzip to avoid the removal of the ETag header
        gzip off;

        # Uncomment if your server is build with the ngx_pagespeed module
        # This module is currently not supported.
        #pagespeed off;

        error_page 403 /owncloud/core/templates/403.php;
        error_page 404 /owncloud/core/templates/404.php;

        location /owncloud {
            rewrite ^ /owncloud/index.php$uri;
        }

        location ~ ^/owncloud/(?:build|tests|config|lib|3rdparty|templates|data)/ {
            return 404;
        }
        location ~ ^/owncloud/(?:\.|autotest|occ|issue|indie|db_|console) {
            return 404;
        }

        location ~ ^/owncloud/(?:index|remote|public|cron|core/ajax/update|status|ocs/v[12]|updater/.+|ocs-provider/.+|core/templates/40[34])\.php(?:$|/) {
            fastcgi_split_path_info ^(.+\.php)(/.*)$;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param PATH_INFO $fastcgi_path_info;
            fastcgi_param HTTPS on;
            fastcgi_param modHeadersAvailable true; #Avoid sending the security headers twice
            fastcgi_param front_controller_active true;
            fastcgi_pass php-handler;
            fastcgi_intercept_errors on;
            fastcgi_request_buffering off; # Disponible depuis nginx 1.7.11
        }

        location ~ ^/owncloud/(?:updater|ocs-provider)(?:$|/) {
            try_files $uri $uri/ =404;
            index index.php;
        }

        # Adding the cache control header for js and css files
        # Make sure it is BELOW the PHP block
        location ~* \.(?:css|js)$ {
            try_files $uri /owncloud/index.php$uri$is_args$args;
            add_header Cache-Control "public, max-age=7200";
            # Add headers to serve security related headers  (It is intended to have those duplicated to the ones above)
            # Before enabling Strict-Transport-Security headers please read into this topic first.
            #add_header Strict-Transport-Security "max-age=15552000; includeSubDomains";
            add_header X-Content-Type-Options nosniff;
            add_header X-Frame-Options "SAMEORIGIN";
            add_header X-XSS-Protection "1; mode=block";
            add_header X-Robots-Tag none;
            add_header X-Download-Options noopen;
            add_header X-Permitted-Cross-Domain-Policies none;
            # Optional: Don't log access to assets
            access_log off;
        }

        location ~* \.(?:svg|gif|png|html|ttf|woff|ico|jpg|jpeg)$ {
            try_files $uri /owncloud/index.php$uri$is_args$args;
            # Optional: Don't log access to other assets
            access_log off;
        }
    }
}

Suppression des messages de journalisation

Si vous voyez dans votre fichier journal des messages comme client denied by server configuration: /var/www/data/htaccesstest.txt, ajoutez cette section dans votre fichier de configuration nginx pour les supprimer:

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

Les fichiers JavaScript (.js) ou CSS (.css) ne sont pas servis correctement

Un problème courant avec les configurations personnalisées de nginx est que les fichiers JavaScript (.js) ou CSS (.css) ne sont pas servis correctement, conduisant à des erreurs 404 (Fichier non trouvé) et une interface Web non fonctionnelle.

Ceci peut être dû au bloc:

location ~* \.(?:css|js)$ {

n’étant pas placé après le bloc:

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

D’autres configurations personnalisées, comme la mise en cache des fichiers JavaScript (.js) ou CSS (.css) via gzip peuvent aussi provoquer de tels problèmes.

Ajustement des performances

nginx (<1.9.5) <ngx_http_spdy_module nginx (+1.9.5) <ngx_http_http2_module

Pour utiliser http_v2 avec nginx, vous devez vérifier deux choses :

1.) Ce module n’est pas intégré par défaut à cause d’une dépendance à la version openssl utilisée sur votre système. Il sera activé avec le paramètre de configuration --with-http_v2_module pendant la compilation. La dépendance devrait être vérifiée automatiquement. Vous pouvez vérifier la présence du module http_v2 avec la commande nginx -V 2>&1 | grep http_v2 -o. Un exemple de la manière de compiler nginx est décrit dans la section « Configuration de nginx avec le module nginx-cache-purge » ci-dessous.

2.) Si vous avez utilisé SPDY auparavant, la configuration de nginx doit être modifiée de listen 443 ssl spdy; pour listen 443 ssl http2;.

nginx : mises en cache des vignettes de la galerie d’ownCloud

Une des optimisations possible pour ownCloud avec nginx comme serveur Web est de combiner le cache FastCGI avec « Cache Purge », un module tiers de nginx qui donne la possibilité de purger les contenus de cahces FastCGI, proxy, SCGI et uWSGI. Ce mécanisme accélère la présentation des vignettes car il transfère les requêtes à nginx et minimise les invocations PHP qui auraient sans cela été faites pour chaque vignette à chaque fois.

La procédure suivante est basée sur un système Ubuntu 14.04. Vous pourriez avoir besoin de l’adapter en fonction de votre système d’exploitation et de sa version.

Note

Contrairement à Apache, nginx ne charge pas les modules dynamiquement. Tous les modules nécessaires doivent être compilés dans nginx. C’est une des raisons pour les perfomances de nginx. Nous supposeront qu’il existe déjà une configuration opérationnelle définie comme indiqué dans la documentation d’ownCloud.

Vérification du module nginx

Tout d’abord, il est nécessaire de vérifier si votre installation nginx contient le module nginx cache purge compilé:

nginx -V 2>&1 | grep ngx_cache_purge -o

Si la sortie contient ngx_cache_purge, vous pouvez continuer la configuration, sinon vous devez compiler manuellement nginx avec le module requis.

Compilation de nginx avec le module nginx-cache-purge

  1. Préparation:
cd /opt
wget http://nginx.org/keys/nginx_signing.key
sudo apt-key add nginx_signing.key
sudo vi /etc/apt/sources.list.d/nginx.list

Ajoutez les lignes suivantes (si elle est différente, remplacez {trusty} par le nom de votre distribution):

deb http://nginx.org/packages/mainline/ubuntu/ trusty nginx
deb -src http://nginx.org/packages/mainline/ubuntu/ trusty nginx

Puis exécutez la commande sudo apt-get update.

Note

Si vous êtes téméraire et que vous souhaitez installer les tous derniers paquets de nginx contenant les dernières fonctionnalités, vous devrez installer nginx à partir du dépôt principal. Sur la page d’accueil de nginx : « En général, vous devriez toujours déployer nginx à partir de sa branche principale ». Si vous voulez installer le nginx standard nginx à partir de dernière branche principale mais sans compiler de module supplémentaire, exécutez juste la commande sudo apt-get install nginx.

  1. Téléchargez les sources nginx à partir du dépôt ppa
cd /opt
sudo apt-get build-dep nginx
sudo apt-get source nginx
  1. Téléchargez le ou les modules à compiler et configurer les arguments de compilation
ls -la

Veuillez remplacer {release} par la version téléchargée:

cd /opt/nginx-{release}/debian

Si le dossier « modules » n’est pas présent :

sudo mkdir modules
cd modules
sudo git clone https://github.com/FRiCKLE/ngx_cache_purge.git
sudo vi /opt/nginx-{release}/debian/rules

Si elle n’est pas présente, ajoutez la ligne suivante tout en haut sous:

#export DH_VERBOSE=1:
MODULESDIR = $(CURDIR)/debian/modules

et à la fin de chaque commande configure, ajoutez:

--add-module=$(MODULESDIR)/ngx_cache_purge

N’oubliez pas d’ajouter une barre de fration inversée \ pour chaque ligne précédente. Les paramètres devraient maintenant ressembler à ceci:

--with-cc-opt="$(CFLAGS)" \
--with-ld-opt="$(LDFLAGS)" \
--with-ipv6 \
--add-module=$(MODULESDIR)/ngx_cache_purge
  1. Compilez et installez nginx
cd /opt/nginx-{release}
sudo dpkg-buildpackage -uc -b
ls -la /opt
sudo dpkg --install /opt/nginx_{release}~{distribution}_amd64.deb
  1. Vérifiez si la compilation et l’installation du module ngx_cache_purge ont réussi
nginx -V 2>&1 | grep ngx_cache_purge -o

Cette commande devrait maintenant afficher : ngx_cache_purge

Pour afficher la version de nginx ainsi que toutes les fonctionnalités compilées et installées:

nginx -V 2>&1 | sed s/" --"/"\n\t--"/g
  1. Bloquez la mise à jour de nginx par apt-get
sudo dpkg --get-selections | grep nginx

Pour chaque composant de nginx component listé, lancez sudo apt-mark hold <composant>.

  1. Vérifications régulières de mises à jour de nginx

Visitez régulièrement la page des nouvelles de nginx et reproduisez les étapes 2 à 5 en cas de mise à jour.

Configuration de nginx avec le module nginx-cache-purge

  1. Préparation Créez le répertoire où nginx stockera les vignettes mises en cache. Remplacez {path} par le chemin correspondant à votre configuration :
sudo mkdir -p /usr/local/tmp/cache
  1. Configuration
sudo vi /etc/nginx/sites-enabled/{your-ownCloud-nginx-config-file}

Ajoutez au début mais en dehors du bloc server{}:

# cache_purge
fastcgi_cache_path {path} levels=1:2 keys_zone=OWNCLOUD:100m inactive=60m;
map $request_uri $skip_cache {
     default 1;
     ~*/thumbnail.php 0;
     ~*/apps/galleryplus/ 0;
     ~*/apps/gallery/ 0;
}

Note

Veuillez adopter ou supprimer les expressions rgulières du bloc map en fonction de vos besoins et de votre version d’ownCloud. À la place des correspondances (mappings), vous pouvez utiliser autant d’instructions if que nécessaire dans votre bloc server{}:

set $skip_cache 1;
if ($request_uri ~* "thumbnail.php")      { set $skip_cache 0; }
if ($request_uri ~* "/apps/galleryplus/") { set $skip_cache 0; }
if ($request_uri ~* "/apps/gallery/")     { set $skip_cache 0; }

Ajoutez à l’intérieur du bloc server{}, comme dans cet exemple de configuration:

# cache_purge (with $http_cookies we have unique keys for the user)
fastcgi_cache_key $http_cookie$request_method$host$request_uri;
fastcgi_cache_use_stale error timeout invalid_header http_500;
fastcgi_ignore_headers Cache-Control Expires Set-Cookie;

location ~ \.php(?:$/) {
      fastcgi_split_path_info ^(.+\.php)(/.+)$;

      include fastcgi_params;
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
      fastcgi_param PATH_INFO $fastcgi_path_info;
      fastcgi_param HTTPS on;
      fastcgi_pass php-handler;

      # cache_purge
      fastcgi_cache_bypass $skip_cache;
      fastcgi_no_cache $skip_cache;
      fastcgi_cache OWNCLOUD;
      fastcgi_cache_valid  60m;
      fastcgi_cache_methods GET HEAD;
      }

Note

Note concernant le paramètre fastcgi_pass`` : adaptez à votre configuration. Dans cet exemple, un ``upstream a été défini dans un fichier de configuration globale de nginx. Cela peut ressembler à ceci:

upstream php-handler {
    server unix:/var/run/php5-fpm.sock;
    # or
    # server 127.0.0.1:9000;
  }
  1. Test de la configuration
sudo nginx -s reload
  • Lancez votre navigateur et videz le cache ;
  • connectez-vous à votre instance ownCloud, ouvrez l’application Galerie et déplacez-vous dans les dossiers pour observer la génération des vignettes pour la première fois ;
  • vous pouvez aussi observer, par exemple avec htop, la montée en charge de votre système lors de la génération des vignettes ;
  • rendez-vous dans une autre application, déconnectez-vous et reconnectez-vous ;
  • ouvrez à nouveau l’application Galrie et naviguez dans les dossiers où vous vous êtes rendus précédemment. Les vignettes devraient apparaître plus ou moins instantanément ;
  • htop ne montrera pas de charge processeur additionnelle lors du traitement, contrairement à précédemment.
Toute la documentation est sous licence Creative Commons Attribution 3.0 Unported license — Traduction : Cédric Corazza.