KenntWas.de – Technische Tipps

Technische Informationen zu Linux, (Oracle-) Datenbanken und mehr

Owncloud mit nginx auf dem Raspberry PI: (1) Eine Geschichte in mehreren Teilen

| 19 Comments

Owncloud mit nginx, php5-fpm, apc auf dem Raspberry PI

Nachdem ich Owncloud mit dem Apache ausprobiert habe, war ich enttäuscht. Es war einfach viel zu langsam. Mit nginx funktioniert es gut, aber es ist einiges an Handarbeit erforderlich, weil der kleine Raspberry Pi etwas überfordert ist.

Deshalb wird dies eine Geschichte in mehreren Teilen.

Hier zunächst ein paar Mindmaps – Fortsetzung folgt.

Das Endergebnis ist dann ein kleiner Server mit Owncloud, der sich auch über ein Home-DSL sehr wacker schlägt.

 

Die Hardware

Owncloud soll auf dem Raspberry Pi laufen. Er benötigt wenig Strom (5Watt), keinen Kühler (wenn man nicht übertaktet), ist billig (40,-€). Da rattert und klappert kein Lüfter.

Als Datenspeicher setze ich neben der obligatorischen SD-Karte für das Betriebssystem bislang auch nur einen USB-Stick ein.

Der Raspberry Pi

Der Raspberry Pi

Die Hardware

Die Hardware

Mounten des USB-Sticks (per UUID)

Der USB-Stick – oder eine Festplatte – soll nach /data gemountet werden. Um zu verhindern, dass der Stick, z.B. bei Verwendung eines USB-Hubs, auch an die richtige Stelle gemountet wird, wenn der Stick mal in einem anderen Port steckt, sollte er mit seiner UUID in die /etc/fstab eingetragen werden.

  • Stick einstecken
  • Device ermitteln (/dev/sda1,…)
  • mit mount oder “cfdisk /dev/sda1”,.. überprüfen, ob es wirklich der richtige Stick ist
  • UUID mit “ls -l /dev/disk/by-uuid” ermitteln
  • in die fstab eintragen
# ls -l /dev/disk/by-uuid/
total 0
lrwxrwxrwx 1 root root 15 Jan  1  1970 1AF7-904A -> ../../mmcblk0p1
lrwxrwxrwx 1 root root 10 Aug 23 23:20 4aba080a-6f56-4607-ab39-9fbf447a8fa2 -> ../../sda1
lrwxrwxrwx 1 root root 15 Jan  1  1970 8fe3c9ad-c8f5-4b39-aec2-f6e8dba743e0 -> ../../mmcblk0p2

Eintrag in der /etc/fstab

# sudo cat /etc/fstab
proc            /proc           proc    defaults          0       0
/dev/mmcblk0p1  /boot           vfat    defaults          0       0
/dev/mmcblk0p2  /               ext4    defaults,noatime,nodiratime  0       0

# USB-Stick, 8GB
UUID=4aba080a-6f56-4607-ab39-9fbf447a8fa2 /data ext4    defaults,noatime,nodiratime        0       1
# a swapfile is not a swap partition, so no using swapon|off from here on, use  dphys-swapfile swap[on|off]  for that

Der mount-Befehl gibt dann wieder das Device aus. Aber das ändert sich halt, wenn der Stick in einem anderen Post steht. Die UUID ist weltweit eindeutig für die Partition auf dem Stick.

# sudo mount
/dev/sda1 on /data type ext4 (rw,noatime,nodiratime,user_xattr,barrier=1,data=ordered)

Die mount-Option noatime verringert die Zugriffe auf den Stick etwas und erhöht die Lebenszeit.

Home-DSL

Das die eigene Cloud von aussen erreichbar sein soll, müssen wir einige Dinge beachten. Oberste Priorität sollte aber immer die Sicherheit haben. Wenn der Server erst mal im Internet steht, gibt es schnell neue ‘Freunde’, die keine sind.

HOME-DSL

HOME-DSL

 

Das Betriebssystem: raspbian

Als Betriebssystem verwende ich raspbian, ein Ubuntu für den Rapsberry Pi. Über die Konfiguration habe ich ja bereits etwas geschrieben.

Das Betriebssystem: raspbian (Debian für den Raspberry Pi)

Das Betriebssystem: raspbian (Debian für den Raspberry Pi)

 

Software

Owncloud

Software: Owncloud

Software: Owncloud

Dazu später mehr.

 

Apache deaktivieren

Da wir einen anderen Webserver (nginx) einsetzen muss der apache2 deaktiviert werden. Am einfachsten geht das mit rcconf.

Apache2 auf dem RAspberry Pi: zu langsam

Apache2 auf dem RAspberry Pi: zu langsam

 

sudo aptitude install rcconf

sudo rcconf

Apache2 ausschalten, nginx und php5-fpm einschalten

Apache2 ausschalten, nginx und php5-fpm einschalten

Die Konfiguration bleibt dann auch bei nächsten boot erhalten.

Manuelles ausschalten

sudo service apache2 stop

Währen der Tests muss man php5-fpm und nginx oft mal ‘durchstarten’. Das geht am besten mit

service php5-fpm restart; service nginx restart

Byobu

Das auf den Raspberry Pi kein X laufen sollten (wg. Speicher, Performance) muss man sich halt über eine ssh verbinden.  Ich verwende dann gerne byobu, um schnell zwischen mehreren Konsolen umschalten zu können.

Mit Vertical Split kann man sich dann z.B. 3 wichtige Informationen in einem Text(!)-Fenster anzeigen lassen.

  • tail -f /var/log/nginx/access.log
  • tail -f /var/log/nginx/error.log
  • top  (mit Filter auf u=www-data)
sudo aptitude install byobu

nginx

Im Gegensatz zum Apache, der für jeden Request einen Worker-Prozess braucht, arbeitet nginx multi-threaded. Auf dem Raspberry Pi reichen 1-2 nginx-Prozesse aus. (Faustregel: ein Prozess pro CPU, der Raspberry Pi hat nur eine CPU). Beim Upload von Dateien per HTTP-Post vom Browser zum Server kann es schon mal eng werden, daher habe ich zwei nginx Prozesse konfiguriert. Der Download – auch mehrerer Dateien – bewältigt nginx mit Bravour (wenn php erst mal die Kontrolle abgegeben hat). Hier ist dann die Upload-Rate des DSL-Anschlusses der Flaschenhals.

Wenn der Apache mit eingebautem php für jeden Request einen neuen Prozess starten muss, wird es sehr träge auf dem Pi. (Obwohl der Apache auch Worker vorhalten kann).

nginx

nginx

PHP5 / FPM / APC

nginx ist wirklich sehr schnell und braucht wenig Speicher. Der Knackpunkt bei Owncloud ist php. Auf dem Raspberry Pi braucht jeder Aufruf so seine Zeit.

php5-fpm (FPM-Homepage, Wiki) ist ein fast-cgi Adapter für php. Über einen zentralen Serverprozess werden (statisch oder dynamisch) für jeden php-Request Prozesse vorgehalten.

nginx spricht dann über einen lokales Socket-‘File’ (fastcgi_pass unix:/var/run/php5-fpm.sock;) oder über einen lokalen Port (z.B. localhost:3000) mit dem php-fpm-Prozess. In grossen Installationen kann fhp-fpm auch auf einem anderen oder gar auf mehreren Servern laufen. nginx ist nichts anderes als ein proxy für php-fpm.

Gleichartige Methoden gibt es auch für den Apache.

PHP5 / FPM / APC

PHP5 / FPM / APC

 

APC-Stats

APC ist ein Bytecode-Cache für PHP: APC (Alternative PHP Cache) module for PHP 5.

Hier eine Beispielausgabe meiner APC-Stats. Zum Aufruf dieser Statistik muss man /usr/share/doc/php-apc/apc.php in das Document-Root (z.B. /var/www) kopieren und mittels browser aufrufen. Wenn der Server in Produktion geht, sollte man die Datei wieder löschen!

Ich verwende ihn bislang ohne Anpassungen (aptitude install php-apc).

APC-Stats auf dem Raspberry Pi (Klick zum Vergrössern)

APC-Stats auf dem Raspberry Pi (Klick zum Vergrössern)

 

Eingesetzte Software

  • owncloud-4.0.7
  • 2012-07-15-wheezy-raspbian
  • Daraus verwendete Pakete (nichts selbst kompiliert):
    • php-apc 3.1.9
    • php 5.4.4-2
    • php5-fpm 5.4.4-2
    • nginx  1.2.1
nginx version: nginx/1.2.1
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-log-path=/var/log/nginx/access.log --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --lock-path=/var/lock/nginx.lock --pid-path=/var/run/nginx.pid --with-pcre-jit --with-debug --with-http_addition_module --with-http_dav_module --with-http_geoip_module --with-http_gzip_static_module --with-http_image_filter_module --with-http_realip_module --with-http_stub_status_module --with-http_ssl_module --with-http_sub_module --with-http_xslt_module --with-ipv6 --with-sha1=/usr/include/openssl --with-md5=/usr/include/openssl --with-mail --with-mail_ssl_module --add-module=/nginx-1.2.1/debian/modules/nginx-auth-pam --add-module=/nginx-1.2.1/debian/modules/nginx-echo --add-module=/nginx-1.2.1/debian/modules/nginx-upstream-fair --add-module=/nginx-1.2.1/debian/modules/nginx-dav-ext-module

Fazit

Das war’s erst mal. Demnächst mehr. Vorschäge, Fragen, eigene Erfahrungen sind wie immer willkommen.

19 Comments

  1. Super Tutorial!

    – Wie würdest Du SSL für Nginx einrichten?
    – Funktioniert mit Deiner Konfiguration der Zugriff per WebDAV auf Deine Owncloud-Installation?

    Ich bekomme CalDAV- und CardDAV-Zugriffe per Enginx hin, WebDAV funktioniert beir mir noch nicht.

  2. * SSL für nginx
    – erkläre ich noch, gib mir bitte noch etwas Zeit (weiterer Artikel)
    – man muss port 443 und port 80 (beide) auf https schalten, sonst
    funktioniert der Mediaplayer nicht (der geht immer auf https: server :80)
    * WEBDAV
    – Ja es funktioniert auch über https
    * CALDEV- und CARDdev muss ich noch testen

    • Hallo,

      wann kommt ein entsprechendes Tutorial zu Ampache und Webdav mit nginx+ssl?
      Auch wenn mir die Webdav Adresse im Browser mit entsprechendem Hack richtig dargestellt wird, bekomme ich keine Verbindung über eine Windows 7 Netzwerkverbindung hin. Ampache verweigert mir über SSL ebenso den Dienst.

      Danke

      • Wahrscheinlich am Wochenende.
        – Mit Windows 7 habe auch noch Probleme, ich glaube das mag mein selbst erstelltes Zertifikat nicht.
        – Ampache ist zickig. Er will unbedingt auf port 80 (mit https) zugreifen. Auch wenn es ungewöhnlich ist, muss man deshalb den Webserver auf port 443 und 80 mit https laufen lassen. (Normalerweise würde man port 80 (http) auf https umleiten, damit ein normaler USer, der sich im Browser nur vertippt hat, auf der richtigen Seite landet).

        server {
        	listen   80; ## listen for ipv4; this line is default and implied
        	listen 443 default_server; 
        
        	ssl on;
        	ssl_certificate /etc/nginx/cert/myserver.cst;
        	ssl_certificate_key /etc/nginx/cert/private/myserver.key; 
              ..
        ...
        
        • Danke schonmal für die zügige Antwort.
          Hmm das ist aber extrem unpraktisch, ich habe für Ampache auch schonmal einen Hack die Tage gesichtet, bei dem die Authentifizierung weiterhin über ssl läuft, der stream dann über http, port 80 läuft, vielleicht finde ich den wieder.
          Ja ich weiß nicht warum Windows da so muckt, 3. Herstellersoftware läuft ohne Probleme, nur Windows will nicht. Ich frage mich aber warum sämtliche ssl nginx owncloud/sabredav Anleitungen Windows als Webdavclient vorschlagen, wenn es scheinbar nicht läuft ?! Auch ein Hinzufügen des eigenen certs zu den Vertrauenswürdigen Zertifikaten oder das Hinzufügen der url zu den Vertrauenswürdigen Websites hat nichts gebracht.

  3. Du empfiehlst, Nginx so zu konfigurieren, dass PHP5 nur dann verwendet wird, wenn wirklich benötigt.

    Fragen hierzu:
    1. Wie sieht die entsprechende Konfiguration aus (ich nehme an in nginx.conf)?
    2. Wie ist dieser “Decision-Point” für die Verwendung von PHP5 definiert? Kannst du einen Use-Case beschreiben?

    Danke.

  4. Bei der Verarbeitung von requests ist nginx viel schneller als php.
    Das ist vor Allem wichtig, beim Raspberry PI, weil der Prozessor (auch mit dem neuen Turbo-Mode)
    etwas ‘schwachbrüstig’ ist.
    Mir ist z.B. aufgefallen, dass für eigentlich statische Inhalte, wie .js und .css Dateien in der Standardkonfiguration immer wieder php bemüht wird. Das kostet zu viel (Prozessor-) Zeit.
    Wenn man das, was php an dieser Stelle macht (2 Verzeichnisse ersetzen, checksum berechnen)
    durch ein Script vorher erledigt und das ganze dann noch gezippt ablegt, kann nginx sofort liefern.

    • Hallo!
      Ich verstehe deine Begründung, aber ich kann das, was du als Workaround empfiehlst, nicht nachvollziehen in dem Sinne, dass ich nicht verstehe wie das praktisch umzusetzen ist.
      Kannst du genaure Instruktionen schreiben, wie du das meinst (gerne auch offline per Email).

      THX

  5. Ich schreibe da bald (heute Abend?)etwas zu.
    In dem Video
    kannst Du es dir schon mal anschauen (etwa in der Mitte).
    1. Ein Script (update_cache.sh) bereitet die .css und .js-Dateien auf ung zippt sie in ein spezielles Verzeichnis
    2. Alle .php Aufrufe (getfile…) werden in nginx auf die statischen Dateien umgeleitet
    bye

  6. @john.doe
    >zu dem ListenPort,sollte da bei nginx nicht noch “ssl” für ssl dahinter stehen?
    Ja, hast Recht:

    Since Nginx version 0.7.14 the preferred way of enabling SSL is by using the `ssl` parameter of the `listen` directive:

    server {
      listen 443 default_server ssl;
      ssl_certificate      /usr/local/nginx/conf/cert.pem;
      ssl_certificate_key  /usr/local/nginx/conf/cert.key;  
      ...
    
  7. Habe auch vor, owncloud auf Raspberry pi zu installieren. Bisher habe ich owncloud nur auf großem Rechner zuhause über DSL getestet, läuft auch gut, aber der Lärm nervt und zu viel Strom braucht er auch.

    Ein Problem habe ich aber dabei. Ich möchte mich mit meinem Laptop bzw. Smartphone sowohl von innen als auch von außen über denselben Hostnamen verbinden (z.B. über my-domain.dyndns.org) und so meinen Kalender und meine Kontakte synchronisieren. Das klappt aber leider nur von außerhalb, von innerhalb geht das nicht. Eine Erklärung dazu habe ich hier gefunden: http://serverfault.com/questions/73208/access-server-behind-router-with-external-ip-works-well-except-from-pc-in-same

    Aber leider steht dort keine Lösung, außer das über den DSL-Router zu steuern. Das geht bei mir aber nicht (Router bietet die Möglichkeit nicht). Gibt es da noch eine andere, elegante Lösung?

    • Hmm, das Problem habe ich nicht.
      Mein Router (linksys) schickt mich brav über das externe Interface,
      wenn ich den dyndns-Namen verwende.
      Das merkt man dann auch schon an der Geschwindigkeit.

      Vielleicht könnte man irgendwie mit der Namensauflösung tricksen:
      Wenn du in deinem Home-Netz bist, müsste der Nameserver die interne IP-Adresse rausgeben.
      Auf dem Laptop könnte man einen Eintrag in der hosts-Datei machen (geht auch unter Windows), aber so richtig praktikabel ist das nicht. Für dich zum Testen ist es wahrscheinlich auch immer unangenehm, weil du von zu hause nicht überprüfen kannst, ob alles richtig funktioniert.
      Eine elegante wirklich Lösung fällt mir da leider nicht ein.

  8. Schönen guten Morgen,

    ich prügel mich aktuell auch mit dem Thema rum und stehe gerade ein wenig mit der WeDAV Schnittstelle auf dem Schlauch, wobei owncloud sagt: “Dein Web-Server ist noch nicht für Datei-Synchronisation bereit, weil die WebDAV-Schnittstelle vermutlich defekt ist.”. nginx und php habe ich selbst kompiliert und auch das standard DAV und das Zusatzmodul hinzu gefügt, aber irgendwas möchte noch nicht. Kannst du mir deinen vhost Eintrag zukommen lassen? Wäre wirklich klasse….

    Besten Dank, Sven

  9. Hallo,
    empfiehlt es sich hier auch noch den SWAP zu vergrößern?

    Gruß RMTX99

    • Als swap habe ich 512MB; also genau so viel wie phys. RAM.
      Wird (bei mir) aber nicht genutzt.
      Man sollte auf jeden Fall alles so dimensinieren, das man mit den RAM hinkommt.
      Da es ja ein ‘Server’ ist, keinen Speicher an die GPU ‘verschwenden’.

      $ free
                total used free
      Mem: 496948 461824 35124
      Swap: 524284 4 524280

      $ grep mem /boot/config.txt
      gpu_mem=16

      $ tail -6 /etc/sysctl.conf
      # rpi tweaks
      #MN auf 10 gesetzt
      vm.swappiness=10
      #vm.min_free_kbytes = 8192
      vm.min_free_kbytes = 16384

      Siehe auch: swappiness.

Leave a Reply

Required fields are marked *.