Benutzer-Werkzeuge

Webseiten-Werkzeuge


tachtler:apache_http_server_archlinux_-_php-fpm_-_alternativer_php-interpreter

Apache HTTP Server ArchLinux - php-fpm - Alternativer PHP-Interpreter

Der Apache HTTP Server ist ein Open Source Webserver und der seit 1996 am meisten im Internet eingesetzte Webserver weltweit. Der freie und quell offenen Webserver wird von der Apache Software Foundation zur Verfügung gestellt und weiterentwickelt.

Um den Apache HTTP Server als Server mit PHP zu betreiben, kann zur Kommunikation FPM/FastCGI zum Einsatz kommen.

PHP-FPM startet gleich mehrere PHP-Interpreter-Prozesse, die ständig im Hintergrund laufen und auf Aufträge warten. Eingehende Anfragen nimmt PHP-FPM vom Webserver Apache HTTP Server entgegen und verteilt sie an die wartenden PHP-Interpreter.

Hierbei gibt es drei Möglichkeiten, die die Kommunikation zwischen dem Apache HTTP Server und dem PHP bewerkstelligen können:

  1. mod_php - Standard, Aufruf von PHP innerhalb des Webservers Apache HTTP Server.
  2. mod_fcgid - Nutzung von CGI/FastCGI durch Aufruf innerhalb des Apache HTTP Server durch starten eines externen Prozess durch den Apache HTTP Server
  3. php-fpm - Nutzung von FPM/FastCGI durch Aufruf außerhalb des Apache HTTP Server, über einen separat gestarteten Dienstes/Daemon.

Nachfolgend soll die Variante php-fpm genutzt werden!

:!: WICHTIG - Nachfolgende Konfigurationen setzen die Einrichtung eines Apache HTTP Servers, wie unter nachfolgendem internen Link beschrieben, voraus:

Ab hier werden root-Rechte zur Ausführung der nachfolgenden Befehle benötigt. Um root zu werden geben Sie bitte folgenden Befehl ein:

$ su -
Password: 

Vorteile von PHP-FPM

Nachfolgende Vorteile besitzt PHP-FPM gegenüber den anderen Möglichkeiten, PHP im Webserver einzubinden:

  1. PHP Prozesse müssen nicht in der gleichen Umgebung, mit dem gleichen User- und der gleichen GruppenID, wie der Webserver laufen.
  2. Es ist möglich die PHP Prozesse neu zu starten, ohne ankommende „Requests“ zu verlieren.
  3. In der PHP-FPM-Konfiguration kann man verschiedene Prozess Pools definieren. Für jeden Pool kann man definieren, mit welchen Rechten die Prozesse laufen, man kann die Prozesse sogar in ein Chroot einsperren oder sie mit einer anderen php.ini starten.
  4. Jeder Prozesspool lauscht auf einem eigenen Port oder einem Unix Domain Socket, so ist es möglich in einem Webserver zu Konfigurieren wohin die „Requests“ gestellt werden sollen.
  5. Es können PHP Prozesse neu gestartet werden, ohne „Requests“ zu verlieren. Auch können PHP Prozesse nach Zeit N automatisch terminiert werden.
  6. Ein Möglichkeit ist die Nutzung der Konfigurationsvariable request_slowlog_timeout. Braucht ein „Request“ länger als definiert, wird automatisch ein „Backtrace“ des „Requests“ in ein LOG-Datei geschrieben.
  7. PHP-FPM ist seit der PHP Version 5.3.3 fest in PHP integriert.
  8. Der Austausch der PHP-Version ist einfacher möglich, als dies bei der Nutzung von mod_php möglich wäre.
  9. Bessere Performance gegenüber z.B. mod_php
  10. :!: Der größte Vorteile ist, die Nutzung des Apache HTTP Server im event-Modus, anstelle im prefork-Modus !!! :!:

Installation

Zur Installation des Apache HTTP Servers wird nachfolgendes Paket benötigt:

  • php-fpm - ist im extra-Repository von ArchLinux enthalten.

Mit nachfolgendem Befehl, wird das Pakete php-fpm installiert:

# pacman -S --noconfirm php-fpm

Installationsverlauf

Mit nachfolgendem Befehl kann überprüft werden, welche Inhalte mit den Paket php-fpm installiert wurden:

# pacman -Qil php-fpm

Installierte Dateien

Dienst/Daemon-Start einrichten

Um den PHP-FPM, welcher als Dienst/Daemon als Hintergrundprozess läuft, auch nach einem Neustart des Servers zur Verfügung zu haben, soll der Dienst/Deamon mit dem Server mit gestartet werden, was mit nachfolgendem Befehl realisiert werden kann:

 systemctl enable php-fpm.service
Created symlink /etc/systemd/system/multi-user.target.wants/php-fpm.service → /usr/lib/systemd/system/php-fpm.service.

:!: HINWEIS - Sollte keine Ausgabe nach Ausführung des Befehls erfolgen, wurde dieser mit der Installation bereits eingerichtet.

Eine Überprüfung, ob beim Neustart des Server der php-fpm-Dienst/Daemon wirklich mit gestartet wird, kann mit nachfolgendem Befehl erfolgen und sollte eine Anzeige, wie ebenfalls nachfolgend dargestellt ausgeben:

# systemctl list-unit-files --type=service | grep -e php-fpm.service
php-fpm.service                            enabled         disabled

bzw.

# systemctl is-enabled php-fpm.service
enabled

Konfiguration

Das Ansprechen von PHP über PHP-FPM durch Apache HTTP Server php-fpm wird in nachfolgenden Konfigurationsdateien durchgeführt:

  • /etc/httpd/conf/httpd.conf - Einstellungen zum Laden der Module: mod_proxy und mod_proxy_fcgi und zum hinzufügen des Handlers für die Interpretation des PHP-Code.
  • /ect/php/php-fpm.d/www.conf - Konfigurationsdatei für die Interpretationseinstellungen durch den Apache HTTP Server
  • /ect/php/php-fpm.conf - Konfigurationsdatei für den PHP-FPM Dienst/Daemon.

php-fpm-Konfiguration: /etc/httpd/conf/httpd.conf - Konfiguration

Bevor ein erneuter Neustart des Apache HTTP Server erfolgreich durchgeführt werden kann, ist es erforderlich für die nachfolgende Installation die Konfigurationsdatei /etc/httpd/conf/httpd.conf zu verändern.

Nachfolgende die Veränderung, welche vorgenommen werden muss:

(Nur relevanter Ausschnitt):

# Tachtler
# default: #LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_module modules/mod_proxy.so

Erklärungen:

  • LoadModule proxy_module modules/mod_proxy.so

Die Einbindung des Moduls mod_proxy ist erforderlich, da dieses ein einen Proxy/Gateway für den Apache HTTP Server implementiert. Es werden eine Reihe gängiger Protokolle sowie verschiedene Lastausgleichsalgorithmen unterstützt. Module von Drittanbietern können Unterstützung für zusätzliche Protokolle und Lastausgleichsalgorithmen hinzufügen.

# Tachtler
# default: #LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so

Erklärungen:

  • LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so

Die Einbindung des Moduls mod_proxy_fcgi ist erforderlich, um die Unterstützung für das FastCGI-Protokoll zu realisieren.
:!: WICHTIG - Dieses Modul benötigt den Dienst von mod_proxy.

Anschliessend sind nachfolgende Ergänzungen, hier an der Konfigurationsdatei

  • /etc/httpd/conf/httpd.conf

z.B. am Ende der Konfigurationsdatei durchzuführen:

(Nur relevanter Ausschnitt):

<IfModule proxy_module>
    <IfModule proxy_fcgi_module>
        <FilesMatch \.php$>
            SetHandler "proxy:unix:/run/php-fpm/php-fpm.sock|fcgi://localhost/"
        </FilesMatch>
    </IfModule>
</IfModule>

Erklärungen:

  • <IfModule proxy_module>
        <IfModule proxy_fcgi_module>
            <FilesMatch \.php$>
                SetHandler "proxy:unix:/run/php-fpm/php-fpm.sock|fcgi://localhost/"
            </FilesMatch>
        </IfModule>
    </IfModule>

Erzwingt die Verarbeitung aller passenden Dateien durch den Handler für PHP/FGCI durch einen UNIX-Socket.

#
# DirectoryIndex: sets the file that Apache will serve if a directory
# is requested.
#
<IfModule dir_module>
    # Tachtler
    # default: DirectoryIndex index.html
    DirectoryIndex index.php index.html index.htm
</IfModule>

Erklärungen:

  • DirectoryIndex index.php index.html index.htm

Erweiterung des DirectoryIndex um die Angabe index.php, in der Liste der Ressourcen, nach denen zu suchen ist, wenn der Client ein Verzeichnis anfordert.

/etc/php/php-fpm.d/www.conf

Diese Konfigurationsdatei erstellt einen Pool, welcher später für den Dienst/Daemon die einzelnen „Child-Threats“ startet, welche dann letztendlich die Anfragen vom Apache HTTP Server entgegennehmen und ausführen.

Die Änderungen an dieser Konfigurationsdatei sind davon abhängig, welches Verfahren zur Kommunikation mit PHP-FPM zum Einsatz kommen soll.

  • TCP/IP-Port
  • UNIX-Socket

Nachfolgende Änderungen sind an dieser Konfigurationsdatei durchzuführen:

(Komplette Konfigurationsdatei)

/etc/php/php-fpm.d/www.conf

Erläuterungen zu den Änderungen

  • pm.status_path = /php-fpm-status

Aktivieren der Statusseite durch setzen des Pfades für den Aufruf!

  • pm.status_listen = /run/php-fpm/php-fpm-status.sock

Konfiguration des UNIX_Sockets auf dem die PHP-FPM-Status Informationen abgerufen werden können.

:!: WICHTIG - Es muss ein eigener UNIX-Socket definiert werden!

/etc/php/php-fpm.conf

Die ist eigentlich die Hauptkonfigurationsdatei des PHP-FPM.

:!: HINWEIS - Grundsätzlich ist es nicht erforderlich hier Anpassungen vor zu nehmen!:

(Komplette Konfigurationsdatei):

/etc/php/php-fpm.conf

/ect/php.php.ini

Die Hauptkonfigurationsdatei von PHP - php.net sollte mindestens nachfolgende Änderungen erfahren:

:!: HINWEIS - Welche php.ini geladen wird, kann mit nachfolgendem Befehl ermittelt werden:

# php -i | grep "Loaded Configuration File"
Loaded Configuration File => /etc/php/php.ini

(Nur relevante Ausschnitte)

; Tachtler
; default: zlib.output_compression = Off
zlib.output_compression = On
; Tachtler
; default: expose_php = On
expose_php = Off
; Tachtler
; default: ;date.timezone =
date.timezone = "Europe/Berlin"

info-Konfiguration

Nachfolgende Konfiguration ermöglicht es zwei URL-Erweiterungen zu implementieren, welche unter

  • /php-fpm-status - Statusinformationen PHP-FPM

abgerufen werden können.

PHP-FPM beinhaltet auch die Möglichkeit, eine Status-Abfrage in vier Formaten

  • einfacher Textanzeige (plain/text)
  • JSON-Fromat
  • HTML-Format
  • XML-Format

und dies in einer standard und in einer full Variante.

Nachfolgende Konfigurationen sind dazu notwendig:

info-Konfiguration: /etc/httpd/conf/extra/httpd-info.conf

Verzeichnis/Name Beschreibung
/etc/httpd/conf/extra/httpd-info.conf Beinhaltet Einstellungen zu Statusmeldungen und Informationen des Servers, abrufbar unter speziellen URL-Ergänzungen /server-status, /server-info und neu ldap-status

/etc/httpd/conf/extra/httpd-info.conf

Erklärungen:

  • <Location /php-fpm-status>

Wendet die enthaltenen Direktiven nur auf die entsprechenden URL an.

  • SetHandler "proxy:unix:/run/php-fpm/php-fpm-status.sock|fcgi://localhost/php-fpm-status"

Erzwingt die Verarbeitung aller passenden Dateien durch den Handler für PHP-FPM-Status.

  • Require all granted

Zugriff auf die URL-Erweiterung /php-fpm-status, ohne Beschränkungen.
Siehe auch nachfolgenden externen Link: Require

:!: HINWEIS - Der Zugriff auf diese URL-Erweiterung sollte durch eine Zugriffsbeschränkung eingeschränkt werden

Siehe auch nachfolgende internen Links:

  • </Location>

Schliesst die Anwendung auf die enthaltenen Direktiven nur auf die entsprechenden URL ab.

info-Konfiguration: Erster Start - php-fpm

Falls vorstehende Änderungen (natürlich an die jeweiligen Bedürfnisse angepasst) durchgeführt wurden, sollte ein erster Start von PHP-FPM nichts mehr im Wege stehen.

Danach kann der php-fpm-Server mit nachfolgendem Befehle gestartet werden:

# systemctl start php-fpm.service

Mit nachfolgendem Befehl kann der Status des abgefragt werden:

# systemctl status php-fpm.service 
● php-fpm.service - The PHP FastCGI Process Manager
     Loaded: loaded (/usr/lib/systemd/system/php-fpm.service; enabled; vendor preset: disabled)
     Active: active (running) since Fri 2022-07-01 17:28:16 CEST; 4s ago
   Main PID: 1713 (php-fpm)
     Status: "Ready to handle connections"
      Tasks: 3 (limit: 7090)
     Memory: 5.8M
        CPU: 54ms
     CGroup: /system.slice/php-fpm.service
             ├─1713 "php-fpm: master process (/etc/php/php-fpm.conf)"
             ├─1714 "php-fpm: pool www"
             └─1715 "php-fpm: pool www"

Jul 01 17:28:16 vml030 systemd[1]: Starting The PHP FastCGI Process Manager...
Jul 01 17:28:16 vml030 php-fpm[1713]: [NOTICE] fpm is running, pid 1713
Jul 01 17:28:16 vml030 php-fpm[1713]: [NOTICE] ready to handle connections
Jul 01 17:28:16 vml030 php-fpm[1713]: [NOTICE] systemd monitor interval set to 10000ms
Jul 01 17:28:16 vml030 systemd[1]: Started The PHP FastCGI Process Manager.

Nachfolgender Befehl kann ebenfalls zur Überprüfung der Lauffähigkeit des php-fpm-Servers genutzt werden und zeigt die laufenden Prozesse und deren genutzte „Pool“'s, hier (pool www):

# ps auxwwwf | grep php
root        1719  0.0  0.0   7000  2552 pts/0    S+   17:28   0:00                      \_ grep php
root        1713  0.1  0.5  82952 21236 ?        Ss   17:28   0:00 php-fpm: master process
(/etc/php/php-fpm.conf)
http        1714  0.0  0.1  82948  6860 ?        S    17:28   0:00  \_ php-fpm: pool www
http        1715  0.0  0.1  82948  6860 ?        S    17:28   0:00  \_ php-fpm: pool www

info-Konfiguration: Neustart Apache HTTP Webserver

Nach den vorangegangenen Konfigurationsschritten, sollte einem Neustart nichts im Wege stehen:

# systemctl restart httpd.service

:!: HINWEIS - Es erfolgen keine weiteren Ausgaben, wenn der Start erfolgreich war !

info-Konfiguration: Tests

Wenn ein erneuter Neustart des Apache HTTP Server erfolgreich durchgeführt wurde, können nachfolgende Abfragen mittels eines Browsers erfolgen, wie in nachfolgenden Bildern dargestellt durchgeführt werden:

Durch anhängen nachfolgenden Zusatzes an die URL: /php-fpm-status

kommt eine Ansicht in etwa wie nachfolgende zur Ansicht:

ArchLinux - Apache HTTP Server - Mozilla Firefox - /php-fpm-status

Durch anhängen nachfolgenden Zusatzes an die URL: /php-fpm-status?full

kommt eine Ansicht in etwa wie nachfolgende zur Ansicht:

ArchLinux - Apache HTTP Server - Mozilla Firefox - /php-fpm-status?full

Durch anhängen nachfolgenden Zusatzes an die URL: /php-fpm-status?html

kommt eine Ansicht in etwa wie nachfolgende zur Ansicht:

ArchLinux - Apache HTTP Server - Mozilla Firefox - /php-fpm-status?html

Durch anhängen nachfolgenden Zusatzes an die URL: /php-fpm-status?html&full

kommt eine Ansicht in etwa wie nachfolgende zur Ansicht:

ArchLinux - Apache HTTP Server - Mozilla Firefox - /php-fpm-status?html&full

Mit nachfolgendem Befehl, kann eine einfache Datei mit PHP Inhalt erzeugt werden, welcher dann die bekannte PHP-Statusseite zur Anzeige bringen sollte. Hier nachfolgendes Beispiel:

# echo '<?php phpinfo(); ?>' > /srv/http/phpinfo.php 

Anschliessend kann diese Datei dann wie folgt über z.B. einen Browser aufgerufen werden, falls dieser entsprechend konfiguriert ist. Eine Ausgabe, wie nachfolgende, sollte erscheinen:

ArchLinux - Apache HTTP Server - Mozilla Firefox - PHP-Info Abfrage

:!: WICHTIG - Es muss hier die Anzeige

  • Server-API FPM/FastCGI

erscheinen!

Diese Website verwendet Cookies. Durch die Nutzung der Website stimmen Sie dem Speichern von Cookies auf Ihrem Computer zu. Außerdem bestätigen Sie, dass Sie unsere Datenschutzbestimmungen gelesen und verstanden haben. Wenn Sie nicht einverstanden sind, verlassen Sie die Website.Weitere Information
tachtler/apache_http_server_archlinux_-_php-fpm_-_alternativer_php-interpreter.txt · Zuletzt geändert: 2022/07/01 17:55 von klaus