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

WernerH

Member
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/comments/5tlynp/where_is_libapache2modfastcgi_in_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 dei Ausgabe einer Trivialdatei info.php, die nur die Funktion phpinfo() enthält, prima anzeigegt 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

Werner
 

WernerH

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

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:


  • Die zweite Änderung ergibt sich aus neuen Security Features in PHP 7. Zitat:
    Code:
    ; 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:
    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:
    $_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/questions/php7-0-fpm-magento-proxy_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:
    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 Strech mir 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-fpm-sockets-apache-mod-proxy-fcgi-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:
<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:
[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!

Viele Grüße

WernerH
 
Top