PHP unter Linux installieren und konfigurieren – PHP 8.5, PHP-FPM, Composer
PHP ist trotz aller Kritik die Basis von WordPress, Laravel, Symfony und unzähligen anderen Frameworks. Wer PHP auf Linux sauber aufsetzen will, steht schnell vor Fragen: Welche Version? PPA oder Distro-Pakete? PHP-FPM mit nginx oder Apache? Dieser Guide gibt klare Antworten.
Welche PHP-Version für wen?
| Version | Status | Support bis | Empfehlung |
|---|---|---|---|
| PHP 8.5 | Aktiv | 2029-12-31 | Neue Projekte |
| PHP 8.4 | Aktiv | 2028-12-31 | Produktiv (stabil) |
| PHP 8.3 | Security only | 2027-12-31 | Legacy-Projekte |
| PHP 8.2 | EOL | 2025-12-31 | ❌ Nicht mehr nutzen |
Laravel 11/12 → PHP 8.2+ (empfohlen: 8.4+) WordPress → PHP 7.4+ (empfohlen: 8.2+, optimal: 8.3/8.4) Symfony 7 → PHP 8.2+
PHP installieren: Ubuntu/Debian
Ubuntu 24.04 LTS: Distro-Paket
Ubuntu 24.04 enthält PHP 8.3. Für 8.4/8.5 braucht man das PPA von Ondřej Surý.
# PHP aus Distro-Repos (Ubuntu 24.04 = PHP 8.3)
sudo apt update
sudo apt install -y php php-cli php-common
php -v
# PHP 8.3.x (cli) (built: ...)
Ubuntu/Debian: Ondřej Surý PPA (empfohlen für aktuelle Versionen)
# Abhängigkeiten installieren
sudo apt install -y apt-transport-https ca-certificates curl
# PPA hinzufügen
sudo add-apt-repository ppa:ondrej/php # Ubuntu
# Oder für Debian:
curl -sSL https://packages.sury.org/php/README.txt | sudo bash -x
sudo apt update
# PHP 8.5 installieren
sudo apt install -y php8.5 php8.5-cli php8.5-common
# PHP 8.4 installieren (stabil, empfohlen)
sudo apt install -y php8.4 php8.4-cli php8.4-common
# Aktive Version prüfen
php -v
Basis-Extensions installieren
# Für typische Web-Anwendungen (Laravel, Symfony, WordPress)
sudo apt install -y \
php8.4-fpm \
php8.4-mysql \
php8.4-pgsql \
php8.4-sqlite3 \
php8.4-redis \
php8.4-mbstring \
php8.4-xml \
php8.4-curl \
php8.4-zip \
php8.4-gd \
php8.4-intl \
php8.4-bcmath \
php8.4-opcache \
php8.4-readline
# Prüfen welche Extensions installiert sind
php -m
php8.4 -m | sort
PHP installieren: Fedora
# Fedora 43 enthält PHP 8.3
sudo dnf install php php-cli php-common
# Neuere PHP-Versionen via Remi Repository
sudo dnf install https://rpms.remirepo.net/fedora/remi-release-$(rpm -E %fedora).rpm
# PHP 8.4 Stream aktivieren
sudo dnf module reset php
sudo dnf module enable php:remi-8.4
# PHP installieren
sudo dnf install php php-fpm php-cli
# Extensions
sudo dnf install php-mysqlnd php-pgsql php-sqlite3 \
php-mbstring php-xml php-curl php-zip php-gd \
php-intl php-bcmath php-opcache php-redis
php -v
PHP-FPM mit nginx einrichten
PHP-FPM (FastCGI Process Manager) ist der Standard-Weg, PHP mit nginx zu betreiben.
PHP-FPM starten
# Service starten und aktivieren
sudo systemctl enable --now php8.4-fpm
# Status prüfen
sudo systemctl status php8.4-fpm
# Socket prüfen
ls -la /run/php/php8.4-fpm.sock
# srw-rw---- 1 www-data www-data ... /run/php/php8.4-fpm.sock
nginx für PHP konfigurieren
sudo nano /etc/nginx/sites-available/meine-php-app
server {
listen 80;
server_name meine-app.de www.meine-app.de;
root /var/www/meine-app/public;
index index.php index.html;
# Laravel/Symfony: alle Anfragen an index.php
location / {
try_files $uri $uri/ /index.php?$query_string;
}
# PHP-FPM FastCGI
location ~ \.php$ {
fastcgi_pass unix:/run/php/php8.4-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_buffer_size 128k;
fastcgi_buffers 256 16k;
fastcgi_busy_buffers_size 256k;
}
# .htaccess und versteckte Dateien verweigern
location ~ /\. {
deny all;
}
# Statische Assets cachen
location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff2)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
}
# Site aktivieren
sudo ln -s /etc/nginx/sites-available/meine-php-app /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
PHP-FPM Pool konfigurieren
# Pool-Konfiguration
sudo nano /etc/php/8.4/fpm/pool.d/www.conf
[www]
user = www-data
group = www-data
; Verbindungstyp (Unix-Socket empfohlen für lokale Verbindungen)
listen = /run/php/php8.4-fpm.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
; Prozess-Management
pm = dynamic ; dynamic, static, oder ondemand
pm.max_children = 50 ; max. gleichzeitige PHP-Prozesse
pm.start_servers = 5 ; Prozesse beim Start
pm.min_spare_servers = 5
pm.max_spare_servers = 15
pm.max_requests = 500 ; Prozess nach N Requests neu starten (Memory-Leak-Schutz)
; Logging
slowlog = /var/log/php8.4-fpm-slow.log
request_slowlog_timeout = 5s ; Requests > 5s loggen
sudo systemctl restart php8.4-fpm
Wichtige PHP-Extensions
# Datenbankzugriff
php8.4-mysql # MySQL/MariaDB (PDO + mysqli)
php8.4-pgsql # PostgreSQL
php8.4-sqlite3 # SQLite
# Strings und Encoding
php8.4-mbstring # Multi-byte Strings (Pflicht für viele Frameworks!)
php8.4-intl # Internationalization (Datums-/Zahlenformate)
# Daten und Serialisierung
php8.4-xml # XML-Parsing (SimpleXML, DOMDocument)
php8.4-zip # ZIP-Dateien
php8.4-bcmath # Präzise Gleitkommarechnung
# Netzwerk und HTTP
php8.4-curl # HTTP-Requests
# Bilder
php8.4-gd # GD-Bildbearbeitung
php8.4-imagick # ImageMagick (mächtiger als GD)
# Caching
php8.4-opcache # Bytecode-Cache (Pflicht in Produktion!)
php8.4-redis # Redis
php8.4-memcached # Memcached
# Dev-Tools
php8.4-xdebug # Debugger (nur Development!)
# Für Laravel 11/12 minimal:
# mbstring, xml, curl, zip, pdo_mysql, opcache, bcmath, tokenizer, ctype
php.ini optimieren
# php.ini für FPM (Produktion)
sudo nano /etc/php/8.4/fpm/php.ini
# php.ini für CLI (Entwicklung)
sudo nano /etc/php/8.4/cli/php.ini
Wichtige Einstellungen
; === Grenzen ===
; Maximale Ausführungszeit
max_execution_time = 60 ; Standard: 30s; für lange Imports: höher
; Maximaler RAM pro Request
memory_limit = 256M ; Standard: 128M; für Laravel: 256M+
; Upload-Limits
upload_max_filesize = 64M ; Standard: 2M
post_max_size = 64M ; muss >= upload_max_filesize sein
; === Fehlerbehandlung ===
; Produktion:
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
display_errors = Off ; NIEMALS auf Produktion On!
log_errors = On
error_log = /var/log/php8.4-error.log
; Entwicklung:
; display_errors = On
; error_reporting = E_ALL
; === Sicherheit ===
expose_php = Off ; PHP-Version nicht in HTTP-Header verraten
allow_url_fopen = Off ; Remote-Dateien öffnen deaktivieren
allow_url_include = Off ; Remote-Include deaktivieren
; === Performance ===
; Opcache-Konfiguration (in separater Datei oder in php.ini):
opcache.enable = 1
opcache.memory_consumption = 256 ; Opcache-Speicher in MB
opcache.interned_strings_buffer = 16
opcache.max_accelerated_files = 20000
opcache.revalidate_freq = 60 ; Cache-Invalidierung (Sekunden)
; 0 = nie (schnell, für Produktion)
; 60 = jede Minute prüfen
opcache.save_comments = 1 ; für Doctrine/Laravel nötig
opcache.enable_cli = 0 ; CLI braucht Opcache meist nicht
# Änderungen aktivieren
sudo systemctl restart php8.4-fpm
# Konfiguration prüfen
php -i | grep -E "memory_limit|max_execution|upload_max"
Composer: Abhängigkeiten verwalten
Composer ist der Paketmanager für PHP.
Installation
# Composer global installieren
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === file_get_contents('https://composer.github.io/installer.sig')) { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
sudo php composer-setup.php --install-dir=/usr/local/bin --filename=composer
php -r "unlink('composer-setup.php');"
# Version prüfen
composer --version
# Composer version 2.8.x
# Oder über Distro (oft ältere Version)
sudo apt install composer # Ubuntu/Debian
Grundlegende Befehle
# Neues Projekt erstellen
composer create-project laravel/laravel mein-projekt
composer create-project symfony/skeleton mein-projekt
# Abhängigkeiten installieren (aus composer.json)
composer install
# Produktions-Installation (ohne Dev-Dependencies)
composer install --no-dev --optimize-autoloader
# Abhängigkeit hinzufügen
composer require guzzlehttp/guzzle
composer require --dev phpunit/phpunit
# Abhängigkeiten aktualisieren
composer update # alle
composer update vendor/paket # spezifisches Paket
# Autoloader optimieren (Produktion)
composer dump-autoload --optimize
# Sicherheitslücken prüfen
composer audit
composer.json verstehen
{
"name": "mein-unternehmen/meine-app",
"require": {
"php": "^8.4",
"laravel/framework": "^12.0",
"guzzlehttp/guzzle": "^7.0"
},
"require-dev": {
"phpunit/phpunit": "^11.0",
"fakerphp/faker": "^1.9"
},
"autoload": {
"psr-4": {
"App\\": "app/"
}
},
"config": {
"optimize-autoloader": true,
"preferred-install": "dist"
}
}
Mehrere PHP-Versionen parallel
Mit dem Ondřej-PPA kannst du mehrere PHP-Versionen nebeneinander betreiben.
# Mehrere Versionen installieren
sudo apt install php8.3 php8.3-fpm php8.3-cli
sudo apt install php8.4 php8.4-fpm php8.4-cli
sudo apt install php8.5 php8.5-fpm php8.5-cli
# Beide FPM-Dienste laufen parallel auf unterschiedlichen Sockets:
ls /run/php/
# php8.3-fpm.sock
# php8.4-fpm.sock
# php8.5-fpm.sock
# Standard-CLI-Version wählen
sudo update-alternatives --config php
# oder:
sudo update-alternatives --set php /usr/bin/php8.4
# Prüfen
php -v
In nginx verschiedene PHP-Versionen pro Site
# Site A mit PHP 8.4
server {
server_name site-a.de;
location ~ \.php$ {
fastcgi_pass unix:/run/php/php8.4-fpm.sock;
include fastcgi_params;
}
}
# Site B mit PHP 8.3 (Legacy)
server {
server_name site-b.de;
location ~ \.php$ {
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
include fastcgi_params;
}
}
Häufige Probleme
502 Bad Gateway von nginx
# PHP-FPM läuft?
sudo systemctl status php8.4-fpm
# Socket vorhanden?
ls -la /run/php/php8.4-fpm.sock
# nginx auf korrekten Socket-Pfad?
grep fastcgi_pass /etc/nginx/sites-enabled/*
# PHP-FPM-Logs prüfen
sudo journalctl -u php8.4-fpm -f
sudo tail -f /var/log/php8.4-fpm.log
Extension fehlt (Class not found, Call to undefined function)
# Extension-Fehler in Laravel:
# "Class 'PDO' not found"
sudo apt install php8.4-mysql
sudo systemctl restart php8.4-fpm
# Installierte Extensions prüfen
php -m | grep pdo
php8.4 -m | grep -i gd
# Alle Extension-Pakete für php8.4 anzeigen
apt search "php8.4-"
Opcache macht Änderungen unsichtbar
# In Entwicklung: Opcache deaktivieren oder revalidate_freq=0 setzen
sudo nano /etc/php/8.4/fpm/php.ini
# opcache.revalidate_freq = 0 (für Entwicklung)
# Oder Opcache per Request leeren (nur Development!):
opcache_reset(); # in PHP
# Oder PHP-FPM neu starten (Produktionsfix)
sudo systemctl restart php8.4-fpm
permission denied für PHP-FPM auf Dateien
# PHP-FPM läuft als www-data
# Verzeichnis muss www-data gehören
sudo chown -R www-data:www-data /var/www/meine-app/storage
sudo chmod -R 775 /var/www/meine-app/storage
# Oder: Benutzer zur www-data-Gruppe hinzufügen
sudo usermod -aG www-data $USER
# Neu anmelden!
Fazit
PHP unter Linux ist schnell eingerichtet – der schwierigste Teil ist oft die korrekte Konfiguration von PHP-FPM und nginx. Die wichtigsten Punkte:
- PHP 8.4 für neue Produktivprojekte, 8.5 für Bleeding-Edge
- Ondřej-PPA (Ubuntu) oder Remi (Fedora) für aktuelle Versionen
- PHP-FPM + Unix-Socket ist schneller als TCP für lokale nginx-Verbindungen
- Opcache immer aktiv in Produktion (2-5× schneller)
- Composer für Abhängigkeiten –
composer auditregelmäßig ausführen