Mehrere PHP-Versionen auf einem Linux-Server (mit PHP-FPM)

Bislang dachte ich immer mehrere PHP-Versionen auf einem Server nebeneinander laufen zu lassen ist nicht so einfach… da hab ich mich wohl getäuscht!

Grundsätzlich läuft PHP meistens als Apache-Modul. Das heißt der Apache hat direkt eine Shared-Lib (.so) in seinem Speicher geladen mit der er PHP-Programmcode ausführen kann. Der Vorteil dieser Lösung liegt auf der Hand: Sie ist schnell. Der Nachteil ist leider auch klar: Jeglicher PHP-Programmcode wird mit den Rechten des Users ausgeführt, der Apache gestartet hat (bei Ubuntu: www-data). Außerdem kann es immer nur EINE PHP-Version geben.

Die Lösung um diese Probleme nennt sich PHP-FPM. PHP-FPM ist dabei quasi genausoschnell wie das Apache-Modul.
Wie’s funktioniert? Ganz einfach: Es stehen immer ein paar PHP-Prozesse rum (die nun auch unter dem Wunschuser laufen können) die gerade nichts tun. Wenn der Apache PHP-Programmcode bekommt kippt er diesen einfach in den entsprechenden Socket und einer der Prozesse führt ihn aus.

Hier also die Anleitung wie man sowas in einem Ubuntu 16.04 Xenial Xerus hinbekommt:

Erstmal installieren wir php7.0 und php5.6. Das kriegen wir auf dem Repository Ondřej Surý:

add-apt-repository ppa:ondrej/php
apt-get update
apt-get install libapache2-mod-fastcgi php5.6-fpm php5.6 php5.6-mcrypt php5.6-mbstring php5.6-mysql php5.6-zip php5.6-gd php5.6-xml php7.0-fpm libapache2-mod-fastcgi php7.0-fpm php7.0 php7.0-mcrypt php7.0-mbstring php7.0-mysql php7.0-zip php7.0-gd php7.0-xml

Wenn nun alles geklappt hat sollten beide FastProcess-Manager laufen:

systemctl status php5.6-fpm
systemctl status php7.0-fpm

Die Logdateien finden sich hier:

/var/log/php5.6-fpm.log
/var/log/php7.0-fpm.log

Die globalen Konfigurationsdateien hier:

/etc/php/5.6/fpm/php-fpm.conf
/etc/php/7.0/fpm/php-fpm.conf

Die Konfigurationsdateien für die einzelen Sites (pools) hier:

/etc/php/5.6/fpm/pool.d/www.conf
/etc/php/7.0/fpm/pool.d/www.conf

Wir verstellen an dem Default-Pool (www) nichts und aktivieren ihn, also folgende Befehle ausführen:

a2enmod actions 
a2enmod fastcgi

Und nun folgendes in die Datei ‚/etc/apache2/sites-enabled/000-default.conf‘ ganz oben schreiben (Beispielhaft für irgendeine Config von irgendeiner Apache-Webseite):

<IfModule mod_fastcgi.c>
  AddHandler php56-fcgi-www .php
  Action php56-fcgi-www /php56-fcgi-www
  Alias /php56-fcgi-www /usr/lib/cgi-bin/php56-fcgi-www
  FastCgiExternalServer /usr/lib/cgi-bin/php56-fcgi-www -socket /run/php/php5.6-fpm.sock -pass-header Authorization

  <Directory "/usr/lib/cgi-bin">
     Require all granted
  </Directory>
</IfModule>

<IfModule mod_fastcgi.c>
   AddHandler php70-fcgi-www .php
   Action php70-fcgi-www /php70-fcgi-www
   Alias /php70-fcgi-www /usr/lib/cgi-bin/php70-fcgi-www
   FastCgiExternalServer /usr/lib/cgi-bin/php70-fcgi-www -socket /run/php/php7.0-fpm.sock -pass-header Authorization

   <Directory "/usr/lib/cgi-bin">
      Require all granted
   </Directory>
</IfModule>

<IfModule mod_fastcgi.c>
   <FilesMatch ".+\.ph(p[345]?|t|tml)$">
      SetHandler php70-fcgi-www
   </FilesMatch>
</IfModule>

Apachen neustarten:

systemctl restart apache2

Und je nachdem ob ihr in der Datei nun das hier:

SetHandler php70-fcgi-www

oder das hier:

SetHandler php56-fcgi-www

stehen habt wird eure Seite mit PHP7 oder PHP5.6 ausgeführt.

In der Konfig-Datei für die Pools könnt ihr nun noch konfigurieren unter welchem User der PHP-Prozess ausgeführt wird, wieviele PHP-Prozesse vorgehalten werden, ob ihr ein Logfile über langsame PHP-Script mitführen wollt (slowlog) und ihr könnt alle Parameter aus der php.ini übersteuern (php_admin_value, php_flag, php_admin_flag).

Alles deutlich einfacher als ich gedacht habe!

PS: Die laufenden PHP Prozesse könnt ihr mitsamt ihrem Pool-Namen im Output von ‚ps‘ gut sehen:

4 S root      php-fpm: master process (/etc/php/5.6/fpm/php-fpm.conf)
5 S www-data  php-fpm: pool www
5 S www-data  php-fpm: pool www
4 S root      php-fpm: master process (/etc/php/7.0/fpm/php-fpm.conf)
5 S www-data  php-fpm: pool www
5 S www-data  php-fpm: pool www

 

 

26 Antworten auf „Mehrere PHP-Versionen auf einem Linux-Server (mit PHP-FPM)“

  1. Danke für die knappe aber vollständige Anleitung.

    Die Installation und Konfiguration funktioniert bei mir auch auf Ubuntu 14.04 genau so und läuft seit heute problemlos.

  2. Hallo,
    ist es möglich auch noch zussätzlich eine zweite PHP 5 Version laufen zu lassen. Für eine Migration benötige ich PHP 5.3 und PHP 5.6.

    Grüße
    Stefan

    1. Hallo Stefan,

      prinzipiell ist das Problemlos möglich. ABER bei PHP 5.3 sieht es echt dunkel aus.
      PHP 5.3 ist ja schon seit zwei Jahren EOL.
      An deiner Stelle würde ich meine PHP 5.3 Codes nehmen, auf einer PHP 5.6 einspielen und dann Stück für Stück die nicht kompatiblen Teile umbauen.

      Spricht da was dagegen?

      Thomas

      1. Hallo Thomas,

        es geht um einen alten WebShop der noch unter PHP 5.3 läuft. Der soll migriert werden auf eine neue Version und dann PHP 5.6. Damit der Shop bei der Übernahme ohne Fehler läuft, benötige ich zwischenzeitlich begrenzt PHP 5.3. Anschließend kann der die Version dann wieder gelöscht deinstalliert werden.

        Danke und Grüße
        Stefan

        1. Hallo Stefan,

          ich denke PHP 5.3 und 5.6 ist nicht sooo weit auseinander. Hast du schonmal probiert den Shop direkt auf PHP 5.6 laufen zu lassen?

          Wenn du unbedingt PHP 5.3 willst müsstest du es wahrscheinlich von Hand kompilieren, ich finde es auf Anhieb nicht in irgendwelchen Paketquellen.

          Thomas

          1. Hi Thomas,
            da hast du sicher recht. Da aber ein Dienstleister für uns das Shopupgrade macht, will eine 100%ig laufende Kopie des Shops haben. So fängt nachher das Theater an wegen der vielen selbstgebauten Modulen, die dann vielleicht nicht mehr fehlerfrei laufen.
            Grüße Stefan

            1. Also wie ich auch suche, ein PPA für PHP5.3 scheint es nicht mehr zu geben, und wenn dann nur für veraltete Versionen. Runterladen und selbst compilieren scheint mir der einzig gangbare Weg zu sein wenn es unbedingt PHP 5.3 sein muss.
              Du solltest halt aufpassen auch alle Module die auf der alten Maschine existieren wieder mit zu compilieren 🙂

        2. Hallo Stefan,
          möglicherweise ist diese Antwort schon zu spät. 😉 Aber vielleicht hilft es anderen, die vor einer ähnlichen Aufgabe stehen.

          Grundsätzliche Vorgehensweise:
          Im Netz nach den entsprechenden Changelogs suchen, hier im Beispiel wäre http://php.net/ChangeLog-5.php die richtige Anlaufstelle.
          Suche alle Funktionen die sich im Verhalten geändert haben oder weggefallen sind. Dann suche per „find & grep“ in deinem Code nach den Funktionen und ändere den Code entsprechend.

  3. Das ist bis jetzt die einzige Anleitung, bei der es bei mir auf Anhieb funktioniert hat. Vielen Dank.

    Eingerichtet habe ich es unter Ubuntu 16.04

  4. Hi,

    Muss man zwingend beide Versionen als fastcgi installieren, oder kann man php7 als apachemodule Laden und php5 als fastcgi?

    Gruß
    Hermann

    1. Hallo Hermann,

      selbstverständlich geht es auf eine PHP-Version als MOD-Apache laufen zu lassen und den Rest per FastCGI!

      Thomas

  5. Danke fürs Zusammenfassen der Schritte! Bei der Installation von libapache2-mod-fastcgi bekomme ich auf 14.04 LTS allerdings immer einen Fehler:
    dpkg: error processing package libapache2-mod-fastcgi (–configure):
    subprocess installed post-installation script returned error exit status 1
    E: Sub-process /usr/bin/dpkg returned an error code (1)

    Eine Idee in welche Richtung ich suchen sollte? Danke….

    1. Hallo Christoph,

      klingt für mich so als würde beim Configure des Packetes was schief laufen. Guck doch mal in die ‚/var/log/dpkg.log‘. Da steht hoffentlich was genau schief gelaufen ist…

      Thomas

  6. Hallo Thomas,

    kurze Frage, bin mit Apache2 und den Moduldefinitionen noch nicht so vertraut. Wenn ich Virtuelle Host erstelle, dann muss ich die Angaben

    SetHandler php70-fcgi-www

    Innerhalb des Blocks machen, um nur die PHP-Bearbeitung für diesen Virtuellen Host zu ändern?

    Gruß
    Simon

  7. Hallo Simon,

    so ist es!
    Wenn es nicht gehen sollte kannst mir gerne ein detailiertes Beispiel schicken und ich probier es auf einem Testserver aus!

    Thomas

  8. Hallo Thomas,

    auch von mir vielen Dank für die einfache Anleitung.

    Leider ist mein Verständnis nicht ausreichend um beide Versionen zu konfigurieren. Ich wollte bei mir zwei Ordner für die verschiedenen PHP Versionen anlegen: /var/www/html/php56 und /var/www/html/php70. Je nachdem welchen Ordner ich aufrufe, soll dementsprechend die gewünschte PHP-Version ausgeführt werden.

    Jetzt habe ich dafür wie Du beschrieben hast am Anfang der 000-default.conf den genanten Code vorab eingefügt und dann im VirtualHost folgende Zeilen ergänzt:

    Options Indexes FollowSymLinks MultiViews
    AllowOverride All
    SetHandler php56-fcgi-www

    Options Indexes FollowSymLinks MultiViews
    AllowOverride All
    SetHandler php70-fcgi-www

    Leider bekomme ich über phpinfo() in beiden Ordner immer die PHP 7.0 angezeigt. Was mache ich falsch?

    Liebe Grüße
    Bernd

  9. Hallo Bernd,

    für mich hört sich das schon alles richtig an.
    Hast du mal im phpinfo() gecheckt ob du evtl. doch Mod-PHP aktiv hast?
    Wenn du ‚apache2ctl -M‘ eingibst sollte ‚php7_module (shared)‘ nicht auftauchen.

    Thomas

  10. Irgendwie klappt das nicht. Wenn ich das in die default-config reinschreibe, funktioniert es in diesem vhost. Was mache ich aber für weitere vhost-configs? Wo setze ich den Sethandler rein?

  11. Hallo, vielen Dank für die tolle Anleitung. Ich stehe auch vor dem Problem, dass ich auf meinem Ubuntu 16.04 php7 und php5.6 laufen lassen muss.

    Ich müsste aber beides im Apache Modul laufen lassen. Ist das möglich und wie müsste dann die config des virtualhosts aussehen?
    Wenn das nicht geht, wie müsste es ausshen wenn ich php7 in apache module laufen lasse und php5.6 in fast-cgi?

    Für Hilfe wäre ich sehr dankbar. Gruß und einen schönen Sonntag.

    1. Hallo Phatair,

      beides als Modul laufen lassen geht nicht. Ich würde php7 ganz normal als Modul einrichten und dann nachträglich den PHP 5.6 Fastcgi installieren.

      Je nachdem ob du dann
      SetHandler php70-fcgi-www
      oder
      SetHandler application/x-httpd-php

      in der config stehen hast wird entweder das Modul genutzt oder der FastCGI Handler.

      Thomas

  12. Hallo
    Das ist eine Klasse anleitung

    Wollte mal auf diesen Wege frage ob es auch möglich ist diese beiden php version um weitere zu erweitern als noch welche nach zu installieren

    1. Natürlich kann man soviele PHP Versionen wie man will parallel laufen lassen, diese müssen eben nur in extra Pfaden sein und per FPM erreichbar sein. Diese könnten sogar auf einem anderen Server liegen…

      Thomas

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.