Deutsch

LEMP-Stack auf einem AlmaLinux-9-Linux-VPS installieren

2 min
VPS/VDS-Hosting

Ein LEMP-Stack (Linux, Nginx, MariaDB, PHP-FPM) ist eine schnelle, schlanke Alternative zu Apache für PHP-Websites. Unter AlmaLinux 9 kommt alles aus dem offiziellen AppStream-Repository, doch SELinux und firewalld verlangen etwas Aufmerksamkeit. Diese Anleitung führt Sie durch eine saubere Installation auf Ihrem VPS Linux Infrawire; dieselben Schritte funktionieren unter Rocky Linux 9.

📋 Voraussetzungen

  • Ein KVM-VPS mit AlmaLinux 9 (IP und Root-Passwort finden Sie in Ihrem Kundenbereich)
  • SSH-Zugang als root
  • Eine Domain example.com, die auf VPS_IP zeigt

1. System aktualisieren und Werkzeuge installieren

Bash
dnf -y update dnf -y install nano policycoreutils-python-utils

policycoreutils-python-utils liefert semanage, das im SELinux-Abschnitt gebraucht wird.

2. Nginx installieren und Firewall öffnen

Bash
dnf -y install nginx systemctl enable --now nginx firewall-cmd --permanent --add-service=http --add-service=https firewall-cmd --reload firewall-cmd --list-services

3. MariaDB installieren

Bash
dnf -y install mariadb-server systemctl enable --now mariadb mysql_secure_installation

Beantworten Sie die Fragen des Assistenten: Root-Passwort setzen, anonyme Benutzer entfernen, Remote-Root-Login verbieten und die Testdatenbank löschen. Legen Sie danach eine Datenbank und einen eigenen Benutzer an:

Bash
mysql -u root -p
SQL
1CREATE DATABASE appdb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; 2CREATE USER 'appuser'@'localhost' IDENTIFIED BY 'STRONG_PASSWORD'; 3GRANT ALL PRIVILEGES ON appdb.* TO 'appuser'@'localhost'; 4FLUSH PRIVILEGES; 5EXIT;

4. PHP 8.3 über das AppStream-Modul installieren

AppStream bietet mehrere PHP-Streams. Wählen Sie vor der Installation den gewünschten aus:

Bash
dnf module list php dnf -y module reset php dnf -y module enable php:8.3 dnf -y install php-fpm php-cli php-mysqlnd php-gd php-mbstring php-xml php-intl php-opcache php-pecl-zip php -v

Standardmäßig läuft der PHP-FPM-Pool als Benutzer apache. Da Nginx als nginx läuft, gleichen Sie Pool und Session-Verzeichnisse an:

Bash
sed -i 's/^user = apache/user = nginx/; s/^group = apache/group = nginx/' /etc/php-fpm.d/www.conf chown -R root:nginx /var/lib/php/session /var/lib/php/wsdlcache /var/lib/php/opcache grep -E '^(user|group|listen)' /etc/php-fpm.d/www.conf systemctl enable --now php-fpm

Der Pool lauscht auf dem Unix-Socket /run/php-fpm/www.sock.

5. Server-Block anlegen

Bash
mkdir -p /var/www/example.com/public chown -R nginx:nginx /var/www/example.com nano /etc/nginx/conf.d/example.com.conf
Nginx
1server { 2 listen 80; 3 listen [::]:80; 4 server_name example.com www.example.com; 5 root /var/www/example.com/public; 6 index index.php index.html; 7 8 location / { 9 try_files $uri $uri/ /index.php?$query_string; 10 } 11 12 location ~ \.php$ { 13 include fastcgi_params; 14 fastcgi_pass unix:/run/php-fpm/www.sock; 15 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 16 } 17 18 location ~ /\.(?!well-known) { 19 deny all; 20 } 21}
Bash
nginx -t && systemctl reload nginx

6. SELinux konfigurieren

Lassen Sie SELinux im Modus enforcing (getenforce). Dateien, die unter /var/www neu angelegt werden, erhalten bereits das Label httpd_sys_content_t, per mv von anderswo verschobene Dateien behalten jedoch ihr altes Label. Setzen Sie die Labels zurück und gewähren Sie Schreibrechte nur den Verzeichnissen, die sie brauchen:

Bash
restorecon -Rv /var/www/example.com mkdir -p /var/www/example.com/public/uploads semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/example.com/public/uploads(/.*)?' restorecon -Rv /var/www/example.com/public/uploads

Aktivieren Sie Booleans nur, wenn Ihre Anwendung sie benötigt:

Bash
# PHP verbindet sich per TCP mit einer Datenbank (Remote-Server oder 127.0.0.1) setsebool -P httpd_can_network_connect_db 1 # PHP oder Nginx baut ausgehende Verbindungen auf (APIs, proxy_pass zu einer App) setsebool -P httpd_can_network_connect 1

Eine lokale MariaDB, die über ihren Socket erreicht wird, braucht keines von beiden. Mit ausearch -m avc -ts recent sehen Sie, was SELinux blockiert. Beheben Sie ein Problem niemals mit setenforce 0.

7. PHP testen und die Testdatei löschen

Bash
echo '<?php phpinfo();' > /var/www/example.com/public/info.php curl -sI http://example.com/info.php | head -n 1 rm /var/www/example.com/public/info.php

Erwartet wird HTTP/1.1 200 OK. Die phpinfo()-Seite verrät Ihre Konfiguration, löschen Sie sie daher sofort. Prüfen Sie zum Schluss die Dienste:

Bash
systemctl is-active nginx php-fpm mariadb

🛠️ Fehlerbehebung

502 Bad Gateway. PHP-FPM ist gestoppt oder der Socket-Pfad in fastcgi_pass ist falsch. Führen Sie systemctl status php-fpm aus, prüfen Sie ls -l /run/php-fpm/www.sock und lesen Sie /var/log/nginx/error.log. Meldet das Log Permission denied am Socket, suchen Sie mit ausearch nach einer AVC-Ablehnung.

403 Forbidden oder Permission denied. Prüfen Sie Besitzer (nginx:nginx) und SELinux-Label mit ls -Z /var/www/example.com/public. Es sollte httpd_sys_content_t lauten; falls nicht, führen Sie restorecon -Rv aus.

»File not found.« oder leere Seite. Der root-Pfad oder die Zeile SCRIPT_FILENAME ist falsch. Prüfen Sie beides und danach nginx -t.

Keine Verbindung zu externer Datenbank oder API. SELinux blockiert ausgehende Verbindungen standardmäßig: Aktivieren Sie httpd_can_network_connect_db oder httpd_can_network_connect wie oben gezeigt.


🎉 Nginx, MariaDB und PHP-FPM laufen auf AlmaLinux 9, SELinux bleibt im Enforcing-Modus.

Bleiben Sie über die neuesten Angebote, Rabatte und Sonderaktionen informiert.

Aktionen ansehen

Wir verwenden Cookies

Wir verwenden Analyse-Cookies, um Ihre Erfahrung auf unserer Website zu verbessern. Es werden keine Daten an Dritte verkauft. Mehr erfahren Sie in unserer Datenschutzerklärung.