• Diese Seite verwendet Cookies. Indem du diese Website weiterhin nutzt, erklärst du dich mit der Verwendung von Cookies einverstanden. Erfahre mehr

2 unterschiedliche php-Versionen parallel?

thorwin

Well-Known Member
Themenstarter #1
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.
 

Yamagi

Possessed With Psi Powers
Mitarbeiter
#2
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.
 
#3
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ß
 

-Nuke-

Well-Known Member
#4
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.
 

peterle

Forenkasper
#5
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:
 

thorwin

Well-Known Member
Themenstarter #6
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:
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
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:

thorwin

Well-Known Member
Themenstarter #8
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?
 

SolarCatcher

Well-Known Member
#9
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.
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.
 

thorwin

Well-Known Member
Themenstarter #10
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.
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
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
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!