Tutorial

Ausführen mehrerer PHP-Versionen auf einem Server mit Apache und PHP-FPM unter CentOS 7

Published on June 11, 2020
Deutsch
Ausführen mehrerer PHP-Versionen auf einem Server mit Apache und PHP-FPM unter CentOS 7

Der Autor hat den COVID-19 Relief Fund dazu ausgewählt, eine Spende im Rahmen des Programms Write for DOnations zu erhalten.

Einführung

Der Apache-Webserver verwendet virtuelle Hosts zur Verwaltung mehrerer Domänen auf einer einzigen Instanz. In ähnlicher Weise verwendet PHP-FPM einen Daemon, um mehrere PHP-Versionen auf einer einzigen Instanz zu verwalten. Zusammen können Sie Apache und PHP-FPM verwenden, um mehrere PHP-Webanwendungen zu hosten, von denen jede eine andere Version von PHP verwendet, alle auf dem gleichen Server und alle zur gleichen Zeit. Dies ist nützlich, da verschiedene Anwendungen möglicherweise verschiedene Versionen von PHP erfordern, aber einige Server-Stacks, wie ein herkömmlich konfigurierter LAMP-Stack, nur einen verwalten können. Die Kombination von Apache mit PHP-FPM ist auch eine kosteneffizientere Lösung als das Hosting jeder Anwendung auf ihrer eigenen Instanz.

PHP-FPM bietet auch Konfigurationsoptionen für stderr- und stdout-Protokollierung, Notfall-Neustarts und adaptives Prozess-Spawning, was bei stark ausgelasteten Sites nützlich ist. Tatsächlich ist der Einsatz von Apache mit PHP-FPM einer der besten Stacks für das Hosting von PHP-Anwendungen, insbesondere, wenn es um die Leistung geht.

In diesem Tutorial richten Sie zwei PHP-Sites auf einer einzigen Instanz ein. Jede Site verwendet ihre eigene Domäne und jede Domäne stellt ihre eigene PHP-Version bereit. Die erste, site1.your_domain, stellt PHP 7.0 bereit. Die zweite, site2.your_domain, stellt PHP 7.2 bereit.

Voraussetzungen

Schritt 1 – Installieren von PHP Versionen 7.0 und 7.2 mit PHP-FPM

Wenn die Vorkehrungen abgeschlossen sind, können Sie jetzt die PHP-Versionen 7.0 und 7.2 installieren. Das SCL (Software Collections)-Repository verwaltet zahlreiche Versionen des PHP-Stacks für das CentOS 7-System. Wenn Sie die neueste Version von PHP benötigen und diese nicht auf SCL verfügbar ist, sehen Sie stattdessen im remi PPA (persönliches Paketarchiv) nach.

Beginnen Sie mit der Installation des SCL Repository in Ihrem System:

  1. sudo yum install centos-release-scl -y

Wir wollen uns zunächst ansehen, welche PHP 7-Versionen auf SCL verfügbar sind:

  1. sudo yum list rh-php7[0-9].x86_64

Sie sehen eine Ausgabe wie diese:

Output
Available Packages rh-php70.x86_64 2.3-1.el7 centos-sclo-rh rh-php71.x86_64 1-1.el7 centos-sclo-rh rh-php72.x86_64 1-2.el7 centos-sclo-rh rh-php73.x86_64 1-1.el7 centos-sclo-rh

Sie sehen, dass die neueste Version, PHP 7.3, auch verfügbar ist. Für unsere Beispiele werden wir jedoch die Versionen 7.0 und 7.2 installieren.

Beginnen wir mit der älteren Version. Installieren Sie rh-php70 und rh-php70-php-fpm:

  1. sudo yum install rh-php70 rh-php70-php-fpm -y
  • rh-php70 ist ein Metapaket, das PHP-Anwendungen ausführt.
  • rh-php7.0-php-fpm bietet den Fast Process Manager-Interpreter, der als Daemon ausgeführt wird und Fast/CGI-Anfragen empfängt.

Wiederholen Sie den Vorgang für PHP-Version 7.2. Installieren Sie rh-php72 und rh-php72-php-fpm.

  1. sudo yum install rh-php72 rh-php72-php-fpm -y

Führen Sie als Nächstes die folgenden Befehle aus, um mit der Verwendung der beiden Software-Sammlungen zu beginnen:

  1. sudo scl enable rh-php70 bash
  2. sudo scl enable rh-php72 bash

Standardmäßig hören beide PHP-Versionen Port 9000 ab. In diesem Tutorial möchten wir jedoch zwei Versionen gleichzeitig ausführen. Wir benennen daher zwei neue Ports:

Dazu können Sie /etc/opt/rh/rh-php70/php-fpm.d/www.conf in einem beliebigen Texteditor öffnen und 9000 überall in 9002 ändern. Speichern und schließen Sie die Datei und wiederholen Sie den Vorgang für /etc/opt/rh/rh-php72/php-fpm.d/www.conf, aber ersetzen Sie jetzt 9000 durch 9003. Alternativ können Sie diese beiden sed-Befehle für die Ersetzungen verwenden:

  1. sudo sed -i 's/:9000/:9002/' /etc/opt/rh/rh-php70/php-fpm.d/www.conf
  2. sudo sed -i 's/:9000/:9003/' /etc/opt/rh/rh-php72/php-fpm.d/www.conf

Sie haben nun einen eigenen Port für jeden Ihrer PHP Dienste angegeben. Bevor die Änderungen jedoch funktionieren, müssen Sie die Ports zu Ihrer SELinux Konfiguration hinzufügen.

SELinux ist die Kurzform für Security Enhanced Linux und ist standardmäßig in CentOS 7 aktiviert. Damit Ihre Anwendungen ausgeführt werden können, müssen Sie die neuen Ports 9002 und 9003 Ihrer SELinux Datenbank hinzufügen und den httpd Diensten zuweisen. Verwenden Sie den Befehl semanage, um diese Aufgabe auszuführen:

  1. sudo semanage port -a -t http_port_t -p tcp 9002
  2. sudo semanage port -a -t http_port_t -p tcp 9003

Das Flag -a gibt an, dass Sie der Datenbank ein Objekt hinzufügen. Das Flag -t gibt die Art des Objekts an. In diesem Fall handelt es sich um http_port_t. Flag -p ordnet das tcp-Protokoll zu. Sie können mehr über SELinux und den semanage-Befehl in diesem Tutorial oder durch einen Besuch der offiziellen SELinux-Dokumentation erfahren.

Sie können nun die PHP Dienste starten und aktivieren. Beginnen Sie mit dem Dienst rh-php70-php-fpm und aktivieren Sie ihn zum Starten beim Booten:

  1. sudo systemctl start rh-php70-php-fpm
  2. sudo systemctl enable rh-php70-php-fpm

Überprüfen Sie als Nächstes den Status des rh-php70-php-fpm-Dienstes:

  1. sudo systemctl status rh-php70-php-fpm

Sie sehen eine Ausgabe wie diese:

Output
● rh-php70-php-fpm.service - The PHP FastCGI Process Manager Loaded: loaded (/usr/lib/systemd/system/rh-php70-php-fpm.service; enabled; vendor preset: disabled) Active: active (running) since Sat 2020-04-18 04:49:59 UTC; 1min 6s ago Main PID: 1852 (php-fpm) Status: "Processes active: 0, idle: 5, Requests: 0, slow: 0, Traffic: 0req/sec" CGroup: /system.slice/rh-php70-php-fpm.service ├─1852 php-fpm: master process (/etc/opt/rh/rh-php70/php-fpm.conf) ├─1853 php-fpm: pool www ├─1854 php-fpm: pool www ├─1855 php-fpm: pool www ├─1856 php-fpm: pool www └─1857 php-fpm: pool www Apr 18 04:49:59 centos-s-1vcpu-1gb-blr1-01 systemd[1]: Starting The PHP FastCGI Process Manager... Apr 18 04:49:59 centos-s-1vcpu-1gb-blr1-01 systemd[1]: Started The PHP FastCGI Process Manager.

Wiederholen Sie den Vorgang, starten Sie den rh-php72-php-fpm-Dienst und aktivieren Sie ihn, sodass er beim Booten gestartet wird:

  1. sudo systemctl start rh-php72-php-fpm
  2. sudo systemctl enable rh-php72-php-fpm

Überprüfen Sie als Nächstes den Status des rh-php70-php-fpm-Dienstes:

  1. sudo systemctl status rh-php72-php-fpm

Sie sehen eine Ausgabe wie diese:

Output
● rh-php72-php-fpm.service - The PHP FastCGI Process Manager Loaded: loaded (/usr/lib/systemd/system/rh-php72-php-fpm.service; enabled; vendor preset: disabled) Active: active (running) since Sat 2020-04-18 04:50:04 UTC; 1min 59s ago Main PID: 1876 (php-fpm) Status: "Processes active: 0, idle: 5, Requests: 0, slow: 0, Traffic: 0req/sec" CGroup: /system.slice/rh-php72-php-fpm.service ├─1876 php-fpm: master process (/etc/opt/rh/rh-php72/php-fpm.conf) ├─1877 php-fpm: pool www ├─1878 php-fpm: pool www ├─1879 php-fpm: pool www ├─1880 php-fpm: pool www └─1881 php-fpm: pool www Apr 18 04:50:04 centos-s-1vcpu-1gb-blr1-01 systemd[1]: Starting The PHP FastCGI Process Manager... Apr 18 04:50:04 centos-s-1vcpu-1gb-blr1-01 systemd[1]: Started The PHP FastCGI Process Manager.

Zu diesem Zeitpunkt haben Sie zwei PHP-Versionen auf Ihrem Server installiert. Als Nächstes erstellen Sie eine Verzeichnisstruktur für jede Website, die Sie bereitstellen möchten.

Schritt 2 — Erstellen von Verzeichnisstrukturen für beide Websites

In diesem Abschnitt erstellen Sie für beide Websites ein Dokumentenstammverzeichnis und eine Indexseite.

Erstellen Sie zunächst Dokumentenstammverzeichnisse sowohl für site1.your_domain als auch für site2.your_domain:

  1. sudo mkdir /var/www/site1.your_domain
  2. sudo mkdir /var/www/site2.your_domain

Der Apache-Webserver wird standardmäßig als apache-Benutzer und apache-Gruppe ausgeführt. So sollten /var/www/ und alle zugehörigen Dateien und Unterverzeichnisse ebenfalls unter deren Eigentümerschaft fallen. Führen Sie die folgenden Befehle aus, um die richtigen Eigentümerschaften und Berechtigungen der Website-Stammverzeichnisse zu überprüfen:

  1. sudo chown -R apache:apache /var/www/site1.your_domain
  2. sudo chown -R apache:apache /var/www/site2.your_domain
  3. sudo chmod -R 755 /var/www/site1.your_domain
  4. sudo chmod -R 755 /var/www/site2.your_domain

Der Befehl chown ändert die Eigentümerschaften der beiden Website-Verzeichnisse auf den apache-Benutzer und die apache-Gruppe. Der Befehl chmod ändert die Berechtigungen, die mit diesem Benutzer und der Gruppe verknüpft sind, sowie mit anderen.

Erstellen Sie als Nächstes in jedem Stammverzeichnis Ihrer Website eine Datei info.php. Dadurch werden die PHP-Versionsinformationen jeder Website angezeigt. Beginnen Sie mit site1:

  1. sudo vi /var/www/site1.your_domain/info.php

Fügen Sie die folgende Zeile hinzu:

/var/www/site1.your_domain/info.php
<?php phpinfo(); ?>

Speichern und schließen Sie die Datei. Kopieren Sie nun die von Ihnen erstellte Datei info.php nach site2:

  1. sudo cp /var/www/site1.your_domain/info.php /var/www/site2.your_domain/info.php

Ihr Webserver sollte nun über die Stammverzeichnisse der Dokumente verfügen, die jede Site benötigt, um Besuchern Daten zur Verfügung zu stellen. Als Nächstes konfigurieren Sie Ihren Apache-Webserver, um mit zwei verschiedenen PHP-Versionen zu arbeiten.

Schritt 3 – Konfigurieren von Apache für beide Websites

In diesem Abschnitt erstellen Sie zwei Konfigurationsdateien für virtuelle Hosts. Dadurch können Ihre beiden Websites gleichzeitig mit zwei verschiedenen PHP-Versionen arbeiten.

Damit Apache diesen Inhalt bereitstellen kann, ist es erforderlich, eine virtuelle Host-Datei mit den richtigen Anweisungen zu erstellen. Sie erstellen zwei neue virtuelle Host-Konfigurationsdateien im Verzeichnis /etc/httpd/conf.d/.

Erstellen Sie zunächst eine neue Konfigurationsdatei für einen virtuellen Host für die Website site1.your_domain. Hier weisen Sie Apache an, Inhalte mit PHP 7.0 zu rendern:

  1. sudo vi /etc/httpd/conf.d/site1.your_domain.conf

Fügen Sie folgenden Inhalt hinzu: Stellen Sie sicher, dass der Website-Verzeichnispfad, der Servername, der Port und die PHP-Version mit Ihrer Einrichtung übereinstimmen:

/etc/httpd/conf.d/site1.your_domain.conf

<VirtualHost *:80>
     ServerAdmin admin@site1.your_domain
     ServerName site1.your_domain
     DocumentRoot /var/www/site1.your_domain
     DirectoryIndex info.php
     SetHandler "proxy:fcgi://127.0.0.1:9002
     ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
     AddHandler php70-fcgi .php
     Action php70-fcgi /cgi-bin/php70.fcgi
     ErrorLog /var/log/httpd/site1.your_domain_error.log
     CustomLog /var/log/httpd/site1.your_domain_access.log combined
</VirtualHost>

Für DocumentRoot geben Sie den Pfad Ihres Website-Stammverzeichnisses ein. Für ServerAdmin geben Sie eine E-Mail an, auf die der Administrator der Site your_domain zugreifen kann. Für ServerName fügen Sie die URL für Ihre erste Subdomäne hinzu. Für SetHandler geben Sie Port 9002 an. Die verbleibenden Anweisungen konfigurieren Ihren Dienst zudem für die Bereitstellung von PHP 7.0.

Speichern und schließen Sie die Datei.

Erstellen Sie als Nächstes eine neue virtuelle Host-Konfigurationsdatei für die Website site2.your_domain. Geben Sie diese Subdomäne für die Bereitstellung von PHP 7.2 an:

  1. sudo vi /etc/httpd/conf.d/site2.your_domain.conf

Fügen Sie folgenden Inhalt hinzu: Stellen Sie auch hier sicher, dass der Website-Verzeichnispfad, der Servername und die PHP-Version mit Ihren eindeutigen Informationen übereinstimmen:

/etc/httpd/conf.d/site2.your_domain.conf
<VirtualHost *:80>
     ServerAdmin admin@site2.your_domain
     ServerName site2.your_domain
     DocumentRoot /var/www/site2.your_domain
     DirectoryIndex info.php
     SetHandler "proxy:fcgi://127.0.0.1:9003
     ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
     AddHandler php72-fcgi .php
     Action php72-fcgi /cgi-bin/php72.fcgi
     ErrorLog /var/log/httpd/site2.your_domain_error.log
     CustomLog /var/log/httpd/site2.your_domain_access.log combined
</VirtualHost>

Wenn Sie fertig sind, speichern und schließen Sie die Datei. Überprüfen Sie anschließend die Apache-Konfigurationsdatei auf etwaige Syntaxfehler:

  1. sudo apachectl configtest

Sie sehen eine Ausgabe von Syntax OK:

  1. Output
    Syntax OK

Starten Sie schließlich den Apache-Dienst neu, um Ihre Änderungen zu übernehmen:

  1. sudo systemctl restart httpd

Nachdem Sie Apache nun konfiguriert haben, um jede Site zu bedienen, werden Sie sie testen, um sicherzustellen, dass die richtigen PHP-Versionen ausgeführt werden.

Schritt 4 – Testen beider Websites

Zu diesem Zeitpunkt haben Sie zwei Websites konfiguriert, um zwei verschiedene PHP-Versionen auszuführen. Testen Sie nun die Ergebnisse.

Öffnen Sie Ihren Webbrowser und besuchen Sie beide Sites http://site1.your_domain und http://site2.your_domain. Sie sehen zwei Seiten, die wie folgt aussehen:

PHP 7.0 Infoseite PHP 7.2 Infoseite

Beachten Sie die Titel. Die erste Seite zeigt an, dass site1.your_domain PHP-Version 7.0 bereitstellt. Die zweite zeigt an, dass site2.your_domain PHP-Version 7.2 bereitstellt.

Nachdem Sie nun Ihre Sites getestet haben, entfernen Sie die Dateien info.php. Da sie sensible Informationen über Ihren Server enthalten und für unberechtigte Benutzer zugänglich sind, stellen sie ein Sicherheitsrisiko dar. Entfernen Sie die Dateien:

  1. sudo rm -rf /var/www/site1.your_domain/info.php
  2. sudo rm -rf /var/www/site2.your_domain/info.php

Sie haben nun einen einzigen CentOS 7-Server, der zwei Websites mit zwei verschiedenen PHP-Versionen verwaltet. PHP-FPM ist jedoch nicht auf diese eine Anwendung beschränkt.

Zusammenfassung

Sie haben nun virtuelle Hosts und PHP-FPM kombiniert, um mehrere Websites und mehrere PHP-Versionen auf einem einzigen Server bereitzustellen. Die einzige praktische Beschränkung der Anzahl der PHP-Sites und PHP-Versionen, die Ihr Apache-Dienst verarbeiten kann, ist die Verarbeitungsleistung Ihrer Instanz.

Von hier aus können Sie die fortgeschritteneren Funktionen von PHP-FPM erkunden, wie den adaptiven Spawning-Prozess oder die Protokollierung von sdtout und stderr. Oder Sie sichern jetzt Ihre Websites. Zu diesem Zweck können Sie unserem Tutorial zum Sichern Ihrer Sites mit kostenlosen TLS/SSL-Zertifikaten von Let’s Encrypt folgen.

Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.

Learn more about us


About the authors
Default avatar
hitjethva

author



Still looking for an answer?

Ask a questionSearch for more help

Was this helpful?
 
Leave a comment


This textbox defaults to using Markdown to format your answer.

You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!

Try DigitalOcean for free

Click below to sign up and get $200 of credit to try our products over 60 days!

Sign up

Join the Tech Talk
Success! Thank you! Please check your email for further details.

Please complete your information!

Get our biweekly newsletter

Sign up for Infrastructure as a Newsletter.

Hollie's Hub for Good

Working on improving health and education, reducing inequality, and spurring economic growth? We'd like to help.

Become a contributor

Get paid to write technical tutorials and select a tech-focused charity to receive a matching donation.

Welcome to the developer cloud

DigitalOcean makes it simple to launch in the cloud and scale up as you grow — whether you're running one virtual machine or ten thousand.

Learn more
DigitalOcean Cloud Control Panel