Skip to content

PHP-FPM Image

Kompletter Web-Stack mit separatem PHP-FPM- und Nginx-Image, für Web-Apps, REST-APIs und SPAs. Security-Headers, Gzip-Kompression, Static-Asset-Caching, FPM-Pool-Tuning. Alles per ENV konfigurierbar.

Überblick

Das Projekt liefert zwei zusammengehörige Images: headgent/phpfpm (PHP-FPM mit vollständigem Extension-Stack) und headgent/nginx (vorkonfigurierter Reverse-Proxy mit Security-Hardening). Beide sind Multi-Arch, Multi-Stage und ohne Rebuild über Environment-Variablen konfigurierbar.

GitHub: jardisOps/phpfpm

ImageTag-FormatGröße
headgent/phpfpm8.2, 8.3, 8.4, latest~130 MB
headgent/nginx1.28~25 MB
EigenschaftWert
PHP-Versionen8.2, 8.3, 8.4
Nginx-Version1.28
Architekturenlinux/amd64, linux/arm64
BasisAlpine 3.23

Installation

bash
docker pull headgent/phpfpm:8.4
docker pull headgent/nginx:1.28

Quick Start

yaml
# docker-compose.yml
services:
  app:
    image: headgent/phpfpm:8.4
    volumes:
      - ./:/app
    environment:
      PHP_MEMORY_LIMIT: 256M
      XDEBUG_MODE: "off"
      FPM_PM_MAX_CHILDREN: 10

  webserver:
    image: headgent/nginx:1.28
    ports:
      - "80:80"
    environment:
      APP_ROOT: /app
      DOCUMENT_ROOT: /public
      INDEX_FILE: index.php
      PHP_PORT: 9000
    depends_on:
      - app

PHP-FPM Image

Extensions

Das PHP-FPM-Image enthält denselben Extension-Stack wie das CLI-Image, mit Ausnahme von pcntl (nicht relevant für FPM-Prozesse):

Datenbank: pdo, pdo_mysql, mysqli, pdo_pgsql Messaging: amqp (2.2.0), rdkafka (6.0.5) Caching: apcu (5.1.28), redis (6.3.0), opcache Web/I/O: curl, soap, sockets, dom, zip Text: mbstring, intl, bcmath Media: gd (FreeType + JPEG), exif Debugging: xdebug (3.5.1), pcov (1.0.12)

PHP-Konfiguration

Identisch zum CLI-Image, mit einem Unterschied:

VariableCLI DefaultFPM Default
PHP_MAX_EXECUTION_TIME0 (unbegrenzt)30 (Sekunden)
XDEBUG_MODEdebugoff
OPCACHE_VALIDATE_TIMESTAMPS0 (Produktion)
OPCACHE_REVALIDATE_FREQ20 (Produktion)

FPM-Pool-Konfiguration

VariableDefaultBeschreibung
FPM_PMdynamicProzess-Manager (static, dynamic, ondemand)
FPM_PM_MAX_CHILDREN5Max. Worker-Prozesse
FPM_PM_START_SERVERS2Initiale Worker
FPM_PM_MIN_SPARE_SERVERS1Min. Idle-Worker
FPM_PM_MAX_SPARE_SERVERS3Max. Idle-Worker
FPM_PM_MAX_REQUESTS500Requests pro Worker vor Restart

Pool-Tuning für Produktion

Für Produktionslasten: FPM_PM=static mit FPM_PM_MAX_CHILDREN = verfügbarer RAM ÷ ~40 MB pro Worker. Ein Server mit 4 GB RAM → FPM_PM_MAX_CHILDREN=80 (abzüglich OS + Nginx + Redis).

Health Check

Das Image hat einen eingebauten Health Check über den FPM-Ping-Endpoint:

cgi-fcgi -bind -connect 127.0.0.1:9000 /ping → "pong"

Status-Endpoint: /status (FPM-Pool-Statistiken).

Nginx Image

Features

  • Gzip-Kompression — Level 6, für JS, JSON, XML, CSS, Text, SVG
  • Security-Headers — HSTS, CSP, X-Frame-Options, X-Content-Type-Options, X-XSS-Protection
  • Static-Asset-Caching — 1 Jahr für CSS, JS, Bilder, Fonts, Icons
  • FastCGI-Optimierung — 128k Buffer, 600s Timeout, korrekte PATH_INFO-Behandlung
  • Real-IP-Unterstützung — Docker-Netzwerke und Private Networks
  • Sicherheit — Blockiert .htaccess, .svn, .git, .env

Konfiguration

VariableDefaultBeschreibung
APP_ROOT/appBasis-Verzeichnis der Anwendung
DOCUMENT_ROOT/publicRelative Document Root
INDEX_FILEindex.phpFront-Controller
HOSTlocalhostServer-Name
PHP_PORT9000PHP-FPM Port

Die Nginx-Konfiguration wird beim Start via envsubst aus einem Template generiert. Die Variablen werden zur Laufzeit eingesetzt.

Security-Headers

Referrer-Policy: no-referrer-when-downgrade
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
Strict-Transport-Security: max-age=31536000; includeSubDomains
Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'

Blockierte Pfade

/.htaccess  → 403
/.svn       → 403
/.git       → 403
/.env       → 403

Sicherheit

  • Non-Root-Execution — beide Images laufen als appuser (konfigurierbar via PUID/PGID)
  • Automatische UID/GID-Anpassung — FPM-Image passt sich an den Volume-Owner an
  • Kein Xdebug in Produktion — Default XDEBUG_MODE=off
  • expose_php = Off — PHP-Version wird nicht exponiert
  • Server-Tokens deaktiviert — Nginx-Version wird nicht exponiert
  • Health Check — FPM-Ping auf Port 9000

Makefile

TargetBeschreibung
make phpfpm-buildPHP-FPM lokal bauen
make phpfpm-build-allAlle PHP-Versionen lokal bauen
make nginx-buildNginx lokal bauen
make build-allAlle Images lokal bauen
make phpfpm-pushPHP-FPM multi-arch bauen und pushen
make phpfpm-push-allAlle PHP-Versionen multi-arch pushen
make nginx-pushNginx multi-arch pushen
make build-and-push-allAlles bauen und pushen
make build-cache-deleteBuildx-Cache löschen
make infoBuild-Konfiguration anzeigen

Use Cases

  • Web-Frameworks — Laravel, Symfony, Slim, Custom
  • REST-APIs & GraphQL — JSON-Endpoints mit FastCGI-Optimierung
  • Single-Page-Apps — Static-Asset-Serving mit 1-Jahr-Cache
  • E-Commerce & SaaS — Produktions-Stack mit Pool-Tuning
  • WordPress & CMS — Standard-PHP-Anwendungen