1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

2 unterschiedliche php-Versionen parallel?

Dieses Thema im Forum "FreeBSD - Anwendungen und Ports" wurde erstellt von thorwin, 12 April 2018.

  1. thorwin

    thorwin Member

    Registriert seit:
    5 Mai 2009
    Beiträge:
    314
    Ort:
    Darmstadt, Germany
    Moinsen,

    ich habe hier auf meinem Root-Server ein Jail, in dem alle meine Webanwendungen laufen (nginx + php-fpm). Momentan mit php7.2, das würde ich auch gerne beibehalten.

    Leider ist jetzt eine Anwendung dazugekommen, die nur mit php <= 7.0 sauber läuft. Da ich nur sehr ungern alles downgraden möchte, würde ich gerne php7.0 und php7.2 (jeweils plus einen Schwung Module) parallel betreiben. Geht das?

    Oder kann ich vielleicht alternativ 2 separate Jails mit php-fpm Instanzen aufsetzen, die dann nur den PHP-Code verarbeiten und dann in der nginx.conf je nach Anforderung einfach einen anderen Wert für fastcfgi_pass einsetzen? Wo liegen dann die PHP-Files? Immer noch auf dem Webserver? Oder auf beiden?

    Bin da grade leicht ratlos... :confused:

    PS: Ich habe für den Server nur eine einzige IPv4 Adresse, muss also mit name-based virtual hosts auskommen.
     
  2. Yamagi

    Yamagi Possessed With Psi Powers Mitarbeiter

    Registriert seit:
    14 April 2004
    Beiträge:
    9.182
    Ort:
    Schleswig-Holstein
    Also, es gibt da zwei gängige Herangehensweisen. Die erste ist genau das, was du schon sagst. Ein Hauptjail mit nginx, darunter Unterjails für die php-fpm Instanzen. Das braucht etwas Hirnschmalz um es mit dem Pfaden zu den Scripten konsistent hinzubekommen. Aber wenn man es einmal verstanden hat, ist es simpel. Der andere Weg ist einen Reverse Proxy vorzuschalten, der den Traffic auf verschiedene Jails mit unterschiedlichen PHP-Versionen weiterleitet.
     
    gschwepp gefällt das.
  3. gschwepp

    gschwepp New Member

    Registriert seit:
    24 August 2015
    Beiträge:
    5
    Moin,

    ich hab es selber noch nicht auf dieses Art und Weise gemacht aber in der Theorie sollte es wie folgt funktionieren:

    Du erstellst ein weiteres Jail für php <= 7.0 und installierst darin php & php-fpm.
    Du mountest von außen in dein nginx jail und in das neue php(<=7.0) jail ein socket-directory mit nullfs (https://dan.langille.org/2015/01/14/nullfs-mounts-in-a-jail/)
    Du konfigurierst dein php-fpm im neuen php(<=7.0) auf einen unix-socket in dieser neuen verzeichnis zu hören.
    Du konfigurierst in deinem nginx jail den /location block deiner Anwendung so, dass er ebenfalls auf den unix-socket auf zugreift.

    Das sollte soweit funktioniert. Mit der Methode kannst du auch alle php-fpm versionen voneinander in Jails trennen (wenn das für dich sinnvoll ist).

    Gruß
     
  4. -Nuke-

    -Nuke- Well-Known Member

    Registriert seit:
    25 Juli 2004
    Beiträge:
    1.163
    Ich persönlich würde einen Reverse-Proxy davor schalten und einfach 2 verschiedene Jails aufsetzen (bzw. eine neue Jail) die alles nötige beinhalten. Das ist natürlich etwas wie mit Kanonen auf Spatzen schießen, aber statt hier groß zu konfigurieren und verschiedene Dateisysteme ineinander zu mounten, lieber einfach alles an einem Fleck lassen und das Ganze einfach den Reverse-Proxy überlassen.

    Weil mit der php-fpm Methode müssen die Daten sowohl in der Webserver-Jail als auch in der PHP-Jail liegen. Das geht zwar mittels nullfs ganz gut, aber ist schon ein ganz schöner Aufwand.
     
  5. peterle

    peterle Forenkasper

    Registriert seit:
    19 August 2006
    Beiträge:
    1.865
    Ort:
    Aachen
    Machte man das früher nicht auch gerne durch "umbenennen" einer Version, also z.B: php5 statt php für die 5er Version und band das dann entsprechend ein oder übermannen mich gerade nur Phantastereien, wegen zu wenig Schlaf ... :cool:
     
  6. thorwin

    thorwin Member

    Registriert seit:
    5 Mai 2009
    Beiträge:
    314
    Ort:
    Darmstadt, Germany
    Das klingt ein Bisschen nach vorprogrammierter Update-Hölle :ugly:

    Ich werde mich mal damit auseinandersetzen, wie ich die Pfade von Webserver und PHP-Jail synchron bekomme. Sollte mit nullfs(5) ja eigentlich ganz easy sein...
     
  7. KobRheTilla

    KobRheTilla used register

    Registriert seit:
    20 Januar 2011
    Beiträge:
    1.350
    Ich würde diesen Aufwand nicht betreiben, sondern einfach die zusätzliche PHP-Instanz von Hand bauen, kompilieren und installieren (nach /opt oder so).

    Dann zwei getrennte FPMs laufen lassen.

    Rob
     
    Zuletzt bearbeitet: 12 April 2018
  8. thorwin

    thorwin Member

    Registriert seit:
    5 Mai 2009
    Beiträge:
    314
    Ort:
    Darmstadt, Germany
    Für die Nachwelt (und für mich, weil ich das bestimmt wieder vergesse): Ich habe jetzt 2 zusätzliche jails "php72" und "php70" angelegt, die in der jail.conf dann so aussehen:

    Code:
    php72 {
      ip4.addr = lo1|10.42.42.130;
      mount += "/jails/www/usr/local/www/php72-app1 $path/usr/local/www/php72-app1 nullfs rw 0 0";
      mount += "/jails/www/usr/local/www/php72-app2 $path/usr/local/www/php72-app2 nullfs rw 0 0";
      mount += "/jails/www/usr/local/www/php72-app3 $path/usr/local/www/php72-app3 nullfs rw 0 0";
    }
    
    php70 {
      ip4.addr = lo1|10.42.42.131;
      mount += "/jails/www/usr/local/www/php70-app $path/usr/local/www/php70-app nullfs rw 0 0";
    }
    
    Im www-Jail läuft jetzt nur noch ein nginx, in den php7x Jails jeweils die passende php-fpm Version.

    Was ist noch nicht hinbekommen habe, ist die Pakete mit poudriere automatisch für 2 PHP-Versionen zu bauen (ich nehme an, dafür bräuchte ich 2 Repos). Ich habe 7.2 als default in der make.conf, damit werden alle Abhängigen php-Pakete als php72-* gebaut. Die php70-* Versionen müssen alle von Hand in die Paketliste für poudriere eingetragen werden. Oder kann ich irgendwie automatisch alles Benötigte für 2 Versionen bauen lassen?
     
    CrimsonKing gefällt das.
  9. SolarCatcher

    SolarCatcher Active Member

    Registriert seit:
    24 August 2006
    Beiträge:
    754
    So mache ich es auch: Eine Jail mit Webserver (h2o) und PHP 5.6 und eine mit Webserver und PHP 7. Bei mir läuft allerdings kein Reverse-Proxy davor, sondern PF redirects den Traffic auf die jeweilige Jail... benötigt allerdings mind. je 1 öffentliche IP-Adresse pro Jail und die Verwendung von (Sub-)Domains für die verschiedenen Apps, die auf die öffentlichen IP Adressen gelegt werden können.
     
  10. thorwin

    thorwin Member

    Registriert seit:
    5 Mai 2009
    Beiträge:
    314
    Ort:
    Darmstadt, Germany
    Ja, wenn ich mehrere IPs zur Verfügung hätte, hätte ich das auch ganz einfach so gemacht. Leider muss das alles durch eine Adresse durch. (/me schielt sehnsüchtig nach IPv6)
     
  11. peterle

    peterle Forenkasper

    Registriert seit:
    19 August 2006
    Beiträge:
    1.865
    Ort:
    Aachen
    Sag einmal ...
    In meinem apache24 Include gibt es eine conf in der steht:
    Code:
    <IfModule proxy_fcgi_module>
      <IfModule dir_module>
      DirectoryIndex index.php
      </IfModule>
    
      <FilesMatch "\.(php|phtml|inc)$">
      SetHandler "proxy:fcgi://127.0.0.1:9000"
      </FilesMatch>
    </IfModule>
    
    Wenn ich nun einen zweiten fpm laufen lasse und den auf 9090 packe - wo packe ich dann den Code oben rein, um in unterschiedlichen vhosts unterschiedliche php zu haben?

    Ich vermute mal in die <VirtualHost-Directiven - schon mal sowas gemacht?

    Ich weigere mich noch jails zu bauen!
     
  12. KobRheTilla

    KobRheTilla used register

    Registriert seit:
    20 Januar 2011
    Beiträge:
    1.350
    Genau. Wenn in einem VirtualHost ein anderes PHP laufen soll, kannst du das über FilesMatch einfach dort umkonfigurieren.

    Rob