Update 17.06.2016: Mittlerweile ist eine offizielle Konfiguration für das Betreiben von Owncloud mit nginx in einem Unterordner verfügbar. In diese sind auch einige Verbesserungen eingeflossen (die in der Apache-Konfiguration schon länger enthalten waren), so dass ich empfehle diese Konfiguration anstatt meiner zu benutzen:
https://doc.owncloud.org/server/8.2/admin_manual/installation/nginx_owncloud_8x.html#owncloud-in-a-subdir-of-nginx
Es folgt der ursprüngliche Beitrag, der zu einem Zeitpunkt geschrieben wurde, als es die oben genannte offizielle Konfiguration noch nicht gab.
Will man neben Owncloud noch andere Webdienste auf seinem Server laufen lassen, ist es sinnvoll, Owncloud in einem Unterordner (subfolder, subdirectory) des Webroot zu betreiben. Für den Webserver nginx findet sich in der Owncloud-Dokumentation für diesen Fall nur der Hinweis, die Konfiguration entsprechend anzupassen. Da bei der Anpassung ein paar Stolpersteine lauern, lohnt es sich systematisch vorzugehen.
Update 11.03.2016: Diese Anleitung gilt für Owncloud 8.2, die weiterhin als Grundlage für eine aktualisierte Anleitung für Owncloud 9.0 gilt. Diese aktualisierte Anleitung ist hier zu finden:
nginx-Konfiguration: Owncloud 9.0 im Unterordner des Webroot betreiben
1. Grundlage
Als Grundlage dient die offizielle nginx-Konfiguration der Owncloud-Webseite für Owncloud 8.2:
https://doc.owncloud.org/server/8.2/admin_manual/installation/nginx_configuration.html
Alle Änderungen dieser Anleitung erfolgen nur im ssl-Server-Block – also unterhalb der Zeilen:
server { listen 443 ssl;
2. Anweisungen in einen eigenen Owncloud-Location-Block verschieben
Zunächst wird fast alles von der ssl-Serverkonfiguration in einen eigenen location
-Block mit Unterblöcken verschoben, damit es nicht zu „Interferenzen“ mit location
-Blöcken von anderen Webdiensten auf demselben Server kommt. Folgendes muss allerdings im Server-Kontext stehen bleiben und wird nicht verschoben:
- grundlegende Servereinstellungen:
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; # Path to the root of your installation root /var/www/owncloud/;
- um eine Breach-Attacke maßgeblich zu erschweren, sollte die http-Komprimierung serverweit abgeschaltet sein (http://www.breachattack.com/#mitigations):
gzip off;
- die pagespeed Anweisung muss im server- oder http-Kontext stehen (https://developers.google.com/speed/pagespeed/module/configuration#nginx_specific):
#pagespeed off;
- all das, was für Clients im Wurzelverzeichnis auffindbar sein muss:
- Die vier(!) Weiterleitungen für Service Discovery
(Details siehe: https://tools.ietf.org/html/rfc5785#section-3):rewrite /.well-known/...
- Die Datei
robots.txt
kann entweder aus dem Owncloud-Ordner in das Webroot-Verzeichnis kopiert oder nach eigenen Wünschen selbst geschrieben werden
(Details siehe: https://de.wikipedia.org/wiki/Robots_Exclusion_Standard):location = /robots.txt {...}
- Die vier(!) Weiterleitungen für Service Discovery
Beim Verschieben wird wie folgt vorgegangen:
Die Zeile:location / {
wird umbenannt in:location ^~ /owncloud/ {
In diesen location
-Block werden alle oben nicht genannten Textblöcke aus dem server
-Kontext verschoben.
Anmerkung: durch das eingefügte ^~
werden Seitenaufrufe auf den Owncloud-Unterordner etwas beschleunigt, denn nginx beginnt sofort mit der Bearbeitung der Anfrage und sucht nicht noch weiter nach Treffern mit regulären Ausdrücken:
http://nginx.org/en/docs/http/ngx_http_core_module.html#location
3. Pfadangaben an Unterordner anpassen
Diese Verzeichnisstruktur kommt zur Anwendung:/var/www/
– das Root-Verzeichnis des Webservers./var/www/owncloud/
– der Ordner, in dem Owncloud liegt.
Folgende Pfade werden angepasst:
- Das root-Verzeichnis:
root /var/www/;
rewrite /.well-known/...
-Weiterleitungen (4x):
da diese URIs im root-Verzeichnis auffindbar sein müssen, wird nur beim Ziel der Weiterleitung ein/owncloud
vorangestellt. Beispiel:rewrite ^/.well-known/carddav /owncloud/remote.php/carddav/ permanent;
- Die Zeile:
rewrite ^(/core/doc/[^\/]+/)$ $1/index.html;
wird zu :rewrite ^(/owncloud/core/doc/[^\/]+/)$ $1/index.html;
- Jeder anderen Pfadangabe innerhalb von
location ^~ /owncloud/ {...}
wird ein/owncloud
voran gestellt. Steht vor der Pfadangabe ein^
, dann wird/owncloud
direkt danach (ohne Leerzeichen!) eingefügt.
Das Ergebnis sieht dann so aus:
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; # Path to the root of your installation root /var/www/; # 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; rewrite ^/.well-known/carddav /owncloud/remote.php/carddav/ permanent; rewrite ^/.well-known/caldav /owncloud/remote.php/caldav/ permanent; # 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 = /robots.txt { allow all; log_not_found off; access_log off; } location ^~ /owncloud/ { # Add headers to serve security related headers add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;"; 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; # set max upload size client_max_body_size 10G; fastcgi_buffers 64 4K; index index.php; error_page 403 /owncloud/core/templates/403.php; error_page 404 /owncloud/core/templates/404.php; rewrite ^/owncloud/remote/(.*) /owncloud/remote.php last; rewrite ^(/owncloud/core/doc/[^\/]+/)$ $1/index.html; try_files $uri $uri/ =404; location ~ ^/owncloud/(build|tests|config|lib|3rdparty|templates|data)/ { deny all; } location ~ ^/owncloud/(?:\.|autotest|occ|issue|indie|db_|console) { deny all; } 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_param modHeadersAvailable true; #Avoid sending the security headers twice fastcgi_pass php-handler; fastcgi_intercept_errors on; } # Adding the cache control header for js and css files # Make sure it is BELOW the location ~ \.php(?:$|/) { block location ~* \.(?:css|js)$ { add_header Cache-Control "public, max-age=7200"; # Add headers to serve security related headers add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;"; 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; # Optional: Don't log access to assets access_log off; } # Optional: Don't log access to other assets location ~* \.(?:jpg|jpeg|gif|bmp|ico|png|swf)$ { access_log off; } } }
4. Servereinstellungen den eigenen Gegebenheiten anpassen
Die folgenden 4 Angaben müssen an die eigenen Servergegebenheiten angepasst werden:
server_name cloud.example.com; ssl_certificate /etc/ssl/nginx/cloud.example.com.crt; ssl_certificate_key /etc/ssl/nginx/cloud.example.com.key; # Path to the root of your installation root /var/www/;
Nachdem nginx mit nginx -s reload
die Konfiguration neu eingelesen hat, müsste Owncloud im entsprechenden Unterverzeichnis aufgerufen werden können.
5. Hinweis: Vererbungssystem von nginx beachten
In einer nginx-Konfiguration werden Einträge an untergeordnete Ebenen vererbt (siehe https://blog.martinfjordvald.com/2012/08/understanding-the-nginx-configuration-inheritance-model/). Falls es neben dem Block location ^~ /owncloud/ {...}
noch andere location
-Blöcke (z.B. von anderen Webdiensten) gibt, sollten Einstellungen daher am Besten in der höchstmöglichen Ebene vorgenommen werden, um Dopplungen zu vermeiden. Eine Erklärung dazu findet sich auch unter: https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/#multiple-index-directives
Achtung: Arrays werden nur dann vom übergeordneten Level weitervererbt, wenn keine Direktiven im aktuellen Level definiert sind (betrifft hier add_header
und fastcgi_param
) – daher gibt es die add_header
-Dopplungen:
- unter
location /owncloud/
- und im untergordneten
location ~* \.(?:css|js)$
) mit einer zusätzlichen Angabe bezüglich Caching.
6. Optional: letzte kosmetische Maßnahmen
Um das ganze etwas weiter zu verschlanken, könnten diese beiden Zeilen:
include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
ersetzt werden durch:
include fastcgi.conf;
Details hierzu finden sich im Blog des nginx Entwicklers Martin Fjordvald:
https://blog.martinfjordvald.com/2013/04/nginx-config-history-fastcgi_params-versus-fastcgi-conf/
Außerdem könnten diese add_header
-Direktiven:
# Add headers to serve security related headers add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;"; 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;
in eine externe Datei (z.B. mit dem Namen add_header.conf
) auslagert und dann an den erforderlichen Stellen (2x) per include
eingebunden werden. Man müsste dann allerdings darauf achten, dass im Blocklocation ~* \.(?:css|js)$
zusätzlich zu dem neueninclude add_header.conf;
auch diese Zeile enthalten sein sollte:add_header Cache-Control "public, max-age=7200";
Diese letzten beiden Maßnahmen bringen – abgesehen von eventuell mehr Übersichtlichkeit – keine weiteren Vorteile mit sich.
7. Fazit
Mit dieser Anleitung sollte die Umstellung von Owncloud in einen Unterordner auch ohne tiefergehendes nginx-Wissen möglich sein. Wer sich weiter in nginx einarbeiten möchte, findet in der offiziellen Dokumentation eine gute erste Anlaufstelle: http://nginx.org/en/docs/