NextCloud12 auf debian 9 mit php7.0-fpm und apache2.4.25

Debian macht sich hervorragend als Web- und Mailserver. Schau auch in den " Tipps und Tricks"-Bereich.
Antworten
moose
Beiträge: 4
Registriert: 16.06.2017 13:23:41

NextCloud12 auf debian 9 mit php7.0-fpm und apache2.4.25

Beitrag von moose » 16.06.2017 14:17:44

Hallo zusammen,

ich bin zwar neu in diesem Forum, aber nicht bei debian - ist seit potato meine Lieblings-Distribution ;-)

Ich habe ein Problem damit, NextCloud12 unter debian 9 (stretch) mit Apache2.4.25 und php7.0-fpm ans Laufen zu bekommen.

Vorweg: nutze ich das Standard Apache Modul zur Einbindung von php funktioniert NextCloud12 einwandfrei!

Aus verschiedenen Gründen setze ich aber auf allen meinen produktiven Servern immer Apache mit php-fpm ein, aktuell unter Jessie Apache 2.4.10 mit php-fpm 5.6. Die Einbindung von php5-fpm in Apache2 erfolgte bis Jessie mit mod_fastcgi. Nur: in Stretch gibt es kein Paket libapache2-mod-fastcgi mehr! Hintergründen dazu findet ihr hier:
https://www.reddit.com/r/debian/comment ... n_stretch/

D.h., unter Stretch ist Apache mod_proxy_fcgi das Mittel der Wahl, um php7.0-fpm einzubinden, was via

ProxyPassMatch "^/(.*\.php(/.*)?)$" "unix:/var/run/php7-fpm.nextcloud.sock|fcgi://localhost/var/www/vhosts/nextcloud/htdocs"

oder

<LocationMatch "^/(.*\.php(/.*)?)$">
ProxyPassMatch unix:/var/run/php7-fpm.nextcloud.sock|fcgi://localhost/var/www/vhosts/nextcloud/htdocs
</LocationMatch>


soweit auch funktioniert.

Nun zu meinem Problem:

Betreibe ich Nextcloud12 mit Apache im "default" PHP-Modus, also ohne php7.0-fpm, funktioniert alles prima.

Stelle ich meine Konfiguration allerdings wie oben erwähnt auf php7.0-fpm um, funktioniert es nur noch teilweise. Teilweise bedeutet in diesem Fall, dass die Ausgabe einer Trivialdatei info.php, die nur die Funktion phpinfo() enthält, prima angezeigt wird. Bei Nextcloud bekomme zwar noch die Startseite der Installation zu sehen, aber danach geht's nicht mehr weiter.

1.Fehler:

Nach dem Aufruf von Nextcloud im Browser wird dort in der URL-Zeile https://nc.xyz.de/index.php/login angezeigt und im Fenster ein schlichtes "Access denied.". Das Error-Log von Apache zeigt auch den Grund (und einen Hinweis auf die Lösung gleich mit) an:

[proxy_fcgi:error] [pid XXXX] [client x.y.z.q:58717] AH01071: Got error 'Access to the script '/var/www/vhosts/nextcloud/htdocs/index.php/login' has been denied (see security.limit_extensions)\n'

Das lässt sich vermeiden/umgehen/abstellen, in dem man in der Konfigurationsdatei der entsprechenden php7.0-fpm-Instanz

/etc/php/7.0/fpm/pool.d/nextcloud.conf

durch Einfügen von

security.limit_extensions =

die Prüfung auf (ausschließliche) Verwendung bestimmter php-Version deaktiviert.

2. Fehler

Nach einem Reload von php7.0-fpm und apache2 erscheint dieser Fehler dann nicht mehr, dafür nach einem Reload im Browser folgender Text:

No input file specified.

Und im Apache-Error-Log steht dazu dann folgendes:

[proxy_fcgi:error] [pid XXXX] [client x.y.z.q:58717] AH01071: Got error 'Unable to open primary script: /var/www/vhosts/nextcloud/htdocs/index.php/login (No such file or directory)\n'

Und genau ab hier komme ich nicht mehr weiter, denn index.php ist ja eine Datei und kein Verzeichnis. Und insofern kann es darunter natürlich auch keine Unterzeichnisse geben ...

Interessant ist halt nur, dass das Ganze im default php-Modus, also ohne php-fpm, funktioniert. Hier erscheint dann einfach die NextCloud12 Login-Seite. (O.k., ich habe vorher natürlich die Berechtigungen für das htdocs-Verzeichnis von user/group nextcloud, unter der die php7.0-fpm Instanz läuft, auf www-data geändert).

Hat jemand von euch eine Idee, wo es klemmt und wie ich da weiterkomme? Ich hab' jetzt schon ein paar Stündchen gegoogelt und alles Mögliche ausprobiert, aber nichts hat bisher funktioniert. Bin für jeden Tipp dankbar!

Viele Grüße

moose
Zuletzt geändert von moose am 21.06.2017 23:44:11, insgesamt 4-mal geändert.

Benutzeravatar
novalix
Beiträge: 1909
Registriert: 05.10.2005 12:32:57
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: elberfeld

Re: NextCloud12 auf debian 9 mit php7.0-fpm und apache2.4.25

Beitrag von novalix » 16.06.2017 16:33:41

Ahoi,
ich bin ja so ein RegEx-Legastheniker.
Könnte aber sein, dass in Deiner LocationMatch-Direktive lediglich der abschschliessende Pfadtrenner fehlt.
Ich mache das mal ohne code-Tags wegen der Hervorhebung:
<LocationMatch "^/(.*\.php(/.*)?)$">
ProxyPassMatch unix:/var/run/php7-fpm.nextcloud.sock|fcgi://localhost/var/www/vhosts/nextcloud/htdocs/
</LocationMatch>
Falls es das nicht sein sollte, scheint es mir trotzdem mit der Konfiguration des DocumentRoot zusammen zu hängen, möglicherweise auch mit einer ausgeführten oder nicht ausgeführten RewriteRule in einer .htaccess.
Fröhliches Debuggen, niels
Das Wem, Wieviel, Wann, Wozu und Wie zu bestimmen ist aber nicht jedermannns Sache und ist nicht leicht.
Darum ist das Richtige selten, lobenswert und schön.

moose
Beiträge: 4
Registriert: 16.06.2017 13:23:41

Re: NextCloud12 auf debian 9 mit php7.0-fpm und apache2.4.25

Beitrag von moose » 19.06.2017 07:59:50

Hallo novalix,

besten Dank für deine Antwort und deinen Hinweis! Das mit dem Pfadtrenner war's nicht, leider. Und an den rewrite-Rules scheint es auch nicht zu liegen - habe versuchsweise mal alle deaktiviert. Durch erneutes stundenlandes googeln bin ich darauf gestoßen, dass

a) offenbar mehrere User das gleiche Problem haben (bin also nicht allein - freu :wink: ),
b) die Lösungsansätze dazu entweder nicht funktionieren oder
c) eine/die wirklich funktionierende Lösung nicht auffindbar ist.

Der bisher vielversprechendste Ansatz scheint mir zu sein, in der /etc/php/7.0/fpm/php.ini

cgi.fix_pathinfo = 1

zu setzten (default: 0). Damit erreiche ich zumindest schon mal, dass mir der Quelltext
der Datei index.php angezeigt wird. Aber eigentlich würde ich die index.php ja gerne auf dem Server auch ausführen ...

Viele Grüße

moose

PS Habe den Beitrag zusätzlich auch mal im Serversupportforum gepostet, da ich an anderer Stelle hier im Forum gelesen habe, dass dort mehr Webserver-Admins unterwegs wären. Ich rühr' mich, sobald ich mehr weiß.

Benutzeravatar
novalix
Beiträge: 1909
Registriert: 05.10.2005 12:32:57
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: elberfeld

Re: NextCloud12 auf debian 9 mit php7.0-fpm und apache2.4.25

Beitrag von novalix » 19.06.2017 10:23:53

moose hat geschrieben:Durch erneutes stundenlandes googeln bin ich darauf gestoßen, dass

a) offenbar mehrere User das gleiche Problem haben (bin also nicht allein - freu :wink: ),
b) die Lösungsansätze dazu entweder nicht funktionieren oder
c) eine/die wirklich funktionierende Lösung nicht auffindbar ist.
<snip>
PS Habe den Beitrag zusätzlich auch mal im Serversupportforum gepostet, da ich an anderer Stelle hier im Forum gelesen habe, dass dort mehr Webserver-Admins unterwegs wären. Ich rühr' mich, sobald ich mehr weiß.
Links fände ich gut.
Hast Du auch schon mal

Code: Alles auswählen

ProxyPassMatch unix:/var/run/php7-fpm.nextcloud.sock|fcgi://localhost/var/www/vhosts/nextcloud/htdocs/$1
probiert?
Das Wem, Wieviel, Wann, Wozu und Wie zu bestimmen ist aber nicht jedermannns Sache und ist nicht leicht.
Darum ist das Richtige selten, lobenswert und schön.

moose
Beiträge: 4
Registriert: 16.06.2017 13:23:41

Re: NextCloud12 auf debian 9 mit php7.0-fpm und apache2.4.25

Beitrag von moose » 19.06.2017 12:51:24

novalix hat geschrieben:Links fände ich gut.
Sorry, dachte nicht, dass das von Interesse ist. Wollte hier später nur die Lösung posten. Aber warum nicht:
https://serversupportforum.de/forum/web ... post382991
novalix hat geschrieben:Hast Du auch schon mal

Code: Alles auswählen

ProxyPassMatch unix:/var/run/php7-fpm.nextcloud.sock|fcgi://localhost/var/www/vhosts/nextcloud/htdocs/$1
probiert?
Ja, habe ich. Bringt leider auch nicht das gewünschte Ergebnis. Dennoch danke für deinen Vorschlag!

moose
Beiträge: 4
Registriert: 16.06.2017 13:23:41

Gelöst: NextCloud12 auf debian 9 mit php7.0-fpm und apache2.

Beitrag von moose » 21.06.2017 15:14:44

So, nun funktioniert es - endlich! Aber es war eine ganz schöne Viecherei ...

Denn das Problem bestand nicht nur aus einem (einzigen) Fehler, sondern in der Überlagerung von drei verschiedener Phänomene, auf die ich nachfolgend eingehen möchte:
  • Grundsätzlich gibt es zwei Möglichkeiten, php-fpm unter Debian Stretch in Apache 2.4 einzubinden: zum einen via ProxyPassMatch (ältere Methode) und zum anderen via SetHandler (aktuellere Methode, funktioniert ab Apache 2.4.10 auch mit Sockets). Aber: Die beiden Methoden unterscheiden sich darin, wie sie die PHP-Aufrufe an php[7.0]-fpm übergeben. Details dazu findet ihr z.B. hier:

    https://ma.ttias.be/apache-2-4-proxypas ... -htaccess/
    https://serverfault.com/questions/78540 ... sethandler
    https://httpd.apache.org/docs/2.4/mod/m ... _fcgi.html

    Aus den darin genannten Gründen habe ich mich dazu entschieden, ProxyPassMatch durch SetHandler zu ersetzen. In der Apache vhost.conf sieht das denn so aus:

    Code: Alles auswählen

    <FilesMatch \.php$>
       SetHandler "proxy:unix:/run/php/php7.0-fpm.nextcloud.sock|fcgi://localhost"
    </FilesMatch>
    
    Die Document root ist nach wie vor zusätzlich neben

    Code: Alles auswählen

    <Directory /var/www/vhosts/nextcloud/htdocs>
    via SetEnv definiert

    Code: Alles auswählen

    SetEnv HOME /var/www/vhosts/nextcloud/htdocs
    SetEnv HTTP_HOME /var/www/vhosts/nextcloud/htdocs
  • Die zweite Änderung ergibt sich aus neuen Security Features in PHP 7. Zitat:

    Code: Alles auswählen

    ; Limits the extensions of the main script FPM will allow to parse. This can
    ; prevent configuration mistakes on the web server side. You should only limit
    ; FPM to .php extensions to prevent malicious users to use other extensions to
    ; exectute php code.
    ; Note: set an empty value to allow all extensions.
    ; Default Value: .php
    ;security.limit_extensions = .php .php3 .php4 .php5 .php7
    
    Damit die PHP-Seiten von Nexcloud angezeigt und die Scripte ausgeführt werden, muss in der Konfigurationsdatei der php7.0-fpm-Instanz, unter der Nextcloud ausgführt werden soll, also z.B. /etc/php/7.0/fpm/pool.d/nexcloud.conf, folgende Zeile eingefügt werden:

    Code: Alles auswählen

    security.limit_extensions =
  • Die 3. Änderung ist erforderlich, weil php7 und php7.0-fpm die Variable PATH_INFO unterschiedlich setzen bzw. übergeben. Für Details verweise ich auf
    https://github.com/owncloud/core/issues/7719 . Hierin einfach mal nach

    Code: Alles auswählen

    $_SERVER['SCRIPT_NAME'],$_SERVER['PATH_INFO']
    suchen. Laut issue-tracker gibt es dafür bis heute keinen Fix für Owncloud und somit wohl auch nicht für Nextcloud. Einen Workaround habe ich nach langen Suchen in https://www.digitalocean.com/community/ ... fcgi-error gefunden, wenn auch in völlig anderem Kontext (Magento). Im konkreten Fall bedeutet das, dass in /etc/php/7.0/fpm/pool.d/nexcloud.conf noch folgende Zeile eingefügt werden muss:

    Code: Alles auswählen

    php_admin_value[cgi.fix_pathinfo] = 1
    Das überschreibt die default-Einstellung (0) in der php.ini von php7.0-fpm.
Und kaum hatte ich diese drei Änderungen durchgeführt, da lief Nextcloud 12 bei mir auch schon unter Debian 9 Stretch mit php7.0-pfm und Apache 2.4.25 :D

Übrigens, die meisten Infos zur Installation von Nextcloud, die ich gefunden habe, beziehen sich alle auf nginx statt Apache2. Warum ich trotzdem beim alten Webindianer geblieben bin, könnt ihr hier nachlesen: https://float64.uk/blog/2014/08/20/php- ... gi-ubuntu/. Und noch etwas zum Lesen über generelle Features von Apache 2.4 i.V.m. mod_proxy_fcgi und php-fpm: https://wiki.apache.org/httpd/PHP-FPM.

Ganz zum Schluss nochmal die wesentlichen Stelle meiner Apache-vhost-Konfiguration sowie meiner php7.0-fpm-Konfigurationsdatei:

1. Apache:

Code: Alles auswählen

<IfModule mod_ssl.c>
  <virtualhost *:443>
...

<Directory "/var/www/vhosts/nextcloud/htdocs/">
      AllowOverride All
      Options -Indexes +FollowSymlinks

      <IfModule mod_dav.c>
        Dav off
      </IfModule>

      SetEnv HOME /var/www/vhosts/nextcloud/htdocs
      SetEnv HTTP_HOME /var/www/vhosts/nextcloud/htdocs
    </Directory>

    <Directory "/var/www/vhosts/nextcloud/htdocs/data/">
      # just in case if .htaccess gets disabled
      Require all denied
    </Directory>

    <FilesMatch \.php$>
      SetHandler "proxy:unix:/run/php/php7.0-fpm.nextcloud.sock|fcgi://localhost"
    </FilesMatch>

  </virtualhost>
</IfModule>
2. php7.0-fpm:

Code: Alles auswählen

[nextcloud]

user = nextcloud
group = nextcloud

listen = /run/php/php7.0-fpm.nextcloud.sock

listen.owner = www-data
listen.group = www-data
...

;**********************
;* nexcloud (Ver. 12) *
;**********************
php_admin_value[open_basedir] = /var/www/vhosts/nextcloud/:/tmp/:/dev/

; Pass environment variables like LD_LIBRARY_PATH. All $VARIABLEs are taken from
; the current environment.
; Default Value: clean env
env[HOSTNAME] = $HOSTNAME
env[PATH] = /usr/local/bin:/usr/bin:/bin
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp

security.limit_extensions =
php_admin_value[cgi.fix_pathinfo] = 1
Ich hoffe, das hilft irgendwem (außer mir :wink: ) und erspart dir/euch stundenlanges Suchen und Ausprobieren!

Greetinx

moose
Zuletzt geändert von moose am 21.06.2017 23:37:37, insgesamt 5-mal geändert.

Benutzeravatar
ThorstenS
Beiträge: 2875
Registriert: 24.04.2004 15:33:31

Re: NextCloud12 auf debian 9 mit php7.0-fpm und apache2.4.25

Beitrag von ThorstenS » 21.06.2017 16:24:13

geil, danke dir! :THX:

Antworten