
Installieren und Konfigurieren von Apache+ PHP+MariaDB in Debian
LAMP ist ein Stack für Webentwicklung. Debian 13 "Trixie" enthält PHP 8.4 und MariaDB 11.8. Alle Befehle werden als root oder mit sudo ausgeführt.
Vorbereitende Maßnahmen
Falls Sie ein sauberes System haben, können Sie diesen Abschnitt überspringen und zur Apache-Installation übergehen.
Falls bereits Webkomponenten installiert sind, führen Sie die folgenden Befehle zur Sicherheit aus:
Sicherungskopie bestehender Konfigurationen erstellen
<code>mkdir -p /backup; dirs="" [ -d /etc/apache2 ] && dirs+="/etc/apache2 " [ -d /etc/mysql ] && dirs+="/etc/mysql " [ -d /var/www ] && dirs+="/var/www " [ -n "$dirs" ] && tar -czf /backup/lamp_$(date +%F).tar.gz $dirs </code>
Systemupdate und Portprüfung
<code>apt update && apt full-upgrade -y ss -tuln | grep -E ':(80|443)\s' || echo "Ports 80/443 sind frei" systemctl is-active nginx >/dev/null && { systemctl stop nginx; systemctl disable nginx; } </code>
Diese Befehle:
- Erstellen eine Sicherungskopie nur von vorhandenen Konfigurationen
- Prüfen die Verfügbarkeit der Ports 80/443
- Stoppen Nginx, falls installiert (um Konflikte mit Apache zu vermeiden)
Apache Installation
<code>apt install apache2 -y systemctl enable apache2 --now a2enmod rewrite ssl headers expires deflate systemctl reload apache2 </code>
Test: Öffnen Sie die Server-IP im Browser:
<code>hostname -I | awk '{print $1}' </code>
Firewall-Konfiguration
<code>apt install ufw -y SSH_PORT=$(ss -tuln | grep -w ssh | grep -oP '0.0.0.0:\K[0-9]+|:::\K[0-9]+' | head -1) ufw allow ${SSH_PORT:-22} ufw allow 80,443/tcp ufw --force enable </code>
Virtual Host
Verzeichnis und Testseite erstellen:
<code>mkdir -p /var/www/helloworld.net && chown -R www-data:www-data /var/www/helloworld.net && chmod -R 755 /var/www/helloworld.net cat > /var/www/helloworld.net/index.html << 'EOF' <!DOCTYPE html><html lang="de"><head><meta charset="UTF-8"><title>Hello World</title></head><body><h1>Hello World - Debian 13</h1></body></html> EOF </code>
Konfiguration:
Erstellen Sie /etc/apache2/sites-available/helloworld.net.conf
:
<code><VirtualHost *:80> ServerName helloworld.net ServerAlias www.helloworld.net DocumentRoot /var/www/helloworld.net ErrorLog ${APACHE_LOG_DIR}/helloworld.net.error.log CustomLog ${APACHE_LOG_DIR}/helloworld.net.access.log combined <Directory /var/www/helloworld.net> Options +FollowSymLinks -Indexes AllowOverride All Require all granted </Directory> Header set X-Content-Type-Options nosniff Header set X-Frame-Options DENY </VirtualHost> </code>
Aktivierung:
<code>a2dissite 000-default.conf 2>/dev/null a2ensite helloworld.net.conf apache2ctl configtest && systemctl reload apache2 </code>
Test: Besuchen Sie http://helloworld.net
PHP 8.4 Installation
<code>apt install php8.4 php8.4-fpm php8.4-mysql php8.4-cli php8.4-common php8.4-curl php8.4-gd php8.4-mbstring php8.4-xml php8.4-zip -y a2enmod proxy_fcgi setenvif a2enconf php8.4-fpm systemctl enable php8.4-fpm --now systemctl reload apache2 </code>
PHP-Test
Erstellen Sie die Datei /var/www/helloworld.net/test.php
:
<code><?php echo "<h1>PHP ".phpversion()."</h1><p>Server: ".php_uname()."</p><p>Zeit: ".date('Y-m-d H:i:s')."</p><h3>Erweiterungen:</h3><ul>"; foreach(['mysqli','curl','gd','mbstring','xml'] as $ext) echo "<li>$ext: ".(extension_loaded($ext)?"✅":"❌")."</li>"; echo "</ul>"; ?> </code>
Test: Besuchen Sie http://helloworld.net/test.php
MariaDB Installation
<code>apt install mariadb-server mariadb-client -y systemctl enable mariadb --now mysql_secure_installation </code>
MariaDB 11.8 verwendet standardmäßig unix_socket für root. Empfohlene Antworten im Assistenten:
- N — root-Passwort nicht ändern
- Y — anonyme Benutzer entfernen
- Y — root-Fernzugriff verbieten
- Y — Test-Datenbank entfernen
- Y — Berechtigungstabellen neu laden
Datenbankverbindungstest
<code>WEBAPP_PASSWORD="secure_webapp_$(date +%s)_$(openssl rand -hex 6)" mysql -e "CREATE DATABASE test_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE USER 'webapp'@'localhost' IDENTIFIED BY '$WEBAPP_PASSWORD'; GRANT ALL ON test_db.* TO 'webapp'@'localhost'; FLUSH PRIVILEGES;" echo "$WEBAPP_PASSWORD" > /root/.webapp_password chmod 600 /root/.webapp_password </code>
Erstellen Sie config.php
:
<code><?php $webapp_password = trim(file_get_contents('/root/.webapp_password')); $conn = new mysqli('localhost', 'webapp', $webapp_password, 'test_db'); ?> </code>
Erstellen Sie db_test.php
zur Überprüfung:
<code><?php require_once 'config.php'; if($conn->connect_error) die("DB-Fehler: {$conn->connect_error}"); echo "<h2>✅ MariaDB</h2><p>Version: {$conn->server_info}</p>"; ?> </code>
Test: Besuchen Sie http://helloworld.net/db_test.php
phpMyAdmin Installation
<code>apt install phpmyadmin -y </code>
Virtual Host /etc/apache2/sites-available/phpmyadmin.conf
erstellen:
<code><VirtualHost *:80> ServerName phpmyadmin.local DocumentRoot /usr/share/phpmyadmin <Directory /usr/share/phpmyadmin> Options +FollowSymLinks -Indexes AllowOverride All Require all granted <Files "config.inc.php">Require all denied</Files> </Directory> </VirtualHost> </code>
<code>a2ensite phpmyadmin.conf systemctl reload apache2 </code>
Zugriff: http://phpmyadmin.local
Optimierung
Apache
<code>a2enmod cache cache_disk expires systemctl reload apache2 </code>
MariaDB
Hinzufügen in /etc/mysql/mariadb.conf.d/50-server.cnf
:
<code>[mysqld] innodb_buffer_pool_size=128M innodb_log_file_size=32M max_connections=100 slow_query_log=1 long_query_time=2 </code>
HTTPS mit Let's Encrypt
<code>apt install certbot python3-certbot-apache -y certbot --apache -d helloworld.net -d www.helloworld.net </code>
Überwachung und Protokolle
Erstellen Sie status.php
:
<code><?php header('Content-Type: application/json; charset=utf-8'); echo json_encode(['status'=>'ok','time'=>date('Y-m-d H:i:s')], JSON_PRETTY_PRINT|JSON_UNESCAPED_UNICODE); ?> </code>
Zusätzliche Sicherheit (für Produktionsumgebung)
Für Entwicklungs- und Testumgebungen kann dieser Abschnitt übersprungen werden — der grundlegende UFW-Schutz ist ausreichend.
Für Produktionsumgebungen wird zusätzlicher Schutz empfohlen:
Fail2Ban
<code>apt install fail2ban -y systemctl enable fail2ban --now </code>
Konfiguration /etc/fail2ban/jail.local
erstellen:
<code>[DEFAULT] bantime = 3600 findtime = 600 maxretry = 3 [sshd] enabled = true [apache-auth] enabled = true port = http,https [apache-badbots] enabled = true port = http,https [apache-noscript] enabled = true port = http,https [apache-overflows] enabled = true port = http,https </code>
<code>systemctl restart fail2ban fail2ban-client status </code>
Diagnose
Skript /usr/local/bin/lamp-check
erstellen:
<code>#!/bin/bash echo "=== LAMP Status ===" systemctl status apache2 mariadb php8.4-fpm echo "=== Web Status ===" curl -s http://helloworld.net/status.php | jq . </code>
<code>chmod +x /usr/local/bin/lamp-check </code>
Updates und Wartung
<code>apt install unattended-upgrades -y </code>
Cron-Job für wöchentliche Wartung erstellen:
<code>echo "0 2 * * 0 apt update && apt upgrade -y && mysqlcheck --all-databases --optimize -u root" >> /etc/crontab </code>
Fertig!
LAMP auf Debian 13 mit PHP 8.4 und MariaDB 11.8 ist installiert, optimiert und abgesichert!
Content
- Vorbereitende Maßnahmen
- Apache Installation
- Firewall-Konfiguration
- Virtual Host
- PHP 8.4 Installation
- PHP-Test
- MariaDB Installation
- Datenbankverbindungstest
- phpMyAdmin Installation
- Optimierung
- HTTPS mit Let's Encrypt
- Überwachung und Protokolle
- Zusätzliche Sicherheit (für Produktionsumgebung)
- Diagnose
- Updates und Wartung
- Fertig!