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
UPDATE: Unter Ubuntu 18.04 gibt es libapache2-mod-fastcgi nicht mehr. Alternativ (und einfacher) kann man proxy_fcgi nehmen!
Kurzanleitung:
domain1.de -> PHP 5 domain2.de -> PHP 7
add-apt-repository ppa:ondrej/php apt-get install apache2 php5.6-fpm php5.6 php5.6-mcrypt php5.6-mbstring php5.6-mysql php5.6-zip php5.6-gd php5.6-xml php7.2-fpm php7.2-fpm php7.2 php7.2-mbstring php7.2-mysql php7.2-zip php7.2-gd php7.2-xml a2enmod proxy_fcgi systemctl restart apache2
Nun in die Datei ‚/etc/apache2/sites-enabled/000-default.conf‘ folgendes eintragen:
<VirtualHost *:80> ServerName www.domain1.de ServerAlias domain1.de ServerAdmin webmaster@localhost DocumentRoot /var/www/html/domain1 ErrorLog ${APACHE_LOG_DIR}/error_domain1.log CustomLog ${APACHE_LOG_DIR}/access_domain1.log combined ProxyPassMatch ^/(.*\.php(/.*)?)$ unix:/run/php/php5.6-fpm.sock|fcgi://localhost/var/www/html/domain1 </VirtualHost> <VirtualHost *:80> ServerName www.domain2.de ServerAlias domain2.de ServerAdmin webmaster@localhost DocumentRoot /var/www/html/domain2 ErrorLog ${APACHE_LOG_DIR}/error_domain2.log CustomLog ${APACHE_LOG_DIR}/access_domain2.log combined ProxyPassMatch ^/(.*\.php(/.*)?)$ unix:/run/php/php7.2-fpm.sock|fcgi://localhost/var/www/html/domain2 </VirtualHost>
Apachen neustarten (’systemctl restart apache2′) und die Datei ‚/var/www/html/domain1/info.php‘ und ‚/var/www/html/domain2/info.php‘ mit folgendem Inhalt erstellen:
<?php phpinfo(); ?>
Aufruf nun:
http://www.domain1.de/info.php
http://www.domain2.de/info.php
Das eine ist PHP 5.6, das andere PHP 7.2. So wie es sein soll!
Schreibe einen Kommentar