Apache mit PHP-FPM
Diese Seite ist für Systemadministratoren bei Hosting-Unternehmen, die Exponential mit Apache httpd 2.4 und PHP-FPM ausliefern, der klassischen Einrichtung und der üblichen auf Shared Hosting und Control Panels. Sie beantwortet: welche Module und Regeln nötig sind, wie der virtuelle Host aussieht, wie HTTPS und der PHP-FPM-Pool hineinpassen, welchen FPM-Master Sie nach einer Änderung neu laden und wie Sie das Ergebnis prüfen. Die Quelle ist Kapitel 8, Apache mit PHP-FPM.
Warnung
.htaccessbremst jede Anfrage. Sind.htaccess-Dateien erlaubt (AllowOverridealles außerNone), geschweige denn genutzt, sucht Apache sie bei jeder Anfrage in jedem Verzeichnis des Pfads und liest und wertet sie aus, und die Ladezeiten der Seiten steigen drastisch (gemessen). Die einzige wirkliche Abhilfe ist, die Funktion für den virtuellen Host abzuschalten:AllowOverride Noneim virtuellen HTTPS-Host, und die Regeln in der Konfiguration des virtuellen Hosts selbst als mod_rewrite-Regeln. Das ist in Geschwindigkeitstests im Produktivbetrieb weit schneller und die Zeit für die Optimierung einer Produktivkonfiguration unbedingt wert. Stellen Sie sofort um: Übernehmen Sie die Regeln des Beispiels für einen virtuellen HTTPS-Host in Ihren virtuellen Host (mit dem statischen Cache auchstaticcache_offload.conf), setzen SieAllowOverride None, führen Sieapachectl configtestaus, laden Sie Apache neu und testen Sie die Website. Dieselben Regeln für andere Server: nginx, LiteSpeed, Caddy, IIS, Velocity (eingebaut); wohin Regeln für virtuelle Hosts in einem Control Panel gehören: Plesk, cPanel, DirectAdmin, ISPConfig. Unter LiteSpeed oder OpenLiteSpeed kann zusätzlich der Seiten-Cache des Servers anonyme Besucher und Crawler ohne PHP bedienen: Seiten-Caching mit LiteSpeed und OpenLiteSpeed.
Inhalt
- Warum Apache
- Schritt für Schritt
- Regeln in .htaccess oder im virtuellen Host
- Der PHP-FPM-Pool
- Das richtige PHP-FPM neu laden
- Plesk
- Auslagerung des statischen Caches
- Was schiefgehen kann
- Checkliste
Warum Apache
- Es braucht keinen eigenen langlebigen Prozess des Kunden und passt also zu Shared Hosting.
- Die Rewrite-Regeln werden mit Exponential als
.htaccess_rootausgeliefert; Apache (und LiteSpeed) lesen sie direkt. - Unterstützung von Betriebssystemen führt Apache httpd 2.4 mit PHP-FPM (oder mod_php) als Stufe 1. PHP-FPM wird mod_php vorgezogen, das PHP an das Prefork-Modell von Apache bindet (PHP-SAPIs).
- Es betreibt Exponential auf PHP 8.0 und neuer (PHP 7.4 ohne Support nutzbar) und ist damit die Antwort auf Maschinen mit dem Standard-PHP 8.0 von Red Hat Enterprise Linux 9 und seinen Nachbauten.
Schritt für Schritt
Schalten Sie die Rewrite-Regeln ein. Kopieren, nicht verschieben, damit ein Update eine neue Version bringen kann:
cp .htaccess_root .htaccessOder
./console exp:setup:htaccess --apply, ausgeführt als Benutzer der Website: Der Befehl übernimmt den Modus der Vorlage, ersetzt eine abweichende.htaccessnur mit--force(nach einer Sicherung) und zeigt ohne--applynur, was er tun würde (.htaccess und config.php von der Konsole einrichten). Nutzen Sie stattdessen.htaccess_root_static(exp:setup:htaccess --static --apply) nur, wenn die Website einen erzeugten statischen Cache ausliefert (Statischer Cache).Laden Sie die Module:
mod_rewrite,mod_proxyundmod_proxy_fcgi(Debian:a2enmod rewrite proxy_fcgi); für HTTPSmod_ssl, für HTTP/2mod_http2.Legen Sie den virtuellen Host an (Pfade und PHP-FPM-Socket anpassen):
<VirtualHost *:80> ServerName example.com ServerAlias www.example.com # The installation root, where index.php is DocumentRoot /var/www/vhosts/example.com/httpdocs DirectoryIndex index.php <Directory /var/www/vhosts/example.com/httpdocs> Options FollowSymLinks # Lets Apache read the .htaccess created in step 1 AllowOverride All Require all granted </Directory> # Every PHP script goes to the PHP-FPM pool of this site <FilesMatch \.php$> SetHandler "proxy:unix:/run/php-fpm/example.com.sock|fcgi://localhost" </FilesMatch> </VirtualHost>HTTPS. Fügen Sie einen virtuellen Host
*:443mit demselben Inhalt hinzu, plus:SSLEngine on SSLCertificateFile /etc/ssl/example.com/fullchain.pem SSLCertificateKeyFile /etc/ssl/example.com/privkey.pem Protocols h2 http/1.1Beziehen Sie das Zertifikat mit certbot oder über das Panel. Sobald HTTPS funktioniert, leiten Sie Port 80 im Host
*:80um (Redirect permanent / https://example.com/).Prüfen und neu laden:
apachectl configtest # Syntax OK systemctl reload apache2 # httpd on Red Hat style systems curl -sI https://example.com/ | head -1Sicherheitsheader. Der Kernel sendet sie auf seinen Seiten (
site.ini [HTTPHeaderSettings] SecurityHeaders[]). Für statische Dateien fügen Sie dieselben mitmod_headershinzu, wenn Sie sie auch dort wollen (Kapitel 13).
Regeln in .htaccess oder im virtuellen Host
.htaccess | Regeln im virtuellen Host | |
|---|---|---|
| Braucht | AllowOverride All | AllowOverride None |
| Kosten | eine Dateisuche pro Verzeichnis | AllowOverride None spart diese Suche |
| Kunde kann es ändern | ja, was zu Shared Hosting passt | nein, nur der Hoster |
| Upgrade | die neue .htaccess_root über .htaccess kopieren (exp:setup:htaccess zeigt den Diff, --force --apply kopiert) | die geänderten Regeln in den vhost kopieren |
Innerhalb von <Directory> behalten die Regeln von .htaccess_root ihre Form. Im Server-Kontext (außerhalb von <Directory>) braucht
jedes Muster einen führenden Schrägstrich, wie in doc/eng-us/examples/ezpublish.conf. Die Regelliste
dieses Beispiels ist älter als die aktuelle .htaccess_root; nehmen Sie die Regeln also aus .htaccess_root selbst
(Kapitel 8, Schritt 3).
Warnung Vergleichen Sie nach jedem Upgrade Ihre kopierten Regeln mit der neuen
.htaccess_root. Eine fehlende Regel kann Dateien offenlegen, die nie gesendet werden dürfen; eine hinzugefügte Regel kann genau dafür die Korrektur sein../console exp:setup:htaccessgibt diesen Vergleich als Diff aus und endet mit Exit-Code 1, solange.htaccessabweicht; damit eignet er sich auch als Abweichungsprüfung für das Monitoring.
Der PHP-FPM-Pool
Der Pool führt PHP als Benutzer der Website aus. Die Einstellungen, die Kapitel 8 für Exponential nennt (in der Pool-Datei oder der
php.ini):
| Einstellung | Empfehlung aus den Quellen |
|---|---|
memory_limit | mindestens 256M in der Produktion; mehr für große Importe. Die Untergrenze des Setup-Assistenten ist 64M (Kapitel 2) |
max_execution_time | die Untergrenze des Assistenten ist 30; das Produktionsbeispiel in Kapitel 2 nutzt 60 |
upload_max_filesize, post_max_size | der größte Upload des Kunden |
date.timezone | setzen; ein fehlender Wert lässt den kritischen Test des Assistenten scheitern |
| OPcache | an, mit eingeschalteter Prüfung der Zeitstempel (OPcache) |
Ein Pool pro Kunde, der als Benutzer dieses Kunden läuft, ist die Einheit der Trennung auf einer geteilten Maschine. Die Größe des Pools (Prozessmanager, Anzahl der Kindprozesse, Timeouts) steht auf PHP-FPM abstimmen; Panels und Pools auf PHP-Auswahl und FPM-Pools.
Das richtige PHP-FPM neu laden
Nach einer Änderung einer PHP-Klasse, eines Operators oder einer INI laden Sie den FPM-Master neu, der die Website ausliefert. Auf
Maschinen mit mehreren PHP-Versionen ist das oft nicht der, der php-fpm heißt.
systemctl reload php-fpm # the distribution's single PHP
php bin/php/console exp:velocity deploy --no-velocity --allow-root-user # finds the right one, clears caches in order
php bin/php/console exp:velocity deploy --no-velocity --dry-run --allow-root-user # shows what it found and whyexp:velocity deploy funktioniert auch auf Websites nur mit Apache: --no-velocity überspringt die Schritte für Velocity.
[DeploySettings] PhpFpmService=auto (in settings/velocity.ini) sucht den Pool, der nach der Hosting-Domain der Installation benannt ist
oder ihr Verzeichnis nennt, in /opt/plesk/php/*/etc/php-fpm.d, /etc/php-fpm.d, /etc/php/*/fpm/pool.d und
/etc/opt/remi/php*/php-fpm.d (Velocity-Engines, Welches PHP-FPM).
Hinweis Ein Neuladen bleibt nicht auf eine Website beschränkt. Der Master bittet jeden Kindprozess jedes Pools, fertig zu werden, und Anfragen an andere Websites derselben PHP-Version warten währenddessen. Deshalb wartet
[DeploySettings] PhpFpmReload=autodarauf, dass OPcache die geänderten Dateien neu prüft, statt neu zu laden, wenn die OPcache-Einstellungen des Pools es erlauben (Velocity-Engines).
Plesk
Plesk erzeugt den virtuellen Host selbst; bearbeiten Sie seine Dateien nicht (Kapitel 8, Plesk):
- Richten Sie den Document Root der Domain auf das Wurzelverzeichnis der Installation.
- Wählen Sie in den PHP-Einstellungen „FPM application served by Apache“ und die PHP-Version.
- Behalten Sie
.htaccess(aus.htaccess_rootkopiert); der Apache von Plesk liest sie. - Installieren Sie das Zertifikat in Plesk und schalten Sie die Umleitung auf HTTPS ein.
Im SSH-Terminal von Plesk, als Systembenutzer des Abonnements und mit dem PHP der Domain, legt
/opt/plesk/php/<version>/bin/php bin/php/console exp:setup:htaccess --apply die Kopie an. Als root ergänzen Sie
--allow-root-user und bei Bedarf --owner=<abonnement-benutzer>:psacln (Plesk).
Plesk benennt jeden Pool nach der Domain in /opt/plesk/php/<version>/etc/php-fpm.d/<domain>.conf, ausgeliefert von der Unit
plesk-php<XY>-fpm (zum Beispiel plesk-php85-fpm). systemctl restart php-fpm startet einen anderen Master neu, den keine
Plesk-Website nutzt. Mehr auf Plesk.
Auslagerung des statischen Caches
Mit .htaccess_root_static oder den Regeln aus doc/eng-us/examples/staticcache_offload.conf
im vhost der öffentlichen Website beantwortet Apache eine erzeugte statische Seite aus ihrer Datei, ohne PHP zu starten. Fügen Sie
diese Regeln nie dem vhost der Administration hinzu. Siehe Statischer Cache.
Was schiefgehen kann
| Symptom | Ursache | Abhilfe |
|---|---|---|
| 404 für jede Seite | .htaccess wird nicht gelesen (AllowOverride) oder mod_rewrite ist aus | Overrides erlauben, mod_rewrite laden |
404 für jedes Asset unter design/ | der Document Root ist nicht das Wurzelverzeichnis der Installation | DocumentRoot auf das Verzeichnis mit index.php richten |
| 500 | ein PHP- oder Berechtigungsfehler | die Fehlerlogs von Apache und PHP-FPM lesen, dann var/log/error.log |
200 für /.git/config oder einen .php-Pfad des Kernels | Regeln nicht aktiv | beheben, bevor die Website öffentlich ist |
| Eine Änderung scheint nicht zu wirken | der neu geladene FPM-Master ist nicht der, der die Website ausliefert | exp:velocity deploy --no-velocity --dry-run |
Dateien in var/ gehören root | ein Konsolenskript wurde als root ausgeführt | Skripte als Benutzer der Website ausführen (Kapitel 8, Ein Benutzer oder eine Gruppe) |
Checkliste
- To do:
.htaccessaus.htaccess_rootkopiert (oder die Regeln im vhost),mod_rewriteundmod_proxy_fcgigeladen. - To do: Document Root ist das Wurzelverzeichnis der Installation.
- To do: Ein PHP-FPM-Pool pro Website, als Benutzer der Website; OPcache an.
- To do: HTTPS mit einem CA-Zertifikat; Port 80 umgeleitet, sobald HTTPS funktioniert.
- To do: Die vier Prüfungen des Routings aus Webserver und Engines bestehen.
- To do: Der Support weiß, welche FPM-Unit die Website ausliefert (
exp:velocity deploy --no-velocity --dry-run).
Demomodus mit Apache und PHP-FPM. Für eine öffentliche Demo erreicht SetEnv EXP_DEMO_MODE 1 in ihrem virtuellen Host oder ihrer .htaccess PHP-FPM als FastCGI-Parameter über mod_proxy_fcgi, den getenv() liest; env[EXP_DEMO_MODE] = 1 im Pool der Demo tut dasselbe. Beispiele für den Demomodus, Demomodus für Hoster.
Verwandte Seiten
- Einen Webserver wählen
- nginx mit PHP-FPM
- PHP-FPM abstimmen
- Benutzer und Pools pro Kunde
- Kapitel 8: Die Website ausliefern
- .htaccess und config.php von der Konsole einrichten
- Freie Dokumentation: Diese Seite darf unter der GNU FDL 1.3 frei kopiert, übersetzt und verbessert werden.
Werden Sie Exponential-Partner
Partner teilen ihre Informationen, stellen Mittel bereit, geben Beiträge zurück und entwickeln die Produkte mit uns, und so wächst Exponential. Eine Partner-Website und ein Dashboard sind für Mitte 2027 geplant: Werden Sie noch heute Partner, damit wir schneller wachsen und neue Funktionen früher liefern.