eigener Webserver


© Mai 2021, Letzte Änderung 19.10.24

Die klassische Abkürzung woraus ein Webserver besteht
ist LAMP (Linux, Apache, MySQL, PHP).

Übersicht

Linux

Zum betreiben eines eigenen Web-Servers wird ein Betriebssystem benötigt.
Da solche Web-Seiten schon mal gehackt werden können, sollte,
zwecks Kapselung, nicht das eigene Betriebssystem,
sondern ein  virtualisiertes  Betriebssystem verwendet werden.

Da ein Web-Server meist 24h/7 im Betrieb ist und remote erreichbar sein sollte,
sind mindestens  ssh, public-key & fail2ban  zu empfehlen.

Über DSL eine eigene Web-Seite anzubieten, würde ich nur bedingt empfehlen.
Zum einen ändert sich täglich meine IP-Adresse
→ weitere Kompensations-Maßnahmen erforderlich
und zum anderen werde ich mit vielen Hack-Versuchen konfrontiert.
Da haben professionelle Anbieter - Hoster einfach mehr Erfahrung.

Was ich aber empfehlen kann, ist lokal eine Webseite aufzubauen
und wenn dann alles wie gewünscht läuft,
können die Seiten z.B. per filezilla (siehe filezilla-project.org)
auf einen Hoster kopiert werden.
Somit habe ich zum einen einen Vorabtest und zum anderen ein Backup.

Für einen Web-Server benötigt das darunter liegende Linux
keine grafische Oberfläche. Aber manche grafischen Tools wie
Filezilla, Bluefish, Thunar, etc. möchte man vielleicht nutzen.
Daher schadet es nicht gleich ein normales Linux mit z.B. xfce zu installieren.
Da der Zugriff remote erfolgen soll, darf natürlich ssh & fail2ban nicht fehlen.

Die  Virtualisierung   habe ich bereits beschrieben.
ebenso wie ich z.B. ein   Debian via LiveCD   installiere.

Siehe auch folgende externe Verküpfungen:
debian.org   Debian ist ein völlig freies Betriebssystem!
digitalocean.com   Initial Server Setup with Debian 10 (2019)
computerwoche.de   Empfehlenswerte Linux-Distributionen für Server (2015)

Zum Anfang

Apache/Nginx

Um mindestens eine statische html-Seiten darzustellen zu können,
ist Apache nötig, welches mit wenigen Schritten installiert ist.
Alternativ zu Apache würde ich mitlerweile zu Nginx tendieren.
Siehe
yarnaudov.com   mod_php vs php-fpm Performance Benchmark
              [Surprising Results]

su                                     sudo -s   wenn su nicht mehr funktioniert
apt install apache2

/etc/init.d/apache2 restart
[ ok ] Restarting apache2 (via systemctl): apache2.service.

systemctl restart apache2              kann man alternativ verwenden 
                                       (ohne Meldung)
sudo systemctl status apache2

● apache2.service - The Apache HTTP Server
   Loaded: loaded (/lib/systemd/system/apache2.service; enab…
   Active: active (running) since Fri 2021-12-10 21:46:21 CE…
     Docs: https://httpd.apache.org/docs/2.4/
  Process: 2137 ExecStart=/usr/sbin/apachectl start (code=ex…
 Main PID: 2141 (apache2)
    Tasks: 10 (limit: 2316)
   Memory: 19.1M
   CGroup: /system.slice/apache2.service
           ├─2141 /usr/sbin/apache2 -k start
           ├─2142 /usr/sbin/apache2 -k start
           ├─2143 /usr/sbin/apache2 -k start
           ├─2144 /usr/sbin/apache2 -k start
           ├─2145 /usr/sbin/apache2 -k start
           ├─2146 /usr/sbin/apache2 -k start
           ├─2150 /usr/sbin/apache2 -k start
           ├─2151 /usr/sbin/apache2 -k start
           ├─2152 /usr/sbin/apache2 -k start
           └─2177 /usr/sbin/apache2 -k start

Dec 10 21:46:21 gj5 systemd[1]: Starting The Apache HTTP Server...
Dec 10 21:46:21 gj5 apachectl[2137]: AH00558: apache2: Could…
Dec 10 21:46:21 gj5 systemd[1]: Started The Apache HTTP Server.
lines 1-23/23 (END)

Danach befindet sich im Ordner  /var/www/html  eine
index.html  Datei mit root-Rechten,
welche man im Browser sich angucken kann.

Befindet man sich remote direkt auf dem Webserver,
kann man im lokalen Browser http://localhost/  oder  127.0.0.1  eingeben.
Genauso ist es möglich innerhalb des eigenen Netzes die Adresse des Webservers,
hier z.B.  http://gj5.fritz.box  bzw.  gj5.fritz.box  einzugeben.

apache2

Um eine eigene Webseite zu erstellen kann man im einfachsten Fall
die Datei  index.html  überschreiben
oder in der Datei eine Verknüpfung plazieren.

Hier habe ich einen neuen Ordner  super08 , zugreifbar vom Benutzer  m ,
für meine Web-Seite erstellt und eine Verknüpfung darauf angelegt .

su
 cd /var/www/html
 mkdir super08
 chown m:m super08
 chown m:m index.html
exit

nano index.html
…
  <body>
    <div class="main_page">
      <div class="page_header floating_element">
        <img src="/icons/openlogo-75.png" alt="Debian Lo…
        <span class="floating_element">
          Apache2 Debian Default Page
        </span>
      </div>

<p><a href="./super08/index.html" target="_top" >2021-08</a></p>

Man sieht, dass der Einsprungsort meiner Webseite hier ebenfalls  index.html ist.
Das muß aber nicht immer so sein.
Noch besser ist es, alles unterhalb des Ordners www
der Gruppe www-data zuzuordnen.
Siehe auch askubuntu.com  Permissions problems with /var/www/html…

su
chgrp -R www-data /var/www/html
find /var/www/html -type d -exec chmod g+rx {} +
find /var/www/html -type f -exec chmod g+r {} +

Bei einem CMS wird der ausführbare Code meist via  index.php  gestartet.

Falls erforderlich kann man den Webserver über  /etc/apache2/apache2.conf  anpassen.

Nach dem Anpassen sollte man überprüfen ob noch alles gültig ist.
Ist das der Fall, muß Apache neu geladen werden,
damit die Änderungen wirksam werden.

sudo apache2ctl configtest
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, 
using 127.0.1.1. Set the 'ServerName' directive globally to suppress this message
Syntax OK
ls /etc/apache2/sites-available/
000-default.conf  default-ssl.conf
nano ...
ServerName your_domain
ServerAlias www.your_domain
sudo systemctl reload apache2

Mit Editoren wie Nano oder mousepad kann man Webseiten erstellen.
Das würde ich aber nicht empfehlen. Stattdessen verwende ich z.B. bluefish.

Siehe auch:
apache.org   The Apache software foundation
digitalocean.com   So sichern Sie Apache mit Let's Encrypt unter Ubuntu 20.04
webhosterwissen.de   Tutorial: Apache Domains & Virtual Hosts anlegen

Zum Anfang

PHP

Wem das direkte schreiben in  Html  zu mühsam ist,
wird wahrscheinlich ein sog. content management system - CMS installieren wollen.
Dies ermöglicht zwar eine einfachere Eingabe von Inhalten,
bedarf aber der Pflege (Updates einspielen, Plug-Ins auf Funktion überprüfen, etc.)

Ich selber habe ein paar Jahre  websitebaker.org  verwendet,
welches ich über einen VHS-Kurs kennen gelernt habe.
Dann gab es innerhalb der Websitebaker-Gemeinde Streit
und das CMS wurde längere Zeit nicht mehr gepflegt.
Und mein Web-Hoster ist wegen Sicherheitsproblemen auf eine höhere PHP-Version gegangen,
welche von meiner Websitebaker-Version noch nicht unterstützt wurde.
Nachdem ein Websitebaker-Update zur Verfügung stand,
hoffte ich, meine Seite  tanzfreudig.de  wieder zum Leben zu erwecken.
Aber das Update schlug fehl - Seitdem ruht die Seite.
Nun muß das nicht immer so passieren, kann aber.

Zumindest wird für viele CMS ein PHP-Hypertext-Preprocessor benötigt,
welcher sich wie folgt installieren läßt.

su
apt install php libapache2-mod-php php-intl

Die Zeitzone muß in der PHP-Konfiguration ≥ PHP 5.3 angepasst werden.

su
cd /etc/php/7.3/apache2                Der Pfad kann variieren

nano php.ini                           mit Ctrl-W   "date.timezone ="  suchen

;date.timezone =                       folgende Zeile ergänzen (ohne ;)
date.timezone = Europe/Berlin

systemctl restart apache2              ein Neustart schadet nicht

Zum Test habe ich einen Einzeiler erstellt,
deren Ergebnis ich mir im Browser angucken kann.

su
cd /var/www/html
nano info.php

<?php phpinfo(); ?>

Die Adresse für das Testergebnis lautet bei mir  gj5.fritz.box/info.php

php

Möchten man php auf der Webseite ausführbar machen,
ist eine Änderung der Dateiendung von .html zu .php nötig.
Im Gegensatz zu Javascript, läuft PHP auf dem Web-Server und
erzeugt dann eine dynamische html-Seite, welche der Klient in seinem Browser sieht.
Wenn ich also im Browser mit Ctrl-Shift-I mir den Code angucke, steht dort Text,
statt der PHP-Code, welcher den Text erzeugt.

Siehe auch:
php.net   PHP is a popular general-purpose scripting language that is especially suited to web development.
php.net   sys_getloadavg — Ermittelt die durchschnittliche Systemlast
educba.com   PHP Commands

Zum Anfang

MySQL- oder Maria-Datenbank

So richtig interessant wird PHP erst,
wenn ich es mit einer My-SQL (Structured Query Language) Datenbank verbinde.
Hierfür sind noch ein paar Kleinigkeiten zu installieren.

Ich habe mich hier statt für MySQL von Oracle,
für die Alternative  mariadb  entschieden.

su
sudo apt install mysql-server          → E: Package 'mysql-server' has no installation candidate
sudo apt install default-mysql-server  Name bei DEB 10 

apt install mariadb-server             alternative Datenbank
…
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
   LANGUAGE = (unset),
   LC_ALL = (unset),                   dabei gibt es noch Schwierigkeiten
   LANG = "en_GB.UTF-8"
…

Entsprechend ist der Service noch nicht betriebsbereit.

su
service mysql status                   Test

systemctl status mysql                 Alternative

● mariadb.service - MariaDB 10.3.31 database server
   Loaded: loaded (/lib/systemd/system/mariadb.service; enabled; vendor preset: enabled)
   Active: inactive (dead)  
     Docs: man:mysqld(8)
           https://mariadb.com/kb/en/library/systemd/

Also muß ich erst einmal die  Spracheinstellungen  richtig setzen und die My-SQL Datenbank neu starten.
Die erneute Überprüfung sollte nun nicht mehr fehl schlagen.

sudo systemctl restart mysql
sudo systemctl status mysql

Zu den Datenbank-Server wird noch ein Client benötigt.

su
apt install default-mysql-client       für Orcale

apt install mariadb-client             für die Alternative

Datenbank absichern

Mit einen einfachen Befehl kann man die SQL-Datenbank weiter absichern.
Hier wird z.B.

Bei mariadb ist der Dialog etwas ausführlicher.

su
mysql_secure_installation
…
If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,

Enter current password for root (enter for none):  ↵

Remove anonymous users? [Y/n]          y

Disallow root login remotely? [Y/n]    y

Remove test database and access to it? [Y/n] y

Reload privilege tables now? [Y/n]     y

systemctl restart apache2              ein Neustart schadet nicht

Ein Test der MySQL-Datenbank kann wie folgt passieren.
Wobei erst das sudo-Passwort und dann das root-Passwort vom SQL-Server einzugeben ist.

sudo  mysqladmin -u root -p version

mysqladmin  Ver 9.1 Distrib 10.3.31-MariaDB, for debian-linux-gnu on x86_64
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Server version		10.3.31-MariaDB-0+deb10u1
Protocol version	10
Connection		Localhost via UNIX socket
UNIX socket		/var/run/mysqld/mysqld.sock
Uptime:			3 hours 53 min 1 sec

Threads: 6  Questions: 486  Slow queries: 0  Opens: 175  Flush tables: 1  Open tables: 31  
Queries per second avg: 0.034

Wie es aussieht, läuft alles nach Plan.
Damit ein potentielles CMS die Datenbank benutzen kann,
ist sie noch für einen bestimmten Benutzer anzulegen.
In diesen Beispiel definiere ich den Benutzer m_db für nextcloud.
Statt password ist natürlich etwas komplizierteres einzugeben.

su
mysql                                  für DEB 12
CREATE USER 'm_db'@'localhost' IDENTIFIED BY 'password';
Query OK, 0 row affected (0,045 sec)
CREATE DATABASE nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Query OK, 1 row affected (0,096 sec)
GRANT ALL PRIVILEGES ON nextcloud.* TO 'm_db'@'localhost';
Query OK, 0 row affected (0,023 sec)
FLUSH PRIVILEGES;
Query OK, 0 row affected (0,004 sec)
quit
Bye

Zum Anfang

phpMyAdmin

Um die MySQL-Datenbank verwalten zu können, ist noch sinnvoll folgendes zu installieren.

sudo apt install phpmyadmin            → E: Package 'phpmyadmin' has no installation candidate

Eine weitere Möglichkeit ist sich den Tar-Ball runter zu laden
und z.B. im Ordner /var/www/html/extraGeheimerOrdner/ zu entpacken.

Zum Anfang

Zertifikat für https

Um eine HTTPS-Seite zu betreiben, ist es nötig, vergleichbar mit SSH oder PGP,
ein Schlüsselpaar zu erzeugen. Der private Schlüssel wird dann vom Webserver verwendet
und der öffentliche Schlüssel wird an einer öffentlich zugänglichen Stelle platziert.
Zusätzlich zu den Schlüssel werden weitere Informationen in einen Zertifikat zusammen gefasst.
Eine kostenfreie Zertifizierungsstelle - CA ist beispielsweise   letsencrypt.org
In meinen Fall habe ich SSH-Zugriff auf meinen Webserver.
Daher bietet es sich an, fertige Software zum Erzeugen der Zertifikate zu verwenden.
z.B. certbot von der US-Seite  certbot.eff.org.
Certbot benötigt Informationen wie:

Die Debian-Version habe ich mir via folgenden Befehl anzeigen lassen.

cat /etc/debian_version
10.13	

Diese Informationen trage ich auf der oben genannten certbot-Webseite ein.
Abweichend von der Anleitung installiere ich nicht Ubuntu's  snap.

sudo apt install certbot

Entsprechend brauche ich auch keinen Link /usr/bin/certbot erzeugen,
sondern kann gleich loslegen.

sudo certbot --apache
[sudo] password for m: 
Saving debug log to /var/log/letsencrypt/letsencrypt.log
The requested apache plugin does not appear to be installed

Leider gab es bei mir eine Fehlermeldung, welche ich mit folgender Installation beheben konnte.

sudo apt-get install python-certbot-apache

Nach erneuten Aufruf komme ich schon ein Stück weiter.

sudo certbot --apache
Saving debug log to /var/log/letsencrypt/letsencrypt.log  
Plugins selected: Authenticator apache, Installer apache
Enter email address (used for urgent renewal and security notices)
(Enter 'c' to cancel): …@supercalifragilis.de
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at https://letsencrypt.org/documents/LE-SA-v1.3-September-21-2022.pdf.
You must agree in order to register with the ACME server at https://acme-v02.api.letsencrypt.org/directory
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(A)gree/(C)ancel: A
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing to share your email address with the Electronic Frontier Foundation,
a founding partner of the Let's Encrypt project and the non-profit organization that develops Certbot?
We'd like to send you email about our work encrypting the web, EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: Y
No names were found in your configuration files. Please enter in your domain name(s) (comma and/or space separated)
(Enter 'c' to cancel): supercalifragilis.de
Obtaining a new certificate Performing the following challenges: http-01 challenge for supercalifragilis.de
Enabled Apache rewrite module Waiting for verification...
Cleaning up challenges Failed authorization procedure. supercalifragilis.de (http-01):
urn:ietf:params:acme:error:unauthorized :: The client lacks sufficient authorization :: 2a03:4000:61:16d8::17:2730:
Invalid response from http://supercalifragilis.de/.well-known/acme-challenge/-OhpOd-Lfo_oshVTBdu-ETaXJerQsgQTK9yyLtsWnwE: 404

IMPORTANT NOTES:
- The following errors were reported by the server:
Domain: supercalifragilis.de
Type: unauthorized
Detail: 2a03:4000:61:16d8::17:2730: Invalid response from http://supercalifragilis.de/.well-known/acme-challenge/-OhpOd-Lfo_oshVTBdu-ETaXJerQsgQTK9yyLtsWnwE: <404>
To fix these errors, please make sure that your domain name was entered correctly and the DNS A/AAAA record(s) for that domain contain(s) the right IP address.
- Your account credentials have been saved in your Certbot configuration directory at /etc/letsencrypt.
You should make a secure backup of this folder now.
This configuration directory will also contain certificates and private keys obtained by Certbot so making regular backups of this folder is ideal.
 

Leider funktioniert es nicht mit einer lokalen Webseite auf diese Art und Weise.
Und ich finde es schwach, das Europa da keine Alternative anzubieten hat.

Zertifikate wurden auch nicht erstellt, bzw. der Ordner /var/log/letsencrypt/.certbot.lock existiert garnicht.

sudo certbot certificates
Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
No certs found.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

sudo ls -la /var/log/letsencrypt/
total 32
drwx------  2 root root  4096 Nov 12 21:43 .
drwxr-xr-x 11 root root  4096 Nov 12 00:00 ..
-rw-r--r--  1 root root 23936 Nov 12 21:43 letsencrypt.log

Quellen

howtoforge.de   Wie man Let’s Encrypt SSL/TLS-Zertifikate mit Certbot erstellt und verwaltet
veuhoff.net   Raspberry Pi: Lets Encrypt SSL Zertifikat mit Certbot installieren
ubuntuusers.de   certbot
bogomolov.tech   How to get HTTPS working on localhost

Zum Anfang

Administration

Wie anfangs beschrieben, wird mit Installation von Apache ein Ordner
/var/www/html angelegt. Um den Zugriff zu erleichtern,
habe ich mir in meinen Benutzer-Ordner eine Verknüpfung gelegt
via ln -s /var/www/html/ html.
Innerhalb des html-Ordners (mit Root-Rechten), befinden sich die Ordner
mit den verschiedenen Versionen der selben Webseite. z.B. s06, s07

Jedes Mal wenn ich per filezilla den Ordner mit der letzten Version,
hier s07, zu netcup übertragen habe, lösche ich die vorherige Version, hier s06
und erstelle mir aus der aktuellesten Version eine Arbeitskopie → s08.

sudo rm -rf s06
sudo cp -r s07 s08
sudo chown -Rc m:m s08    ist erforderlich, weil ich nicht cp -a verwendet habe
sudo nano index.html

Danach editiere ich die index.html und ergänze eine Verknüpfung
auf die neue Arbeitskopie s08.

Zum Anfang

Quellen

textbroker.de   Content-Management-System
websitebaker.org   WebsiteBaker Open Source Content Management
technikaffe.de   Einen Linux Webserver installieren
pcwelt.de   Apache-Webserver auf Linux installieren - so geht's (2018)
codeflow.site   So installieren Sie den Apache-Webserver unter Debian 10
jolichter.de   Debian Webserver einrichten (2009)
itler.net   Unter Debian eine Webserver-Umgebung installieren
otremba.net   Webserver installieren (Debian 8 ca. 2018)
debianforum.de   Webserver mit Apache PHP und MySQL (Debian 7 < 2018)
https://kifarunix.com/install-lamp-stack-with-mariadb-10-on-debian-10-buster/
https://www.linuxandubuntu.com/home/10-steps-to-secure-linux-server
https://wiki.ubuntuusers.de/ssl-cert/
https://bogomolov.tech/localhost-https/ https://seo-summary.de/website-auf-https-ssl-umstellen/

Zum Anfang