ownCloud 8 mit nginx und php7

Lesedauer: ~4 Minuten

ownCloud ist eine Software, welche es einem ermöglicht recht schnell und einfach auf dem eigenen Server eine Cloud zu installieren und zu verwalten. Die Installation von ownCloud unter der Verwendung des Webservers Apache2 ist dank der mitgelieferten .htaccess Dateien trivial. Unter nginx sieht die Sache allerdings anders aus.

Um alle Vorteile von nginx und php7 auszuspielen, nutze ich für beide Pakete nicht die Repositorys von Debian oder Ubuntu, sondern das Mainline Repository von nginx und das php Repository von Ondřej Surý. Für die Installation ist es weiterhin notwendig, dass man bereits einen SQL-Server konfiguriert und eine Datenbank für ownCloud angelegt hat.

Installation

Die Installationsanleitung stellt nur eine Richtung dar, wie man es machen kann. Zur Zeit befindet sich das php7 Projekt noch stark im Umbau und der Inhalt von Paketen kann sich ändern. Als grober Leitfaden sollte sich diese Anleitung trotzdem eignen.

sudo add-apt-repository ppa:nginx/development
sudo add-apt-repository ppa:ondrej/php
sudo apt-get update
sudo apt-get install nginx
sudo apt-get install php7.0 php7.0-fpm php7.0-gd php7.0-json php7.0-mysql php7.0-curl php7.0-intl php7.0-mcrypt

Die aktuelle Version von ownCloud kann von der offiziellen Website heruntergeladen werden. In diesem Fall handelt es sich dabei um die Version 8.2.2. Diese wird im Ordner /var/www/ abgelegt und entpackt.

cd /var/www/
wget https://download.owncloud.org/community/owncloud-8.2.2.tar.bz2
tar -xjf owncloud-8.2.2.tar.bz2
rm owncloud-8.2.2.tar.bz2

Damit ownCloud auch erreichbar ist, muss nun noch nginx konfiguriert werden. Hierfür wird eine neue Konfigurationsdatei in /etc/nginx/sites-available/ angelegt.

cd /etc/nginx/sites-available/
vim owncloud.conf

Die Datei wird dann mit folgendem Inhalt gefüllt. Hierbei gilt es natürlich solche Dinge wie den Domain-Namen zu ersetzen.

server {
    listen 80;
    root /var/www/owncloud;
    server_name DOMAIN;

    index index.php index.html index.htm;

    client_max_body_size 10G;
    fastcgi_buffers 64 4K;

    gzip off;

    rewrite ^/caldav(.*)$ /remote.php/caldav$1 redirect;
    rewrite ^/carddav(.*)$ /remote.php/carddav$1 redirect;
    rewrite ^/webdav(.*)$ /remote.php/webdav$1 redirect;

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

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

    location / {
        rewrite ^/.well-known/host-meta /public.php?service=host-meta last;
        rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json last;
        rewrite ^/.well-known/carddav /remote.php/carddav/ redirect;
        rewrite ^/.well-known/caldav /remote.php/caldav/ redirect;
        rewrite ^(/core/doc/[^\/]+/)$ $1/index.html;
        try_files $uri $uri/ index.php;
    }

    location ~ ^(.+?\.php)(/.*)?$ {
        try_files $1 = 404;
        fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$1;
        fastcgi_param PATH_INFO $2;
        include fastcgi.conf;
    }

    location ~ ^/(?:\.htaccess|data|config|db_structure\.xml|README){
    deny all;
    }

    location ~* \.(?:css|js)$ {
        add_header Cache-Control "public, max-age=7200";
        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;
        access_log off;
    }

    location ~* \.(?:jpg|jpeg|gif|bmp|ico|png|swf)$ {
        access_log off;
    }
}

Damit nginx die Konfiguration auch verwendet, muss diese auch im Ordner sites-enabled vorhanden sein. Hier bietet es sich an einen Symlink zu erstellen.

cd ../sites-enabled/
ln -s ../sites-available/owncloud.conf .
service nginx reload

Nun sollte ownCloud über die Domain erreichbar sein und man kann mit den dort angegebenen Installationsschritten fortfahren. Hier sei nun noch erwähnt, dass sich nach dieser Konfiguration ownCloud nur über den Port 80 und unverschlüsselt erreichen lässt. Dies ist nicht zu empfehlen!

Probleme mit webdav

Obwohl ownCloud gut mit php7 zusammenarbeiten sollte, gibt es hier und dort noch ein paar kleine Probleme. Vor allem das webdav Modul von ownCloud will noch nicht richtig mit php7 funktionieren. Dies ist allerdings unerlässlich, wenn man den ownCloud Client nutzen möchte oder eine andere Form der Synchronisierung verwendet. Hier kommt es dann zu Timeouts und Dateien werden nicht richtig übertragen.

Als Workaround kann man die nginx Konfiguration etwas anpassen und den Eintrag fastcgi_buffering off hinzufügen. Der geänderte php-Block in der owncloud.conf sieht dann folgendermaßen aus:

    location ~ ^(.+?\.php)(/.*)?$ {
        try_files $1 = 404;
    fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$1;
        fastcgi_param PATH_INFO $2;
        fastcgi_buffering off;
        include fastcgi.conf;
    }

Lädt man im Anschluss die Konfigurationen von nginx noch einmal neu, sollte es keine Probleme mehr mit der Dateisynchronisation und webdav geben. Das Problem ist den ownCloud Entwicklern bereits bekannt und soll in ownCloud 9 behoben werden.