open:it_apache
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung | ||
| open:it_apache [2022/11/29 15:50] – [Apache Web Server] k@i | open:it_apache [2026/08/20 14:51] (aktuell) – gelöscht - Externe Bearbeitung (Unbekanntes Datum) 127.0.0.1 | ||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| - | ====== Apache Web-Server ====== | ||
| - | Installation unter Debian 11 | ||
| - | ===== Apache Web Server ===== | ||
| - | Siehe https:// | ||
| - | oder https:// | ||
| - | |||
| - | Apache Webserver installieren (Siehe #Begriffe) | ||
| - | $ sudo apt-get update | ||
| - | $ sudo apt-get upgrade | ||
| - | $ sudo apt-get install apache2 | ||
| - | $ sudo a2enmod rewrite | ||
| - | $ sudo a2enmod actions | ||
| - | $ sudo a2enmod ssl | ||
| - | $ sudo systemctl restart apache2 | ||
| - | | ||
| - | ===== Zugriffsrechte mit ACL ===== | ||
| - | Damit unterschiedliche Nutzer per SFTP Dateien hochladen können und diese für alle Beteiligten editierbar bleiben, werden die Verzeichnisrechte für den Web-Bereich mit ACL verwaltet. Für den externen Zugriff siehe [[open: | ||
| - | Mit Access Control Lists (ACL) ist es möglich, einzelnen Nutzern (oder auch Gruppen) gezielt Rechte an einzelnen Dateien zu geben oder zu entziehen. Durch die folgende Einrichtung wird der Gruppe www-data das Lese- und Schreibrecht auf das Verzeichnis /var/www/ und seiner Unterverzeichnisse gewährt. Durch die ACL erhalten das auch alle neu erstellen Dateien und Ordner. \\ | ||
| - | Die Gruppe www-data ist die Linux-Gruppe für den Apache-Server. User, die Zugriff per SFTP auf die Bereiche benötigen, müssen als User im System angelegt werden. | ||
| - | |||
| - | Gruppe www-data zum Eigentümer der Web-Verzeichnisse erklären | ||
| - | $ sudo chown www-data: | ||
| - | |||
| - | Lese und Schreib-Rechte für die Gruppe auf die aktuellen Verzeichnisse, | ||
| - | $ sudo chmod -R g+rw /var/www/ | ||
| - | |||
| - | ACL installieren | ||
| - | $ sudo apt-get install acl | ||
| - | |||
| - | Defaultvorgaben für die Gruppe www-data setzen im Verzeichnis /var/www | ||
| - | $ sudo setfacl –dm g: | ||
| - | |||
| - | -d = Default-Vorgaben (auch für Unterverzeichnisse)\\ | ||
| - | -m = Maske \\ | ||
| - | |||
| - | User in die Gruppe www-data aufnehmen | ||
| - | $ sudo usermod -aG www-data < | ||
| - | |||
| - | ===== PHP ===== | ||
| - | $ sudo apt-get install ca-certificates apt-transport-https software-properties-common -y | ||
| - | $ sudo echo "deb https:// | ||
| - | $ sudo wget -qO - https:// | ||
| - | $ sudo apt-get update -y | ||
| - | $ sudo apt-get install php8.0 | ||
| - | $ php -v | ||
| - | | ||
| - | php8.0 ggf. ersetzen mit gewünschter Version \\ | ||
| - | php -v -> Check aktuelle PHP-Version | ||
| - | | ||
| - | ===== Datenbank ===== | ||
| - | MariaDB ist ein freies, relationales Open-Source-Datenbankmanagementsystem, | ||
| - | Siehe: https:// | ||
| - | |||
| - | $ sudo apt-get install mariadb-server | ||
| - | $ sudo mysql_secure_installation | ||
| - | | ||
| - | Passwort bei Installation ist leer (Enter), alles andere mit Y bestätigen und neues PW vergeben. | ||
| - | |||
| - | ==== Datenbankverwaltung ==== | ||
| - | phpMyAdmin is a free software tool written in PHP, intended to handle the administration of MySQL over the Web.\\ | ||
| - | Siehe: https:// | ||
| - | |||
| - | $ sudo apt-get install phpmyadmin | ||
| - | $ sudo systemctl reload apache2 | ||
| - | |||
| - | Sicherheit: direkten root-Zugang über phpmyadmin sperren - ggf vorher einen anderen User zum Admin machen. \\ | ||
| - | Möglich über phpmyadmin oder wie folgt: | ||
| - | |||
| - | $ sudo nano / | ||
| - | |||
| - | Entscheidung über letzte Zeile (AllowRoot = false == gesperrt) ggf. Zeile einfügen: \\ | ||
| - | /* Configure according to dbconfig-common if enabled */ | ||
| - | if (!empty($dbname)) { | ||
| - | /* Authentication type */ | ||
| - | $cfg[' | ||
| - | $cfg[' | ||
| - | ... | ||
| - | | ||
| - | ===== Virtueller Host ===== | ||
| - | Beim Provider der Domain wird per DNS-Eintrag auf die IP-Adresse des Servers verwiesen. Die virtuellen Hosts werten bei eingehenden Anfragen den Domainnamen aus und leiten in das jeweils zugeordnete Verzeichnis. \\ | ||
| - | |||
| - | Registrierung der Domainsnamen im Verzeichnis / | ||
| - | Zur Bearbeitung die Vorgabedateien (default) kopieren und mit eigenen Einstellungen anpassen. \\ | ||
| - | Um einen guten Überblick zu halten, ist es sinnvoll, für jeden Host eine eigener Datei zu erstellen: Endung auf .conf - Gute Identifizierung besteht, wenn Dateiname dem Domainnamen entspricht. \\ | ||
| - | |||
| - | Bei namensbasierten Systemen wird für alle Port 80 (Standard) und Port 443 (SSL) angewandt. \\ | ||
| - | Alternativ ist die Unterscheidung über verschiedene Ports möglich. Die Ports müssen dann in der Datei / | ||
| - | Hier betrachtetes System ist Namensbasiert. \\ | ||
| - | |||
| - | Beim Eingang einer Anforderung muss der Domainname mitgeliefert werden (Provideraufgabe), | ||
| - | |||
| - | SSL-Beispiel: | ||
| - | $ sudo nano / | ||
| - | |||
| - | < | ||
| - | # | ||
| - | ServerName EXAMPLE.com | ||
| - | #auch die www-Adresse wird hier verarbeitet | ||
| - | ServerAlias www.EXAMPLE.com | ||
| - | #Permanente Umleitung auf die SSL-Adresse | ||
| - | RedirectPermanent / https:// | ||
| - | </ | ||
| - | < | ||
| - | < | ||
| - | # | ||
| - | ServerName EXAMPLE.com | ||
| - | #Auch die www-Adresse wird hier verarbeitet | ||
| - | ServerAlias www.EXAMPLE.com | ||
| - | # | ||
| - | #Dort sollte die index.html bzw. index.php liegen | ||
| - | #z.B. zeigt der Pfad bei Shopware auf das Unterverzeichnis public | ||
| - | DocumentRoot / | ||
| - | | ||
| - | # | ||
| - | ServerAdmin admin@EXAMPLE.com | ||
| - | #Ablageort, an dem der Server Fehler protokolliert | ||
| - | ErrorLog ${APACHE_LOG_DIR}/ | ||
| - | CustomLog ${APACHE_LOG_DIR}/ | ||
| - | #Steuert die Ausführlichkeit des Fehlerprotokolls. Debug-Level-Nachrichten = tiefstes Level (alles) | ||
| - | LogLevel debug | ||
| - | | ||
| - | # | ||
| - | SSLEngine on | ||
| - | SSLCertificateFile / | ||
| - | SSLCertificateKeyFile / | ||
| - | | ||
| - | #< | ||
| - | < | ||
| - | #Options: Erlaubt die Verwendung von Direktiven zur Steuerung spezieller Verzeichniseigenschaften | ||
| - | #Indexes: Erlaubt die Verwendung von Direktiven zur Steuerung von Verzeichnisindizes | ||
| - | # | ||
| - | Options Indexes FollowSymLinks MultiViews | ||
| - | #Wenn diese Anweisung auf All gesetzt wird, dann ist jede Direktive in den .htaccess-Dateien erlaubt, die den Kontext .htaccess besitzt. Alternative = " | ||
| - | AllowOverride All | ||
| - | Order allow, | ||
| - | allow from all | ||
| - | </ | ||
| - | </ | ||
| - | </ | ||
| - | |||
| - | Seiten beim Apache registrieren((muss als *.conf-Datei im Pfad: / | ||
| - | REGISTRIEREN: | ||
| - | $ sudo a2ensite EXAMPLE.com.conf | ||
| - | AUSTRAGEN: | ||
| - | $ sudo a2dissite EXAMPLE.com.conf | ||
| - | Einstellungen testen: | ||
| - | $ sudo apache2ctl configtest | ||
| - | Apache neu starten: | ||
| - | $ sudo systemctl reload apache2 | ||
| - | |||
| - | ===== SSL-Zertifikat ===== | ||
| - | Die Zertifikate müssen entweder extern beschafft oder über das System registriert werden (z.B mit let's encrypt) . \\ | ||
| - | Externe Zertifikate und Privat-Keys werden gespeichert (z.B. im Verzeichnis / | ||
| - | |||
| - | ==== Let's Encrypt ==== | ||
| - | Folgende Beschreibung geht davon aus, dass die Domain bei Ionos registriert ist. Für andere Provider gibt es andere Wege oder ggf. eigene Plugins - wie z.B. bei cloudflare. | ||
| - | |||
| - | * https:// | ||
| - | * https:// | ||
| - | * Quelle: https:// | ||
| - | |||
| - | Voraussetzung hier, dass die Domains bei Ionos registriert sind und der API-Zugriffsschlüssel von Ionos vorhanden ist. Der API-Zugriffsschlüssel ist eine (derzeit kostenlose) Zusatzleistung bei Ionos und muss ggf. erst aktiviert werden - ggf. telefonisch über den Support. \\ | ||
| - | |||
| - | Der Einfachheit halber nutzen wir das offizielle [[https:// | ||
| - | * Ein Ordner für die Let’s Encrypt Zertifikat Struktur muss erstellt werden. In unserem Beispiel liegt dieser unter / | ||
| - | * Ein Ordner, in dem die Skripte abliegen. In unserem Beispiel liegen diese unter / | ||
| - | * / | ||
| - | * / | ||
| - | * Einerseits muss der API Zugriff beantragt worden sein (siehe oben) und andererseits muss der < | ||
| - | * HINWEIS: Es muss ein Punkt (.) zwischen publicprefix und secret gesetzt werden! | ||
| - | * Eine Email für Expiration Benachrichtigungen und als Identifier für einen Let’s Encrypt Account muss im folgenden Codeblock (< | ||
| - | * Die Domain, für die das Zertifikat erstellt werden soll, muss im folgenden Codeblock ersetzt werden (< | ||
| - | |||
| - | $ sudo apt-get install Docker | ||
| - | $ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin | ||
| - | |||
| - | Für jede Domain, jeden virtuellen Host dieses Servers, (kann) eine eigene Datei (< | ||
| - | |||
| - | $ sudo bash ./ | ||
| - | | ||
| - | Damit das Ablaufen des Zertifiktes verhindert wird, kann dies automatisiert werden über einen Cronjob | ||
| - | |||
| - | $ sudo nano / | ||
| - | |||
| - | # / | ||
| - | 0 5 2 * * root / | ||
| - | Ausführung: | ||
| - | * Jeden 2. Tag im Monat um 5:00 Uhr | ||
| - | |||
| - | $ sudo nano / | ||
| - | |||
| - | docker run -i --rm \ | ||
| - | -v / | ||
| - | -v / | ||
| - | -e " | ||
| - | certbot/ | ||
| - | certonly \ | ||
| - | --keep-until-expiring \ | ||
| - | --preferred-challenges dns \ | ||
| - | --non-interactive \ | ||
| - | --agree-tos \ | ||
| - | -m < | ||
| - | --manual \ | ||
| - | --manual-auth-hook / | ||
| - | --manual-cleanup-hook / | ||
| - | -d < | ||
| - | |||
| - | Ersetzen: < | ||
| - | |||
| - | Über o.a. < | ||
| - | Der Inhalt kann (aktuell) ohne Anpassungen übernommen werden. \\ | ||
| - | Diese drei Dateien/ | ||
| - | |||
| - | $ sudo nano / | ||
| - | |||
| - | #!/bin/sh | ||
| - | #set -x | ||
| - | apk add curl | ||
| - | API_URL=" | ||
| - | API_KEY_HEADER=" | ||
| - | | ||
| - | # Strip only the top domain to get the zone id | ||
| - | ZONE_NAME=$(expr match " | ||
| - | # When already the TLD then use it | ||
| - | if [ -z " | ||
| - | ZONE_NAME=" | ||
| - | fi | ||
| - | | ||
| - | # Get the Ionos zone id | ||
| - | ZONE_RESPONSE=$(curl -s -X GET " | ||
| - | -H " | ||
| - | -H " | ||
| - | ZONE_ID=$(echo $ZONE_RESPONSE \ | ||
| - | | python -c " | ||
| - | | ||
| - | # Create TXT record | ||
| - | CREATE_DOMAIN=" | ||
| - | RECORD_CREATE_RESPONSE=$(curl -s -X POST " | ||
| - | -H " | ||
| - | -H " | ||
| - | --data ' | ||
| - | | ||
| - | # Save info for cleanup | ||
| - | echo $ZONE_ID > / | ||
| - | | ||
| - | # Sleep to make sure the change has time to propagate over to DNS | ||
| - | sleep 25 | ||
| - | |||
| - | $ sudo nano / | ||
| - | |||
| - | #!/bin/sh | ||
| - | #set -x | ||
| - | | ||
| - | API_URL=" | ||
| - | API_KEY_HEADER=" | ||
| - | | ||
| - | if [ -f / | ||
| - | ZONE_ID=$(cat / | ||
| - | rm -f / | ||
| - | | ||
| - | CREATE_DOMAIN=" | ||
| - | # request the created records | ||
| - | RECORD_GET_RESPONSE=$(curl -s -X GET " | ||
| - | -H " | ||
| - | -H " | ||
| - | RECORD_IDS=$(echo $RECORD_GET_RESPONSE \ | ||
| - | | python -c " | ||
| - | fi | ||
| - | | ||
| - | # Remove the challenge TXT record from the zone | ||
| - | if [ -n " | ||
| - | echo " | ||
| - | | xargs -n1 -I {} curl -s -X DELETE " | ||
| - | -H " | ||
| - | fi | ||
| - | |||
| - | ===== Backup ===== | ||
| - | ==== Auf externem Server ==== | ||
| - | **a) Die Dateien der Webseiten (Verzeichnis /var/www/) und die Datenbanken von MariaDB.** \\ | ||
| - | |||
| - | Automatisiert ausführen über Cronjob | ||
| - | |||
| - | $ sudo nano / | ||
| - | |||
| - | # / | ||
| - | 0 4 * * * root / | ||
| - | 0 3 1 * * root / | ||
| - | |||
| - | Ausführung: | ||
| - | * jeden Tag um 4:00 Uhr die Datenbank | ||
| - | * jeden 1. Tag im Monat um 3:00 Uhr die Dateien aus Verzeichnis www | ||
| - | |||
| - | Alle *.sh-Dateien müssen ausführbar sein! | ||
| - | |||
| - | $ sudo nano / | ||
| - | |||
| - | #!/bin/bash | ||
| - | #Legt bis zu 31 Sicherungen an, jeweils mit Tagesdatum. | ||
| - | #Keine Angabe von Monat oder Jahr. | ||
| - | #Bei demselben Datum wird überschrieben | ||
| - | BACKUP_DIR="/ | ||
| - | DAY=$(date +%d) | ||
| - | cd / | ||
| - | # | ||
| - | mkdir -p ${BACKUP_DIR} | ||
| - | #Komplette Datenbank in SQL-File sichern | ||
| - | mysqldump -uUSERNAME -pPASSWORT ${DATENBANK} > ${BACKUP_DIR}/ | ||
| - | exit | ||
| - | |||
| - | Ersetzen: PFAD, DATENBANK, USERNAME (-u davor), PASSWORT (-p davor). \\ | ||
| - | Hier Beispielhaft für eine Datenbank. Vorletzte Zeile " | ||
| - | |||
| - | $ sudo nano / | ||
| - | |||
| - | #!/bin/bash | ||
| - | SOURCE="/ | ||
| - | BACKUP_DIR="/ | ||
| - | cd / | ||
| - | # | ||
| - | mkdir -p ${BACKUP_DIR} | ||
| - | #Daten packen und in einer Datei sichern | ||
| - | tar -cpzf ${BACKUP_DIR}/ | ||
| - | exit | ||
| - | |||
| - | Ersetzen: PFAD | ||
| - | |||
| - | **b) Die System-Dateien (Hier eine kleine Auswahl).** \\ | ||
| - | Regelmäßig (nach Änderungen) mit root-Rechten ausführen.\\ | ||
| - | |||
| - | $ sudo bash ./ | ||
| - | |||
| - | $ sudo nano / | ||
| - | |||
| - | #!/bin/bash | ||
| - | # -a / --archiv | ||
| - | # -p / --preserve | ||
| - | # | ||
| - | # -r / -R / --recurcive | ||
| - | # -u / --update | ||
| - | # | ||
| - | # Werden (nur) einzelne Dateien kopiert, müssen die Zielverzeichnisse bereits existieren | ||
| - | cp -a -p -u -v / | ||
| - | cp -a -p -u -v / | ||
| - | cp -r -a -u -p -v / | ||
| - | cp -r -a -u -p -v / | ||
| - | exit | ||
| - | |||
| - | Ersetzen: PFAD | ||
| - | |||
| - | ==== Auf lokalen Linux-PC ==== | ||
| - | Von einem lokalen Debian-/ | ||
| - | |||
| - | Automatisiert über Cronjob | ||
| - | |||
| - | $ sudo nano / | ||
| - | |||
| - | # / | ||
| - | 0 4 * * 7 | ||
| - | Ausführung: | ||
| - | * jeden 7. Tag der Woche um 4:00 Uhr | ||
| - | |||
| - | $ sudo nano / | ||
| - | |||
| - | #!/bin/bash | ||
| - | scp -r USERNAME@IPADRESSE:/ | ||
| - | exit | ||
| - | |||
| - | Ersetzen: PFADEXTERN, PFADLOKAL, USERNAME, IPADRESSE < externer Server \\ | ||
| - | scp = Kopieren über gesicherte ssh-Verbindung \\ | ||
| - | -r = Kopieren inkl. aller Unterverzeichnisse \\ | ||
| - | |||
| - | Achtung: Es kann nur kopiert werden, wenn auch Zugriff von USERNAME auf die externen Dateien besteht. Sollen z.B. die letsencrypt-Zertifikate kopiert werden, dann müssen hierfür am externen System Zugriffsrechte vorliegen. \\ | ||
| - | |||
| - | ===== Begriffe ===== | ||
| - | ==== Linux ==== | ||
| - | [[https:// | ||
| - | [[https:// | ||
| - | [[https:// | ||
| - | [[https:// | ||
| - | [[https:// | ||
| - | |||
| - | ==== Apache Web-Server ==== | ||
| - | **a2enmod, a2dismod, a2ensite oder a2dissite** \\ | ||
| - | **a2**: apache 2 \\ | ||
| - | **en**: enable/ | ||
| - | **dis**: disable/ | ||
| - | **mod**: Modus \\ | ||
| - | **site**: Seite ((muss als *.conf-Datei im Pfad: / | ||
| - | **rewrite**: | ||
| - | Siehe https:// | ||
| - | **actions**: | ||
| - | **ssl**: SSL Verbindungen auf Apache aktivieren | ||
| - | |||
| - | ~~DISCUSSION~~ | ||
open/it_apache.1669733448.txt.gz · Zuletzt geändert: (Externe Bearbeitung)
