PHP unter Linux installieren und konfigurieren – PHP 8.5, PHP-FPM, Composer

PHP 8.5 unter Ubuntu, Debian und Fedora installieren: PHP-FPM für nginx, mehrere PHP-Versionen parallel, Composer für Abhängigkeiten, Opcache und wichtige php.ini-Einstellungen.

8 min Lesezeit

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 audit regelmäßig ausführen

War dieser Artikel hilfreich?