In dieser Anleitung führe ich dich Schritt für Schritt durch die Installation und Konfiguration eines LEMP-Stacks (Linux, Nginx, MySQL/MariaDB, PHP) auf Ubuntu 24.04 LTS. Zusätzlich werden wir weitere nützliche Tools und Sicherheitsmaßnahmen einrichten, um eine robuste und leistungsfähige Webserver-Umgebung zu schaffen.
Als Anfänger ist es wichtig zu verstehen, dass jeder Schritt sorgfältig ausgeführt werden sollte. Wir werden jeden Befehl und jede Konfiguration erklären, damit du nicht nur die Schritte befolgst, sondern auch verstehst, warum wir sie durchführen
Grundvoraussetzungen
Bevor wir beginnen, stelle sicher, dass du Folgendes hast:
- Einen Server oder virtuellen Server mit Ubuntu 24.04 LTS
- Root-Zugriff oder einen Benutzer mit sudo-Rechten
- Eine stabile Internetverbindung
Systemaktualisierung
sudo apt-get update
sudo apt-get upgrade -yInstallation wichtiger Pakete
sudo apt-get install -y fail2ban ufw curl wget htop nano ssh snapdDiese Befehle aktualisieren dein System und installieren wichtige Tools:
fail2ban: Schützt vor Brute-Force-Angriffenufw: Eine benutzerfreundliche Firewallcurlundwget: Zum Herunterladen von Dateienhtop: Ein interaktiver Prozess-Viewernano: Ein einfacher Texteditorssh: Für sichere Fernzugriffesnapd: Paketmanager für Snap-Pakete
Weitere Basis Pakete installieren
apt-get install -y build-essential curl nano wget lftp unzip bzip2 arj nomarch lzop htop openssl gcc git binutils libmcrypt4 libpcre3-dev make python3 python3-pip supervisor unattended-upgrades whois zsh imagemagick uuid-runtime net-tools zip dirmngr apt-transport-httpsNginx installieren und konfigurieren
Nginx ist unser Webserver. Die Installation erfolgt mit folgendem Befehl:
sudo apt install nginx -y
sudo systemctl start nginx
sudo systemctl enable nginxKonfiguriere Nginx für bessere Leistung:
sudo nano /etc/nginx/nginx.confÄndere folgende Zeilen:
user www-data;
worker_processes auto;
gzip on;
server_tokens off;
# Am Ende der Datei hinzufügen:
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;Diese Änderungen optimieren Nginx für bessere Leistung und Sicherheit.
Gzip für Nginx konfigurieren
Gzip-Komprimierung verbessert die Übertragungsgeschwindigkeit:
sudo nano /etc/nginx/conf.d/gzip.confFüge folgenden Inhalt hinzu:
gzip_comp_level 5;
gzip_min_length 256;
gzip_proxied any;
gzip_vary on;
gzip_types
application/atom+xml
application/javascript
application/json
application/rss+xml
application/vnd.ms-fontobject
application/x-web-app-manifest+json
application/xhtml+xml
application/xml
font/otf
font/ttf
image/svg+xml
image/x-icon
text/css
text/plain;Nginx SSL-Sicherheit verbessern
Generiere eine stärkere Diffie-Hellman-Gruppe für SSL:
sudo openssl dhparam -out /etc/nginx/dhparams.pem 2048Dies verbessert die SSL-Sicherheit deines Nginx-Servers.
Nginx-Einstellungen optimieren
Passe die Nginx-Konfiguration für bessere Leistung an:
sudo sed -i "s/worker_processes.*/worker_processes auto;/" /etc/nginx/nginx.conf
sudo sed -i "s/# multi_accept.*/multi_accept on;/" /etc/nginx/nginx.conf
sudo sed -i "s/# server_names_hash_bucket_size.*/server_names_hash_bucket_size 128;/" /etc/nginx/nginx.conf
sudo sed -i "s/# server_tokens off/server_tokens off/" /etc/nginx/nginx.confDiese Änderungen optimieren Nginx für bessere Leistung und Sicherheit.
Nginx Neustarten
sudo systemctl restart nginxPHP installieren und konfigurieren
PHP ist unsere Skriptsprache:
apt install -y php8.3-cli php8.3-dev php8.3-pgsql php8.3-sqlite3 php8.3-gd php8.3-curl php8.3-memcached php8.3-imap php8.3-mysql php8.3-mbstring php8.3-xml php8.3-imagick php8.3-zip php8.3-bcmath php8.3-soap php8.3-intl php8.3-readline php8.3-common php8.3-pspell php8.3-tidy php8.3-xsl php8.3-opcache php8.3-apcu
Konfiguriere PHP für bessere Leistung und Sicherheit:
sudo nano /etc/php/8.3/fpm/php.iniÄndere folgende Zeilen:
error_reporting = E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
display_errors = Off
memory_limit = 512M
upload_max_filesize = 256M
post_max_size = 256M
date.timezone = Europe/BudapestOptimiere PHP-FPM-Pool-Einstellungen:
sudo nano /etc/php/8.3/fpm/pool.d/www.confÄndere folgende Zeilen:
listen.mode = 0666
request_terminate_timeout = 60
pm.max_children = 70
pm.start_servers = 20
pm.min_spare_servers = 20
pm.max_spare_servers = 35
pm.max_requests = 500PHP-FPM-Einstellungen optimieren
Passe die PHP-FPM-Einstellungen für Produktionsumgebungen an:
sudo sed -i "s/error_reporting = .*/error_reporting = E_ALL \& ~E_NOTICE \& ~E_STRICT \& ~E_DEPRECATED/" /etc/php/8.3/fpm/php.ini
sudo sed -i "s/display_errors = .*/display_errors = Off/" /etc/php/8.3/fpm/php.ini
sudo sed -i "s/memory_limit = .*/memory_limit = 512M/" /etc/php/8.3/fpm/php.ini
sudo sed -i "s/upload_max_filesize = .*/upload_max_filesize = 256M/" /etc/php/8.3/fpm/php.ini
sudo sed -i "s/post_max_size = .*/post_max_size = 256M/" /etc/php/8.3/fpm/php.ini
sudo sed -i "s/;date.timezone.*/date.timezone = UTC/" /etc/php/8.3/fpm/php.iniDiese Einstellungen optimieren PHP für Produktionsumgebungen, indem sie Fehlerausgaben unterdrücken und Ressourcenlimits erhöhen.
PHP-FPM-Pool-Einstellungen anpassen
Optimiere die PHP-FPM-Pool-Konfiguration:
sudo sed -i "s/;listen\.mode =.*/listen.mode = 0666/" /etc/php/8.3/fpm/pool.d/www.conf
sudo sed -i "s/;request_terminate_timeout =.*/request_terminate_timeout = 60/" /etc/php/8.3/fpm/pool.d/www.conf
sudo sed -i "s/pm\.max_children =.*/pm.max_children = 70/" /etc/php/8.3/fpm/pool.d/www.conf
sudo sed -i "s/pm\.start_servers =.*/pm.start_servers = 20/" /etc/php/8.3/fpm/pool.d/www.conf
sudo sed -i "s/pm\.min_spare_servers =.*/pm.min_spare_servers = 20/" /etc/php/8.3/fpm/pool.d/www.conf
sudo sed -i "s/pm\.max_spare_servers =.*/pm.max_spare_servers = 35/" /etc/php/8.3/fpm/pool.d/www.conf
sudo sed -i "s/;pm\.max_requests =.*/pm.max_requests = 500/" /etc/php/8.3/fpm/pool.d/www.confDenk daran, nach diesen Änderungen die betroffenen Dienste neu zu starten:
sudo systemctl restart php8.3-fpm
sudo systemctl restart nginxNginx für PHP konfigurieren
Erstelle eine Nginx-Konfiguration für PHP:
sudo nano /etc/nginx/sites-available/defaultErsetze den Inhalt durch:
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
index index.php index.html index.htm;
server_name _;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
}
location ~ /\.ht {
deny all;
}
}Memcached installieren
Memcached verbessert die Performance durch Caching:
sudo apt install memcached libmemcached-tools -y
sudo sed -i 's/-l 0.0.0.0/-l 127.0.0.1/' /etc/memcached.conf
sudo systemctl restart memcachedNode.js installieren
Node.js wird oft für moderne Webanwendungen benötigt:
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.0/install.sh | bash
source ~/.bashrc
nvm install 20phpMyAdmin installieren
phpMyAdmin erleichtert die Datenbankverwaltung:
cd /var/www
sudo composer create-project phpmyadmin/phpmyadmin
sudo cp /var/www/phpmyadmin/config.sample.inc.php /var/www/phpmyadmin/config.inc.php
sudo mysql -u root -p < /var/www/phpmyadmin/sql/create_tables.sql
sudo sed -i "s/\$cfg\['blowfish_secret'\] = '';.*/\$cfg\['blowfish_secret'\] = '$(uuidgen | tr -d -)';/" /var/www/phpmyadmin/config.inc.php
sudo mkdir /var/www/phpmyadmin/tmp
sudo chown www-data:www-data /var/www/phpmyadmin/tmp
sudo ln -s /var/www/phpmyadmin/ /var/www/html/phpmyadminMongoDB installieren (optional)
Für NoSQL-Datenbanken:
curl -fsSL https://pgp.mongodb.com/server-7.0.asc | sudo gpg -o /usr/share/keyrings/mongodb-server-7.0.gpg --dearmor
echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-7.0.gpg ] https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/7.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-7.0.list
sudo apt update
sudo apt install -y mongodb-org
sudo pecl install mongodb
echo "extension=mongodb.so" | sudo tee /etc/php/8.3/fpm/conf.d/30-mongodb.ini
echo "extension=mongodb.so" | sudo tee /etc/php/8.3/cli/conf.d/30-mongodb.iniRedis installieren
Redis ist ein schneller In-Memory-Datenspeicher:
sudo apt install redis-server -y
sudo sed -i "s/supervised.*/supervised systemd/" /etc/redis/redis.conf
sudo systemctl restart redis.serviceLet’s Encrypt Certbot installieren
Let’s Encrypt ist ein kostenloser, automatisierter und offener Zertifizierungsdienst, der vonder gemeinnützigen Internet Security Research Group (ISRG) bereitgestellt wird. Certbot ist ein Tool, das die Beantragung und Erneuerung von Let’s Encrypt-Zertifikatenautomatisiert.
Installiere Certbot über Snap:
sudo snap install --classic certbotDer --classic Parameter erlaubt Certbot, außerhalb der üblichen Snap-Einschränkungen zu arbeiten.
Erstelle einen symbolischen Link, damit Certbot systemweit verfügbar ist:
sudo ln -s /snap/bin/certbot /usr/bin/certbotBeantrage ein SSL-Zertifikat für deine Domain (ersetze "deine-domain.com" durch deine tatsächliche Domain):
sudo certbot --nginx -d deine-domain.com -d www.deine-domain.comDieser Befehl wird dich durch den Prozess der Zertifikatsbeantragung führen und Nginx automatisch für die Verwendung des Zertifikats konfigurieren.
Teste die automatische Erneuerung:
sudo certbot renew --dry-runDieser Befehl simuliert den Erneuerungsprozess, ohne tatsächlich Änderungen vorzunehmen.
Konfiguriere einen Cronjob
sudo crontab -eFüge folgende Zeile hinzu:
0 12 * * * /usr/bin/certbot renew --quietDies versucht täglich um 12 Uhr mittags, das Zertifikat zu erneuern, falls es in weniger als 30 Tagen abläuft.
Überprüfe die Nginx-Konfiguration für SSL:
sudo nano /etc/nginx/sites-available/defaultStelle sicher, dass folgende Zeilen vorhanden sind:
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;Aktiviere OCSP Stapling für verbesserte Leistung und Privatsphäre:
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;Konfiguriere HSTS (HTTP Strict Transport Security) für zusätzliche Sicherheit:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;Starte Nginx neu, um die Änderungen zu übernehmen:
sudo systemctl restart nginxFTP-Server einrichten (Pure-FTPd)
FTP ermöglicht den sicheren Dateitransfer. Wir installieren und konfigurieren Pure-FTPd direkt aus dem Quellcode, da die offiziellen Ubuntu-Pakete veraltet sind.
Generiere TLS-Zertifikate für sicheren FTP-Zugang:
sudo openssl dhparam -out /etc/ssl/private/pure-ftpd-dhparams.pem 2048
sudo openssl req -x509 -days 36500 -nodes -newkey rsa:2048 -sha256 -keyout /etc/ssl/private/pure-ftpd.pem -out /etc/ssl/private/pure-ftpd.pem
sudo chmod 600 /etc/ssl/private/*.pemLade Pure-FTPd herunter, kompiliere und installiere es:
wget https://download.pureftpd.org/pub/pure-ftpd/releases/pure-ftpd-1.0.50.tar.gz -O /tmp/pure-ftpd-1.0.50.tar.gz
cd /tmp; tar -xf pure-ftpd-1.0.50.tar.gz; cd pure-ftpd-1.0.50;
./configure --prefix=/usr --with-everything --with-tls --with-certfile=/etc/ssl/private/pure-ftpd.pem
make
sudo make install
cd /tmp; rm -rf ./pure-*Konfiguriere Pure-FTPd:
sudo sed -i "s/BrokenClientsCompatibility .*/BrokenClientsCompatibility yes/" /etc/pure-ftpd.conf
sudo sed -i "s/NoAnonymous .*/NoAnonymous yes/" /etc/pure-ftpd.conf
sudo sed -i "s/# PureDB /PureDB/" /etc/pure-ftpd.conf
sudo sed -i "s/MinUID .*/MinUID 33/" /etc/pure-ftpd.conf
sudo sed -i "s/# TLS /TLS /" /etc/pure-ftpd.conf
sudo sed -i "s/# PassivePortRange .*/PassivePortRange 50000 50099/" /etc/pure-ftpd.conf
sudo touch /etc/pureftpd.passwd
sudo pure-pw mkdbDiese Einstellungen deaktivieren anonyme Logins, erlauben Benutzern in der www-data-Gruppe den Zugriff, aktivieren TLS und setzen den Portbereich für passive Verbindungen.
Erstelle den systemd-Service für Pure-FTPd:
sudo cat > /etc/systemd/system/pure-ftpd.service << EOF
[Unit]
Description=Pure-FTPd FTP server
After=network-online.target
[Service]
Type=forking
ExecStart=/usr/sbin/pure-ftpd /etc/pure-ftpd.conf
PIDFile=/var/run/pure-ftpd.pid
Restart=always
RestartSec=1
[Install]
WantedBy=multi-user.target
EOFAktiviere und starte den Pure-FTPd-Dienst:
sudo systemctl --system daemon-reload
sudo systemctl enable pure-ftpd
sudo systemctl start pure-ftpdDiese erweiterte Konfiguration bietet eine sichere und aktuelle FTP-Lösung. Beachte, dass die Verwendung von selbstsignierten Zertifikaten zu Warnungen in FTP-Clients führen kann. In einer Produktionsumgebung solltest du erwägen, ein vertrauenswürdiges SSL-Zertifikat zu verwenden.
Firewall einrichten
Eine korrekt konfigurierte Firewall ist entscheidend für die Sicherheit deines Servers. Wir verwenden UFW (Uncomplicated Firewall), eine benutzerfreundliche Schnittstelle füriptables.
Stelle sicher, dass UFW installiert ist:
ufw statusFalls nicht installiert:
sudo apt install ufw -ySetze die Standardregeln:
sudo ufw default deny incoming
sudo ufw default allow outgoingDiese Regeln blockieren standardmäßig allen eingehenden und erlauben allen ausgehenden Verkehr.
Erlaube SSH-Verbindungen (wichtig, um nicht ausgesperrt zu werden):
sudo ufw allow 22/tcpErlaube HTTP und HTTPS:
sudo ufw allow 80/tcp
sudo ufw allow 443/tcpWenn du FTP verwendest, erlaube die entsprechenden Ports:
sudo ufw allow 21/tcp
sudo ufw allow 50000:50099/tcp
# Erlaube ausgehenden FTP-Datenverkehr
sudo ufw allow out 20/tcpWenn du andere Dienste wie MySQL von außen zugänglich machen möchtest (was normalerweise nicht empfohlen wird), füge die entsprechenden Regeln hinzu:
sudo ufw allow 3306/tcpAktiviere die Firewall:
sudo ufw enableÜberprüfe den Status der Firewall:
sudo ufw status verboseKonfiguriere Logging
Optional, aber empfohlen für die Überwachung:
sudo ufw logging onFür zusätzliche Sicherheit kannst du Rate-Limiting für SSH-Verbindungen einrichten:
sudo ufw limit ssh/tcpDies begrenzt die Anzahl der SSH-Verbindungsversuche und hilft, Brute-Force-Angriffe zu verhindern.
Wenn dein Server IPv6 unterstützt, stelle sicher, dass UFW für IPv6 konfiguriert ist:
sudo nano /etc/default/ufwSetze IPV6=yes in dieser Datei.
Konfiguriere fail2ban
# Falls fail2ban noch nicht installiert ist
sudo apt install fail2ban -y
sudo systemctl enable fail2ban
sudo systemctl start fail2banErstelle eine benutzerdefinierte fail2ban-Konfiguration für SSH:
sudo nano /etc/fail2ban/jail.localFüge folgende Konfiguration hinzu:
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 3600Fail2Ban für Pure-FTPd aktivieren
sudo cat > /etc/fail2ban/jail.d/pure-ftpd.conf << EOF
[pure-ftpd]
enabled=true
maxretry=5
EOFStarte fail2ban neu:
sudo systemctl restart fail2banDiese erweiterte Firewall-Konfiguration bietet eine solide Grundlage für die Sicherheit deines Servers. Sie erlaubt nur den notwendigen Datenverkehr, schützt vor häufigen Angriffsversuchen und gibt dir die Flexibilität, bei Bedarf weitere Regeln hinzuzufügen.
Denk daran, die Firewall-Regeln regelmäßig zu überprüfen und anzupassen, besonders wenn du neue Dienste hinzufügst oder Änderungen an deiner Serverinfrastruktur vornimmst. Die Kombination von UFW und fail2ban bietet eine robuste Verteidigungslinie gegen viele gängige Netzwerkangriffe.
Logrotate für Nginx-Logs
sudo nano /etc/logrotate.d/vhostFüge folgenden Inhalt hinzu:
/var/www/logs/*.log {
rotate 10
daily
compress
delaycompress
sharedscripts
postrotate
systemctl reload nginx > /dev/null
endscript
}Unbeaufsichtigte Sicherheitsupdates
sudo nano /etc/apt/apt.conf.d/10periodicFüge folgenden Inhalt hinzu:
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Download-Upgradeable-Packages "1";
APT::Periodic::AutocleanInterval "7";
APT::Periodic::Unattended-Upgrade "1";Überprüfungen und Neustart
Überprüfe alle Konfigurationen auf Fehler und starte dann deinen Server neu:
sudo rebootNach dem Neustart, überprüfe den Status aller Dienste:
sudo systemctl --failed
sudo netstat -tulpnAbschluss
Glückwunsch! Du hast erfolgreich einen umfassenden LEMP-Stack auf Ubuntu 24.04 LTS installiert und konfiguriert. Dein Server ist nun bereit für das Hosting von Webanwendungen, mit einer robusten Konfiguration für Leistung und Sicherheit.
Denk daran, regelmäßig Backups durchzuführen und dein System auf dem neuesten Stand zu halten. Überwache die Leistung und Sicherheit deines Servers kontinuierlich und passe die Konfigurationen bei Bedarf an.
Diese detaillierte Anleitung bietet dir eine solide Grundlage für deine Webhosting-Bedürfnisse. Bei Fragen oder Problemen zögere nicht, die Dokumentation der jeweiligen Software zu konsultieren oder professionelle Hilfe in Anspruch zu nehmen.



