Apache httpd, "der" WEB-Server - Installation unter Arch Linux

Bild: Apache httpd Logo Apache HTTP Server Project kann mit Fug und Recht von sich behaupten, der führende HTTP-Server im Internet. Im April 1995 startete das Projekt der pache-HTTP-Server („httpd“) und wird in diesem Jahr 2026 seinen 30 Geburtstag feiern! Das Ziel dieses Projekts ist es, einen sicheren, effizienten und erweiterbaren Server bereitzustellen, der HTTP-Dienste zeitgemäß den aktuellen HTTP-Standards bietet. Der freie und quelloffene Webserver wird von der Apache Software Foundation zur Verfügung gestellt, gepflegt und dort auch weiterentwickelt.

In der Apache HTTP Server Documentation findet man eine ausführliche Dokumentation des Projekts, sowie im Apache HTTP Server Wiki viele hilfreiche Tips und Anregungen für die Installation und den Betrieb des HTTP-Webservers.

httpd Manpage

Was uns der httpd - Apache Hypertext Transfer Protocol Server bietet und welche Optionen beim Aufruf der Daemon bietet offenbart uns die betreffende Man-Page des Programms.

 # man httpd

httpd manpage

apachectl Manpage

Mit Hilfe des Befehls apachectl, dem Apache HTTP Server Control Interface können wir unseren HTTP-Daemon administrieren oder auch die Konfigurations auf syntaktische Fehler überprfüfen.

 # man apachectl

apachectl manpage

htpasswd Manpage

Mit Hilfe des Befehls passwd können wir eine einfache Datei mit unsername und password erstellen und somit einen einfachen Zugriffsschutz realisieren.

 # man htpasswd

htpasswd manpage

htdigest Manpage

Mit Hilfe des Befehls htdigest können wir eine einfache Datei mit unsername und password erstellen und somit einen einfachen Zugriffsschutz realisieren.

 # man htdigest

htpasswd manpage

Die Installation und Konfiguration HTTP-Servers apache gestaltet sich relativ einfach. Zur Installation des Paketes verwenden wir unter Arch Linux den Paketmanager pacman.

  1. Als User:
     $ sudo pacman -S apache
  2. Als Nutzer mit Root-Rechten entsprechend:
     # pacman -S apache

Neben dem Grundpaket werden noch als Abhängigkeit die beiden Pakete apr und apr-utilinstalliert.

Ausgabe des Befehls pacman -S apache

Was uns das Paket apache alles in das System unseres Arch Linux Server gebracht hat, können wir wie folgt abfragen:

 # pacman -Qil apache

Paketinhalte

Bei Bedarf können wir auch abfragen was die beiden Pakete rund um die The Apache Portable Runtime aprt oder die anderen Anbängigkeiten, die mit installiert wurden, mitbringen:

 # pacman -Qi <-paketname->

bzw.

 # pacman -Qil <-paketname->

Firewall/Paketfilter - firewalld

Bevor wir nun unseren httpd konfigurieren und starten müssen wir natürlich sicherstellen, dass auf dem betreffendem Host auch die Kommunikationsbeziehungen entsprechend erlaubt sind.

Wie auch schon früher bei CentOS ab Release 7 bzw. den nachfolgenden Release-Kandidaten Stream von RHEL nutzen wir auch unter Arch Linux den dynamischen firewalld Service. Ein grosser Vorteil der dynamischen Paketfilterregeln ist unter anderem, dass zur Aktivierung der neuen Firewall-Regel(n) nicht der Daemon durchgestartet werden muss und somit alle aktiven Verbindungen kurz getrennt werden. Sondern unsere Änderungen können on-the-fly aktiviert oder auch wieder deaktiviert werden.

Damit unsere http-Daemon Anfragen aus dem Netz auf den Ports 80/TCP- und 443/TCP-Ports annahmen kann, müssen wir für diese noch Änderungen am Paketfilter firewalld vornehmen. Zunächst installieren wir uns das betreffende firewalld-Paket.

 # pacman -S firewalld

bzw. als Admin-User:

 $ sudo pacman -S apache

Anschließend starten wir den Firewall-Daemon.

 # systemctl start firewalld.service 

Damit der Firewall-Daemon beim Neustart des Systems automatisch gestartet wird, enablen wir diesen nun auch noch.

 # systemctl enable firewalld.service

Mit Hilfe des Programms firewall-cmd konfigurieren wir nun den Daemon:

  1. Logging aktivieren:
     # firewall-cmd --set-log-denied=all
  2. Firewall-Zone anlegen:
     # firewall-cmd --permanent --new-zone=idmz
     # firewall-cmd --reload
  3. Netzwerkinterfaces der Zonen zuordnen:
     # firewall-cmd --permanent --zone=idmz --add-interface=net0
     # firewall-cmd --reload
  4. Firewalld Default Zone setzen:
     # firewall-cmd --set-default-zone idmz
  5. SSH, HTTP und HTTPS für die Zone idmz aktivieren:
     # firewall-cmd --permanent --zone=idmz --add-service=ssh
     # firewall-cmd --permanent --zone=idmz --add-service=http
     # firewall-cmd --permanent --zone=idmz --add-service=https
  6. Regelwerk persistieren:
     # firewall-cmd --reload
  7. Ergebniskontrolle:
     # firewall-cmd --zone=idmz --list-all
    idmz (default, active)
      target: default
      ingress-priority: 0
      egress-priority: 0
      icmp-block-inversion: no
      interfaces: net0
      sources: 
      services: http https ssh
      ports: 
      protocols: 
      forward: no
      masquerade: no
      forward-ports: 
      source-ports: 
      icmp-blocks: 
      rich rules:

httpd-Konfigurationsverzeichnis und -Dateien

Die Konfiguration des Apache-Webservers httpd erfolgt nicht mit Hilfe einer großen Konfigurationsdatei, sondern ist aufgeteilt in kleinere spezielle Konfigurationsdateien, jeweils auf die einzelnen Anwendungsfälle abgestimmt.

Im Verzeichnis /etc/httpd finden wir all diese Dateien.

/etc/httpd//
├── conf/
│   ├── conf.d/
│   ├── extra/
│   │   ├── httpd-autoindex.conf
│   │   ├── httpd-dav.conf
│   │   ├── httpd-default.conf
│   │   ├── httpd-info.conf
│   │   ├── httpd-languages.conf
│   │   ├── httpd-manual.conf
│   │   ├── httpd-mpm.conf
│   │   ├── httpd-multilang-errordoc.conf
│   │   ├── httpd-ssl.conf
│   │   ├── httpd-userdir.conf
│   │   ├── httpd-vhosts.conf
│   │   └── proxy-html.conf
│   ├── httpd.conf
│   ├── magic
│   └── mime.types
└── modules -> /usr/lib/httpd/modules/

5 directories, 15 files

Auf die einzelnen Dateien und deren Konfiguration werden wird gleich im Detail noch eingehen.

erster manueller Start

 # systemctl start httpd.service

Im Journal wird der Start unseres HTTP-Servers entsprechend vermerkt.

 # journalctl -fu httpd
Feb 07 11:11:23 vml000081 systemd[1]: Starting The Apache HTTP Server...
Feb 07 11:11:24 vml000081 systemd[1]: Started The Apache HTTP Server.

Ebenso kann man den Status des Webservers mit Hilfe des Befehls systemctl abfragen.

 # systemctl status httpd.service

 httpd.service - The Apache HTTP Server
     Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; preset: disabled)
    Drop-In: /etc/systemd/system/httpd.service.d
             └─hardening.conf
     Active:active (running) since Sat 2026-02-07 11:11:24 CET; 29s ago
 Invocation: e2b00d33888b4da1879525a5a25964b4
       Docs: https://httpd.apache.org/docs/2.4/
   Main PID: 5719 (httpd)
     Status: "Total requests: 0; Idle/Busy workers 100/0;Requests/sec: 0; Bytes served/sec:   0 B/sec"
      Tasks: 82 (limit: 9498)
     Memory: 6.1M (peak: 6.8M)
        CPU: 85ms
     CGroup: /system.slice/httpd.service
             ├─5719 /usr/bin/httpd -D FOREGROUND -k start
             ├─5723 /usr/bin/httpd -D FOREGROUND -k start
             ├─5724 /usr/bin/httpd -D FOREGROUND -k start
             └─5725 /usr/bin/httpd -D FOREGROUND -k start

Feb 07 11:11:23 vml000081 systemd[1]: Starting The Apache HTTP Server...
Feb 07 11:11:24 vml000081 systemd[1]: Started The Apache HTTP Server.

Alternativ dazu können wir auch einen Blick in die Prozess-Liste werfen um uns zu vergewissern ob der Daemon läuft.

 # ps auxwf | grep httpd

root        5878  0.0  0.0   8056  6284 pts/0    S+   11:28   0:00  |   |                   \_ grep --color=auto httpd
root        5675  0.0  0.1  35612 11864 pts/1    S+   11:03   0:00  |                       \_ journalctl -fu httpd
root        5719  0.0  0.0  10004  7152 ?        Ss   11:11   0:00  \_ /usr/bin/httpd -D FOREGROUND -k start
http        5723  0.0  0.0 296832  4652 ?        Sl   11:11   0:00      \_ /usr/bin/httpd -D FOREGROUND -k start
http        5724  0.0  0.0 296832  4648 ?        Sl   11:11   0:00      \_ /usr/bin/httpd -D FOREGROUND -k start
http        5725  0.0  0.0 296832  4652 ?        Sl   11:11   0:00      \_ /usr/bin/httpd -D FOREGROUND -k start

Wir können jetzt auch schon mit Hilfe des Utility ss abfragen ob der httpd nun Ports auf zugehörigen Addressen geöffnet hat.

 # ss -tulpn

Ausgabe des Befehls ss -tulpn

Ferner kann auch noch mit Hilfe der Logdatei /var/log/httpd/error_log überprüft werden, ob der erste Start erfolgreich var.

 # less /var/log/httpd/error_log

Ausgabe des Befehls less /var/log/httpd/error_log

Systemtest / Testseite

Einen ersten Test mit einem Browser, können wir auch schon wagen, rufen wir hierzu einfach die IPv4-Adresse im Browser auf. Bild: Bildschirmhardcopy des Browser beim Aufruf der IPv4-Adresse

Im access_log wird dieser Zugriff entsprechend dokumentiert.

 # less /var/log/httpd/access_log

Ausgabe des Befehls less /var/log/httpd/access_log

Im Abschnitt httpd-Konfigurationsverzeichnis und -Dateien hatten wir bereits einen Blick in das Konfigurationsverzeichnis /etc/httpd geworfen. In folgendem Kapitel wollen wir nun auf die einzelnen Unterverzeichnisse und Dateien eingehen und unseren Bedürfnissen entsprechend anpassen.

/etc/httpd//
├── conf/
│   ├── conf.d/
│   ├── extra/
│   │   ├── httpd-autoindex.conf
│   │   ├── httpd-dav.conf
│   │   ├── httpd-default.conf
│   │   ├── httpd-info.conf
│   │   ├── httpd-languages.conf
│   │   ├── httpd-manual.conf
│   │   ├── httpd-mpm.conf
│   │   ├── httpd-multilang-errordoc.conf
│   │   ├── httpd-ssl.conf
│   │   ├── httpd-userdir.conf
│   │   ├── httpd-vhosts.conf
│   │   └── proxy-html.conf
│   ├── httpd.conf
│   ├── magic
│   └── mime.types
└── modules -> /usr/lib/httpd/modules/
  • /etc/httpd/conf :
    Konfigurationsverzeichnis mit den wesentlichen Konfigurationsdateien httpd.conf, magic und mime.types, sowie den beiden Unterverzeichnissen conf und modules.
  • /etc/httpd/conf/httpd.conf :
    Dies ist die Hauptkonfigurationsdatei des Apache-HTTP-Daemon. Sie enthält die Konfigurationsanweisungen, die dem Server seine Anweisungen geben. Detaillierte Informationen über den Aufbau und den Directiven finden sich in der zugehörigen Dokumentation.
  • /etc/httpd/conf/magic :
    Dieses Modul bestimmt den MIME-Typ von Dateien auf die gleiche Weise wie der Unix-Befehl file. Es untersucht die ersten Bytes der Datei. Dieses Modul ist nur aktiv, sofern diese durch die Directive MimeMagicFile angegeben ist.
  • /etc/httpd/conf/mime.types :
    Datei für die Zuordnung von Internet-Medientypen zu eindeutigen Dateierweiterungen. Obwohl sie für httpd erstellt wurde, wird diese Datei von vielen Softwaresystemen verwendet und wurde zur uneingeschränkten Weiterverbreitung in die Public Domain gestellt. Internet-Medientypen sollten gemäß RFC 4288 registriert werden.
  • /etc/httpd/conf/extra/ :
    Verzeichnis für gruppierte Themenbezogene Konfigurationsoptionen.
  • /etc/httpd/conf/extra/httpd-autoindex.conf :
    Direktive zur Steuerung der Anzeige von serverseitig generierten Verzeichnislisten.
  • /etc/httpd/conf/extra/httpd-dav.conf :
    Einstellungen zum verteilten Authoring und Versionierung (WebDAV)
  • /etc/httpd/conf/extra/httpd-default.conf :
    Diese Konfigurationsdatei enthält die Standardeinstellungen für den Apache HTTP Server.
  • /etc/httpd/conf/extra/httpd-info.conf :
    Einstellungen zu Status-Rückmeldungen und -Informationen des Servers, abrufbar unter speziellen URL-Ergänzungen /server-status sowie /server-info.
  • /etc/httpd/conf/extra/httpd-languages.conf :
    Konfigurationsoptionen für das Hosting verschiedener Sprachen.
  • /etc/httpd/conf/extra/httpd-manual.conf :
    Definitionen zur Einbindung der Apache HTTP Server-Dokumentation, welche bei entsprechender Konfiguration unter der URL-Ergänzung /manual erreicht werden kann.
  • /etc/httpd/conf/extra/httpd-mpm.conf :
    Konfiguratione für das Server-Pool Management.
  • /etc/httpd/conf/extra/httpd-multilang-errordoc.conf :
    Die folgende Konfiguration implementiert mehrsprachige Fehlerdokumente mit Hilfe der content-negotiation.
  • /etc/httpd/conf/extra/httpd-ssl.conf :
    Dies ist die Apache-Serverkonfigurationsdatei, die SSL-Unterstützung bietet. Sie enthält die Konfigurationsanweisungen, die dem Server mitteilen, wie Seiten über eine verschlüsselte HTTPS-Verbindung bereitgestellt werden sollen. Ausführliche Informationen zu den einzelnen Anweisungen finden Sie unter in der zugehörigen Dokumentationsseite.
  • /etc/httpd/conf/extra/httpd-userdir.conf :
    Konfigurationsdatei für Einstellungen von benutzerdefinierter Web-Seiten.
  • /etc/httpd/conf/extra/httpd-vhosts.conf :
    Definitionen zu virtual Hosts für das Hosting mehrere Domains/Hostnamen (VirtualHost-Container) auf einem Server.
  • /etc/httpd/conf/extra/proxy-html.conf :
    Konfigurationsdatei mit den Einstellungen für das Apache HTTP Server-Modul mod_proxy_html.

Wichtig:
Die folgenden Konfigurationsdateien sind standardmäßig bereits inkludiert und die darin enthaltenen Definitionen werden beim Start und Betrieb des HTTPD verwendet:

  • /etc/httpd/conf
  • /etc/httpd/conf/mime.types
  • /etc/httpd/conf/extra/httpd-autoindex.conf
  • /etc/httpd/conf/extra/httpd-default.conf
  • /etc/httpd/conf/extra/httpd-languages.conf
  • /etc/httpd/conf/extra/httpd-mpm.conf
  • /etc/httpd/conf/extra/httpd-multilang-errordoc.conf
  • /etc/httpd/conf/extra/proxy-html.conf

Basis-Konfiguration des HTTP-Daemon - httpd.conf

Die Konfiguration des Daemon erfolgt über die Datei /etc/httpd/conf/httpd.conf die uns bei der Paketinstallation mitgeliefert wurde. Damit wir Änderungen, die beim Updaten des installierten Paketes ggf. neu hinzukommen oder wegfallen, besser von der Originaldatei unterscheiden können kopieren wir uns als erstes diese Datei.

 # cp -av /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.orig

Die Hupt-Konfigurationsdatei des Apache Web Servers ist außerordentlich gut dokumentiert. Werfen wir einen kurzen Blick mal in diese Konfigurationsdatei.

 # bat /etc/httpd/conf/httpd.conf

Ausgabe des Befehlsaufrufes bat /etc/httpd/conf/httpd.conf

Wir werden nun die relavanten Einträge von Oben nach unten in der Konfigurationsdatei Schritt für Schritt unseren Bedürnissen nach anpassen. Dazu öffnen wir die Datei mit dem Editor unserer Wahl. Wie immer dokumentieren wir entsprechende Änderungen mit einem Kommentar in der Form Adminname : Datum sowie der Angabe der Defaultkonfigurationsoption so dass für andere Admins besser ersichtlich ist, wer nun eine Option geändert hat und wann dies erfolgte.

 # vim /etc/httpd/conf/httpd.conf

Im ersten Schritt beschränken wir uns erst einmal auf wenige Konfigurationsparameter, die wir unserer Umgebung nach entsprechend anpassen:

  • ServerAdmin : Hier definieren wir die eMail-Adresse des Administrator des Apache HTTP Daemons für automatisch generierte Fehlermeldungensseiten. Wenn der Apache HTTP Server bei der Beantwortung von Client-Anfragen auf Probleme stösst, wird eine angepasste Fehlermeldungsseite erzeugt, die ggf. einen link mit der eMail-Adresse des Apache HTTP Server-Administrators enthält.
    #  
    # ServerAdmin: Your address, where problems with the server should be
    # e-mailed.  This address appears on some server-generated pages, such
    # as error documents.  e.g. admin@your-domain.com
    #  
    # Django : 2026-02-07                                                                         
    # default: ServerAdmin you@example.com
    ServerAdmin webmaster@nausch.org
  • ServerName : ServerName gibt den Namen und den Port an, mit denen sich der Server identifiziert. Um Probleme beim Start zu vermeiden, ist es ratsam den Hostnamen und den verwendeten Port hier explizit anzugeben!
    #                                        
    # ServerName gives the name and port that the server uses to identify itself.
    # This can often be determined automatically, but we recommend you specify
    # it explicitly to prevent problems during startup.
    #                                        
    # If your host doesn't have a registered DNS name, enter its IP address here.
    #                                        
    # Django : 2026-02-07                    
    # default: #ServerName www.example.com:80
    ServerName vml000081.idmz.nausch.org:80
  • httpd-userdir.conf : Da wir keine Unterstützung der $Home-Verzeichnisse des bzw. der Admin-Nutzer benötigen, deaktivieren wir diese Option in dem wir sie auskommentieren.
    # User home directories
    # Django : 2026-02-07                                                                         
    # default: Include conf/extra/httpd-userdir.conf
  • Options im definierten <Directory „/srv/http“> : Konfigurationsoptionn mit der festgelegt wird, welche Eigenschaften bzw. Funktionen in einem bestimmten Verzeichnis verfügbar sind. Mögliche Werte für die Options-Direktive sind none, all oder eine beliebige Kombination aus: Indexes, Includes, FollowSymLinks, SymLinksifOwnerMatch, ExecCGI sowie MultiViews. Weitere Informationen zur Options -Directive findet man in der zugehörigen Dokumentation.

Somit haben wir nun alle für unseren Einsatz relevanten Optionen gesetzt. Eine Zusammenfassung aller Optionen ohne die Kommentare können wir mit Hilfe eines grep Befehls mit den Optionen -Ev uns ausgeben lassen.

# grep -Ev '(^#|^.*#|^$)' /etc/httpd/conf/httpd.conf

Ausgabe des vorgenannten "grep"-Befehlsaufrufs der Datei /etc/httpd/conf/httpd.conf

erste Webserver-Startseite

In dem vorgenannten Konfigurationsbeispiel hatten wir definiert, dass unser DocumentRoot das Verzeichnis /srv/http den DirectoryIndex index.html (aus der Default-Paketinstallation) einschließt. Was wir nun noch brauchen ist diese Startseite index.html, welche wir nun noch anlegen.

 # vim /srv/http/index.html
/srv/http/index.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
  <head>
    <title>Apache httpd, "der" WEB-Server - Installation unter Arch Linux</title>
  </head>
  <body>
    <p>Unserer erste <b>html</b>-Testseite!<br>
    <br>  Weiter Informationen zum Apache-Webserver unter Arch-Linux finden wir im <a href="https://dokuwiki.nausch.org/doku.php/linux:webserver:start">Djangos Dokuwiki</a> ;)
    </p>
  </body>
</html>

Nun ist es an der Zeit, unseren Webserver von der Konfigurationsanpassung in Kenntnis zu setzen. Bevor wir dies aber tun, überprüfen wir noch, ob die Konfigurationsdateien unseres web-Servers noch irgendwelche syntaktischen Fehler haben. Hierzu benutzen wir folgenden Aufruf.

 # apachectl -t
 Syntax OK

Da kein Syntax-Fehler gefunden wurde, führen wir einen Reload unseres Apache-WEB-Servers durch.

 # systemctl reload httpd.service

Im Journal wird uns der Neustart entsprechend dokumentiert.

Feb 07 17:10:29 vml000081 systemd[1]: Stopping The Apache HTTP Server...
Feb 07 17:10:29 vml000081 systemd[1]: httpd.service: Deactivated successfully.
Feb 07 17:10:29 vml000081 systemd[1]: Stopped The Apache HTTP Server.
Feb 07 17:10:29 vml000081 systemd[1]: httpd.service: Consumed 1.032s CPU time over 5h 59min 5.170s wall clock time, 7.6M memory peak.
Feb 07 17:10:29 vml000081 systemd[1]: Starting The Apache HTTP Server...
Feb 07 17:10:29 vml000081 systemd[1]: Started The Apache HTTP Server.

Rufen wir zum Testen die Adresse vml000081.idmz.nausch.org auf, damit wir unsere zuvor angelegte Startseite zu Gesicht bekommen. Bild: Bildschirmhardcopy unserer Test-Demoseite des Apache-Webservers

Im Zugriffs-Log /var/log/httpd/access_log sehen wir dann auch den Zugriff auf unsere Startseite index.html.

 # less /var/log/httpd/access_log
10.0.0.110 - - [07/Feb/2026:17:12:57 +0100] "GET / HTTP/1.1" 200 459
10.0.0.110 - - [07/Feb/2026:17:12:57 +0100] "GET /favicon.ico HTTP/1.1" 404 1264

Der HTTP-Statuscode 404 (Not Found) besagt, dass die Ressource favicon.ico nicht gefunden und somit übermittelt werden konnte. Dies ist natürlich in unserem Beispiel korrekt, da wir diese Datei nicht angelegt bzw. in das betreffende Verzeichnis kopiert hatten.

Im nächsten Beispiel rufen wir eine nicht existierende Datei oder Verzeichnis im Browser auf unserer Homepage auf. Bild: Bildschirmhardcopy einer Fehlerseite, die durch einen nicht existierende Datei verursacht wurde

Hinter dem link Webmaster versteckt sichg dabei die von uns definierte Adresse bei der Konfigurationsoption ServerAdmin webmaster@nausch.org.

Unter der URL vml000081.idmz.nausch.org wird uns die Apache Version und das Betriebssystem unseres HTTP-Daemon angezeigt. Dies wollen wir so natürlich in unserer Produktivumgebung nicht sehen. Wir werden das nun im nächsten Schritt entsprechend deaktivieren.

default settings des Apache HTTP Server httpd-default.conf

In unserer Produnktionbsumgebung wollen wir nicht relevante Details verbergen, so z.B. welche Version wir beim Apache Webserver verwenden. Dies kann z.B. auch mit folgendem Test verifiziert werden:

 # curl -I http://vml000081.idmz.nausch.org
HTTP/1.1 200 OK
Date: Sat, 07 Feb 2026 17:33:11 GMT
Server: Apache/2.4.66 (Unix)
Last-Modified: Sat, 07 Feb 2026 16:01:49 GMT
ETag: "1cb-64a3e05fe539f"
Accept-Ranges: bytes
Content-Length: 459
Content-Type: text/html

Dies stellen wir nun ab, indem wir die Option ServerTokens Prod setzen.

 # vim /etc/httpd/conf/extra/httpd-default.conf
#                 
# ServerTokens       
# This directive configures what you return as the Server HTTP response
# Header. The default is 'Full' which sends information about the OS-Type
# and compiled in modules.
# Set to one of:  Full | OS | Minor | Minimal | Major | Prod
# where Full conveys the most information, and Prod the least.
#                 
# Django : 2026-02-07
# default: ServerTokens Full
ServerTokens Prod

Bevor wir nun die Änderungen scharf schalten, prüfen wir vorab noch, ob sich nicht doch beim Bearbeiten der Konfigurationsdatei ein Fehler eingeschlichen hat.

 # apachectl -t
Syntax OK

Wir können also getrost den HTTP-Daemon neu stzarten.

 # systemctl restart httpd.service

Nun fragen wir erneut ab:

 # curl -I http://vml000081.idmz.nausch.org
HTTP/1.1 200 OK
Date: Sat, 07 Feb 2026 17:38:30 GMT
Server: Apache
Last-Modified: Sat, 07 Feb 2026 16:01:49 GMT
ETag: "1cb-64a3e05fe539f"
Accept-Ranges: bytes
Content-Length: 459
Content-Type: text/html

Es wir ab sofort nur noch Server: Apache ausgegeben, also ohne die Versionsabgabe. :OK:

erster (named based) vHOST

Unser Web-Sever soll später für unterschiedliche (Sub-)Domains Seiten ausliefern. Wir werden hierzu Name based virual Hosts oder kurz vHOSTs einsetzen. Eine detaillierte Beschreibung hierzu findet man unter anderem auch in der Beschreibung zu Unterstützung namensbasierter virtueller Hosts.

Im folgendem Konfigurationsbeispiel wollen wir für den Hostnamen vhost-beispiel.nausch.org und vml000081.idmz.nausch.org unseren Webserver so konfigurieren, dass dieser unterschiedliche Inhalte ausliefert für die beiden vHosts ausliefert.

Zunächst legen wir uns auf unserem Server zwei Verzeichnisse für die beiden vHosts an.

 # mkdir /srv/http/vhost1
 # mkdir /srv/http/vhost2

In das erste Unterverzeichnis verschieben wir nun die in diesem Beispiel erstellte Datei index.html.

 # mv /srv/http/index.html /srv/http/vhost1/

Im anderen Unterverzeichnis legen wir eine neue Index-Datei an.

 # vim /srv/http/vhost2/index.html
/srv/http/vhost2/index.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>  
  <head>
    <title>Apache httpd, "der" WEB-Server - Installation unter Arch Linux</title>
  </head>
  <body>
    <p>Dies ist die <b>index.html</b>-Startseite unseres zweiten vHosts unseres Web-servers.<br>
    <br>
    Weiter Informationen zum Apache-Webserver unter Arch-Linux finden wir im <a href="https://dokuwiki.nausch.org/d
    </p>
  </body>
</html>

Wir haben also folgende Verzeichnis-Struktur.

/srv/http//
├── ftp/
├── http/
├── lost+found/
├── vhost1/
│   └── index.html
└── vhost2/
    └── index.html

Über unseren eigenen DNS-Server haben wir bereits gesorgt, dass beide Testdomains im DNS gefunden und eine Adresse dazu ausgegeben wird.

 # dig +short vhost-beispiel-1.nausch.org
10.0.0.81

und

 # dig +short vhost-beispiel-1.nausch.org
10.0.0.81

Was wir nun brauchen, ist die entsprechende Konfiguration(sdatei) für dieses Beispiel. Durch die Directive IncludeOptional am Ende der Konfigurationsdatei /etc/httpd/conf/httpd.conf werden alle Dateien mit der Erweiterung .conf in alphabetischer Reihenfolge eingebunden.

 # vim /etc/httpd/conf/httpd.conf
/etc/httpd/conf/httpd.conf
...
 
IncludeOptional conf.d/*.conf

Ob wir nun eine Datei mit allen vHost-Definitionen anlegen, oder ob diese in einzelne Dateien aufgesplittet werden, ist letztendlich egal. Die Trennung in einzelne Konfigurationsdateien hat den Vorteil, dass man so leichter den Überblick bei vielen vHosts behält und man so leicht einzelne vHosts schnell deaktivieren kann, in dem man die Konfigurationsdatei umbenennt, oder in ein anderes Verzeichnis verschiebt. Der Namensteil 80 symmbolisiert dabei auch den HTTP-Port 80.

Wir legen uns also für unseren ersten Host eine Datei an.

 # vim /etc/httpd/conf/conf.d/80_vhost_beispiel_1.conf
vim /etc/httpd/conf/conf.d/80_vhost_beispiel_1.conf
#
# Django : 2026-02-07
#          vHost vhost-beispiel-1.nausch.org
#
 
<VirtualHost *:80>
    ServerAdmin webmaster@nausch.org
    ServerName vhost-beispiel-1.nausch.org
    ServerPath /
    DocumentRoot "/srv/http/vhost1"
 
    <Directory "/srv/http/vhost1">
        Options FollowSymLinks
        AllowOverride none
        Require all granted
    </Directory>
 
    DirectoryIndex index.html
    ErrorLog "/var/log/httpd/vhost-beispiel-1.nausch.org_error.log"
    CustomLog "/var/log/httpd/vhost-beispiel-1.nausch.org_access.log" combined
</VirtualHost>

Und auch für unseren zweiten vHOST legen wir die nötige Konfigurationsdatei an.

 # vim /etc/httpd/conf/conf.d/80_vhost_beispiel_2.conf
/etc/httpd/conf/conf.d/80_vhost_beispiel_2.conf
#
# Django : 2026-02-07
#          vHost vhost-beispiel-2.nausch.org
#
 
<VirtualHost *:80>
    ServerAdmin webmaster@nausch.org
    ServerName vhost-beispiel-2.nausch.org
    ServerPath /
    DocumentRoot "/srv/http/vhost2"
 
    <Directory "/srv/http/vhost2">
        Options FollowSymLinks
        AllowOverride none
        Require all granted
    </Directory>
 
    DirectoryIndex index.html
    ErrorLog "/var/log/httpd/vhost-beispiel-1.nausch.org_error.log"
    CustomLog "/var/log/httpd/vhost-beispiel-1.nausch.org_access.log" combined
</VirtualHost>

Nun ist es an der Zeit, unseren Webserver von der Konfigurationsanpassung in Kenntnis zu setzen. Bevor wir dies aber tun, überprüfen wir noch, ob die Konfigurationsdateien unseres web-Servers noch irgendwelche syntaktischen Fehler haben. Hierzu benutzen wir folgenden Aufruf.

 # apachectl -t
 Syntax OK

Da kein Syntax-Fehler gefunden wurde, führen wir einen Reload unseres Apache-WEB-Servers durch.

 # systemctl reload httpd.service

Da jeder vHOST die Zugriffe bzw. die Fehler in separate Logdateien schreibt, haben wir es bei der Fehlersuche oder Auswertung der einzelnen Kunden-vHOSTS einfacher, als bei großen Dateien, in die jeder einzelne vHOST schreiben würde.

/var/log/httpd//
├── access_log
├── error_log
├── vhost-beispiel-1.nausch.org_access.log
├── vhost-beispiel-1.nausch.org_error.log
├── vhost-beispiel-2.nausch.org_access.log
└── vhost-beispiel-2.nausch.org_error.log

1 directory, 6 files

Eine ausführliche Beschreibung und Dokumentationder einzelnen Konfigurations-Directiven und -Optionen findet man in der Apache-Dokumentation zu virtuellen Hosts.

named based default vHOST

Setzen wir name-based-virtual-hosts ein, überprüft unser Webserver, ob im Request die IP-Adresse des Servers verwendet wurde. Anschließend werden dann alle <VirtualHost>-Abschnitte mit der benutzten IP-Adresse verglichen und geprüft, ob der gewählte Hostname zu einem ServerName oder der ServerAlias-Anweisung übereinstimmt. Bei einem positiven Ergebnis wird dann die konfiguration dieses vHOSTs verwendet, wie. z.B. in dem vorherigen Konfigurationsbeispiel. Wird jedoch kein passender vHOST gefunden, so wird die Konfiguration des ersten vHOSTS verwendet!

Wichtig
Da wir alle unsere vHOSTs in jeweils eigenen Dateien konfigurieren, ist es notwendig, dass wir dafür sorgen, dass die Konfigurationsdatei ganz am Anfang des Verzeichnisses steht, da der Apache-Webserver, die einzelnen Konfigurationsdateien im Verzeichnis /etc/httpd/conf.d/ in alphabetischer Reihenfolge einliest. Wir erreichen das ganz einfach, in dem wir dem vHOST eingfach eine 10 im Dateinamen vorne an stellen.

Für diesen speziellen Fall können wir auch eine eigene spezielle vHOST-Konfiguration definieren, nämlich den _default_-vHOST. Nähere Hinweise hierzu findet man in der Beschreibung zuUsing _default_ vhosts.

Wir legen uns also hierzu einen speziellen vHOST an.

 # vim /etc/httpd/conf/conf.d/10_default_vhost.conf
/etc/httpd/conf/conf.d/10_default_vhost.conf
#
# Django : 2014-08-29
#          default vHost sec-mail.guru
#
 
<VirtualHost _default_:80>
    ServerAdmin webmaster@nausch.org
    ServerName sec-mail.guru
    ServerAlias www.sec-mail.guru
    ServerPath /
    DocumentRoot "/var/www/default"
 
    <Directory "/var/www/default">
        Options FollowSymLinks
        AllowOverride none
        Require all granted
    </Directory>
 
    DirectoryIndex index.html
    ErrorLog logs/default-host_sec-mail.guru_error.log
    CustomLog logs/default-host_sec-mail.guru_access.log combined
</VirtualHost>

Auch hier testen wir, o sich nicht irgendwo ein Schreibfehler eingeschlichen hat.

 # apachectl -t
 Syntax OK

Anschließend führen wir einen reload unseres Servers durch, damit dieser die Konfigurationsdateien neu einliest.

 # systemctl reload httpd.service

Nicht immer wollen wir Inhalte die unser WEB-Server zur Verfügung stellt, allen Besuchern zugänglich machen. Bestimmte vertrauliche Daten, sollen oft nur einem gewissen Teilnehmerkreis angeboten werden. Diese Besucher müssen sich dann mit Hilfe eines Namens und eines zugehörigen Passwortes zu erkennen geben.

Basic Authentifikation

Die einfachste Variante zum Anmeldevorgang ist die Variante PasswordBasicAuth. Die berechtigten Nutzer und die zugehörigen Passwörter sind in einer Konfigurationsdatei, die sich außerhalb des Webserverspeicherbereichs kurz DocumentRoot befindet.

Mit Hilfe des Befehls htpasswd aus dem Archlinux-Paket apache verwalten wir die entsprechenden Userdaten.

Haben wir noch keine Passwort-Datei angelegt, generieren wir dies mit folgendem Aufruf. Ob man nun einen Usernamen oder eine eMail-Adresse zur Authentifizierung verwenden ist egal.

 # htpasswd -c /etc/httpd/conf/.htpasswd django@sec-mail.guru
 New password: 
 Re-type new password:

Das Passwort, welches wir 2x eingegeben hatten, wird standardmäßig als MD5-digest mit einem 32 salt gespeichert. Man erkennt dies an der Zeichenfolge $apr1$.

Legt man Wert auf höhere Sicherheit nutzt man statt MD5-gehashten Passwörtern z.B. die sicherere die bcrypt-Verschlüsselung der Passwörter.

 # htpasswd -cBC 7 /etc/httpd/conf/.htpasswd django

Die Option -c kennen wir bereits, sie besagt dass eine neue .htpasswd-Datei angelegt werden soll. Mit den Parametern B geben wir an, dass zum Hashen der Passwörter die bcrypt-Verschlüsselung verwendet werden soll. Der Parameter C 7 wiederum definiert die für den bcrypt-Algorithmus verwendete Berechnungszeit, je höher der Wert um so sicherer, was aber bedeutet dass dies entsprechend länger dauert. Der Standard ist der Wert 5, gültige Angaben finden sich zwischen 4 bis 17.

 # cat /etc/httpd/conf/.htpasswd
django:$2y$07$0T3l1g8g0KTe2vt3.AWRvO0FNzir7L8rCKv0z7ottu9I53Hs.kaJ6
 # cat /etc/httpd/conf/.htpasswd
django:$apr1$ISnGvp72$Iw22HeJQI9EsC8bN6iPy10

Wollen wir einen weiteren Nutzerhinzufügen rufen wir den Befehl htpasswd ohne den Parameter -c auf.

 # htpasswd /etc/httpd/conf/.htpasswd ruben
 New password: 
 Re-type new password:

Wichtig:
Legen wir eine .htpasswd neu an, kann diese per Default von allen gelesen werden.

 # ll /etc/httpd/conf/.htpasswd
-rw-r--r-- 1 root root 68 Feb  7 20:10 /etc/httpd/conf/.htpasswd

Dies wollen wir definitiv nicht und passen daher die User- und Dateirechte entsprechend an!

 # chmod 640 /etc/httpd/conf/.htpasswd
 # chown http: /etc/httpd/conf/.htpasswd

Nun sieht das schon besser aus!

 # ll /ll etc/httpd/conf/.htpasswd
-rw-r----- 1 http http 68 Feb  7 20:10 /etc/httpd/conf/.htpasswd

Es befinden sich nun zwei Anmeldenamen und deren zugehörigen verschlüsselten Passwörtern in der .htpasswd-Datei.

 # cat /etc/httpd/conf/.htpasswd
django:$apr1$ISnGvp72$Iw22HeJQI9EsC8bN6iPy10
ruben:$apr1$bR4sjAqr$0IurSzzF7zlG/oPbPSROh.

Haben wir alle Benutzer angelegt, geht es nun weiter mit der Konfiguration unseres vHOSTs. Wir sorgen nun dafür, dass für den Besuch unseres zuvor eingerichteten vHost vhost-beispiel-2.nausch.org sich der Besucher outen muss, laso sich mit Benutzernamen und Passwort anmelden muss.

Wir tragen hierzu nun folgende Zeilen nach.

 # vim /etc/httpd/conf/conf.d/80_vhost_beispiel_2.conf
/etc/httpd/conf/conf.d/80_vhost_beispiel_2.conf
#
# Django : 2026-02-07
#          vHost vhost-beispiel-2.nausch.org
#
 
<VirtualHost *:80>
    ServerAdmin webmaster@nausch.org
    ServerName vhost-beispiel-2.nausch.org
    ServerPath /
    DocumentRoot "/srv/http/vhost1"
 
    # Django : 2026-02-07 Konfigurationsbeispiel zur Basic Authenifikation mit Hilfe
    # einer htpasswd-Datei
    <Location />
      Options +FollowSymLinks +Multiviews +Indexes
      AllowOverride None
      AuthType basic
      AuthName "Konfigurationsbeispiel für basic-auth beim Apache Webserver vhost-beispiel-2.nausch.org"
      AuthUserFile conf/.htpasswd 
      Require valid-user django django@sec-mail.guru
    </Location>
 
    <Directory "/srv/http/vhost1">
        Options FollowSymLinks
        AllowOverride none
        Require all granted
    </Directory>
 
    DirectoryIndex index.html
    ErrorLog "/var/log/httpd/vhost-beispiel-2.nausch.org_error.log"
    CustomLog "/var/log/httpd/vhost-beispiel-2.nausch.org_access.log" combined
</VirtualHost>

Richtig, wie immer prüfen wir unsere Konfiguration auf mögliche Tippfehler bevor wir unseren Apache Webserver neu starten, damit dieser von den Konfigurationsänderungen erfährt!

 # apachectl -t
Syntax OK

Damit unsere Änderungen aktiv werden bedarf es noch eines Reloads unseres HTTP-Daemon.

 # systemctl reload httpd.service

WICHTIG:
Damit die Anmeldedaten nicht von Dritten mitgelesen und abgefischt werden können, nutzen wir natürlich einen SSL-geschützten vHOST!

Rufen wir erneut unsere Testseite auf unserem vHost auf, werden wir nun aufgefordert uns anzumelden.

Bild: Bildschirmhardcopy zeigt Basic-Auth beim Apache Webserver

Fehleingaben werden dabei im Error-Log des betreffenden vHosts protokolliert.

 # less /var/log/httpd/vhost-beispiel-2.nausch.org_error.log
[Sat Feb 07 21:25:23.199843 2026] [auth_basic:error] [pid 10129:tid 10182] [client 10.0.0.110:54730] AH01617: user django: authentication failure for "/error/HTTP_UNAUTHORIZED.html.var": Password Mismatch

Digest Authentifikation

Eine weitere und erheblich sicherere Methode, gegenüber der Basic Authentifizierung mit Hilfe einer .htpasswd-Datei ist die Digest Authentifizierung htdigest.

Bei der Benutzerauthentifizierung .htpasswd werden die zur Anmeldung nötigen Daten in Klartext übermittelt, also z.B. für den Nutzer django auch das Passwort 12qwasyx!

Im Gegensatz dazu wird bei der Authentifizierung mit Hilfe von htdigest KEINE Anmeldedaten in Klartext übermittelt, sondern ein MD5-Hashwert, der mit den Anmeldedaten erzeugt wird.

Wir erstellen und nun zuerst einmal die nötige Datei /etc/httpd/conf/.htdigest' mit folgendem Befehl. Dabei benutzen wir folgende Optionen:

  • -c : Erstellt eine neue Passwort-Datei mit dem nachfolgenden Dateiname.
  • nausch.org : Dies beschreibt den realm (weitere Informationen findet man u.a. dazu bei Wikipedia)
  • django : Benutzername der bei der Anmeldung verwendet wird.
 # htdigest -c /etc/httpd/conf/.htdigest nausch.org django
Adding password for django in realm Passwort geschützter Bereich!.
New password: 
Re-type new password:

Auch hier passen wir die Nutzer- und Dateirechte noch an, damit nicht jeder diese Datei lesen kann.

 # chmod 640 /etc/httpd/conf/.htdigest
 # chown http: /etc/httpd/conf/.htdigest

Nun sieht das entsprechend besser aus:

# ll /etc/httpd/conf/.htdigest
-rw-r----- 1 http http 71 Feb  7 21:18 /etc/httpd/conf/.htdigest

Damit unser Apache HTTP Server die Digest Authentifizierung auch anbieten und nutzen kann, müssen wir jetzt noch dafür sorgen, dass das Apache HTTP Server-Modul mod_auth_digest geladen und verwendet wird.

 # vim /etc/httpd/conf/httpd.conf
...

# Django : 2026-02-07                                    
# default: #LoadModule auth_digest_module modules/mod_auth_digest.so
LoadModule auth_digest_module modules/mod_auth_digest.so

...

Nun sorgen wir noch dafür dass bei Aufruf unserer Beispielsseite vhost-beispiel-1.nausch.org zur Authentifizierung das Digest-Modul verwendet wird.

 # vim /etc/httpd/conf/conf.d/80_vhost_beispiel_1.conf
/etc/httpd/conf/conf.d/80_vhost_beispiel_1.conf
#
# Django : 2026-02-07
#          vHost vhost-beispiel-1.nausch.org
#
 
<VirtualHost *:80>
    ServerAdmin webmaster@nausch.org
    ServerName vhost-beispiel-1.nausch.org
    ServerPath /
    DocumentRoot "/srv/http/vhost1"
 
    # Django : 2026-02-07 Konfigurationsbeispiel zur Digest Authenifikation mit Hilfe
    # des Digest-Moduls
    <Location />
      Options +FollowSymLinks +Multiviews +Indexes
      AllowOverride None
      AuthType Digest
      AuthName nausch.org
      AuthDigestDomain "/" "http://vhost-beispiel-1.nausch.org/"
      AuthDigestProvider file    
      AuthUserFile conf/.htdigest
      Require valid-user
    </Location>
 
    <Directory "/srv/http/vhost1">
        Options FollowSymLinks
        AllowOverride none
        Require all granted
    </Directory>
 
    DirectoryIndex index.html
    ErrorLog "/var/log/httpd/vhost-beispiel-1.nausch.org_error.log"
    CustomLog "/var/log/httpd/vhost-beispiel-1.nausch.org_access.log" combined
</VirtualHost>

Auch in diesem Beispiel kontrollieren wir noch, ob sich nicht doch unter Umständen ein Tippfehler in unserer Konfiguration versteckt hat.

 # apachectl -t
Syntax OK

Nun brauchen wir zum Schluß nur noch unseren HTTP-Daemon einmal durchstarten, damit er von unserer Konfigurationsänderung Bescheid weiß.

 # systemctl reload httpd.service

Rufen wir erneut unsere Testseite auf unserem vHost auf, werden wir nun aufgefordert uns anzumelden.

Bild: Bildschirmhardcopy zeigt Digest-Auth beim Apache Webserver

LDAP(s) Authentifikation

FIXME … coming soon! FIXME

Ausnahme eines Hosts/IP-Adresse

Soll eine IP-Adresse bzw. ein Host vom Logging ausgeschlossen werden, verwenden wir folgendes Konfigurationsbeispiel, welches wir beim betreffenden vHost eintragen.

 # vim /etc/httpd/conf/conf.d/80_vhost_beispiel_1.conf
...

    SetEnvIf  Remote_Addr "10\.0\.0\.110" dontlog
    ErrorLog "/var/log/httpd/vhost-beispiel-1.nausch.org_error.log"
    CustomLog "/var/log/httpd/vhost-beispiel-1.nausch.org_access.log" combined env=!dontlog

...

Zum Aktivieren wie üblich verwenden wir:

 # apachectl -t && systemctl reload httpd.service
Syntax OK

Greifen nun Hosts aus dem Intranet auf unseren Test-vHost zu, werden diese nicht mehr im zugehörigen access-Log keine Einträge mehr protokolliert, da als Quell-IP hier die IP-Adresse der internen Firewall FWC|FWI verwendet wird!

Im Abschnitt Konfigurationsverzeichnisse und -dateien hatten wir unter anderem die Konfigurationsdatei /etc/httpd/conf/extra/httpd-info.conf kurz betrachtet. Mit Hilfe dieser Konfigurationsdatei können wir über die URL-Ergänzungen /server-status und /server-info Status-Rückmeldungen und -Informationen des Servers, abrufbar machen. Dies wollen wir uns nun genauer ansehen.

Um Änderungen an der Konfigurationsdatei /etc/httpd/conf/extra/httpd-info.conf bei einem Update des Pakets apache besser verfolgen zu können, sichern wir zunächst diese Date, in dem wir eine Kopie davon erstellen.

 # cp -av /etc/httpd/conf/extra/httpd-info.conf /etc/httpd/conf/extra/httpd-info.conf.orig

Nun passen wir die Datei unseren Bedürfnissen nach an, folgende Anpassungen nehmen wir dabei vor.

  1. Als erstes sorgen wir dafür, dass zum Auf- und Abruf der Informationen die dafür nötigen Module geladen und auch die Konfigurationsdatei /etc/httpd/conf/extra/httpd-info.conf includioert wird.
     # vim /etc/httpd/conf/httpd.conf
    ...
    
    # Django : 2026-02-08
    # default: #LoadModule info_module modules/mod_info.so                               
    LoadModule info_module modules/mod_info.so
    
    ...
    
    ...
    
    # Real-time info on requests and configuration
    # Django : 2026-02-08
    # default: #Include conf/extra/httpd-info.conf
    Include conf/extra/httpd-info.conf 
    
    ...
  2. Anschließend sorgen wir dafür, dass zum Auf- und Abruf der Informationen sich der Webmaster entsprechend authentifizieren muss. Hier greifen wir auf das Beispiel mit der Digest Authentifikation zurück.
     # vim /etc/httpd/conf/extra/httpd-info.conf
    /etc/httpd/conf/extra/httpd-info.conf
    #
    # Get information about the requests being processed by the server
    # and the configuration of the server.
    #
    # Required modules: mod_authz_core, mod_authz_host,
    #                   mod_info (for the server-info handler),
    #                   mod_status (for the server-status handler)
     
    #
    # Allow server status reports generated by mod_status,
    # with the URL of http://servername/server-status
    # Change the ".example.com" to match your domain to enable.
     
    # Django : 2026-02-08
    # default: <Location /server-status>
    #              SetHandler server-status
    #              Require host .example.com
    #              Require ip 127
    #          </Location>
    <Location /server-status>
      SetHandler server-status
      AuthType Digest
      AuthName nausch.org
      AuthDigestDomain "/" "http://.nausch.org/"
      AuthDigestProvider file
      AuthUserFile conf/.htdigest
      Require valid-user django
    </Location>
     
    #
    # ExtendedStatus controls whether Apache will generate "full" status
    # information (ExtendedStatus On) or just basic information (ExtendedStatus
    # Off) when the "server-status" handler is called. The default is Off.
    #
    # Django : 2026-02-08
    # default: #ExtendedStatus On
    ExtendedStatus On
     
    #
    # Determine if mod_status displays the first 63 characters of a request or
    # the last 63, assuming the request itself is greater than 63 chars.
    # Django : 2026-02-08
    # default: SeeRequestTail Off
    SeeRequestTail On
     
    #
    # Allow remote server configuration reports, with the URL of
    #  http://servername/server-info (requires that mod_info.c be loaded).
    # Change the ".example.com" to match your domain to enable.
    #
    # Django : 2026-02-08
    # default: <Location /server-info>
    #              SetHandler server-info
    #              Require host .example.com
    #              Require ip 127
    #          </Location>
    <Location /server-info>
      SetHandler server-info
      AuthType Digest
      AuthName nausch.org
      AuthDigestDomain "/" "http://.nausch.org/"
      AuthDigestProvider file
      AuthUserFile conf/.htdigest
      Require valid-user django
    </Location>

Damit unser laufender HTTP Daemon von der Änderung unserer Konfiguration Kenntnis erlangt, ist es notwendig diesen einmal zum Reload der Konfiguration zu veranlassen. Zuvor prüfen wir aber wie immer, ob sich etwaige Fehler bei der Konfiguration eingeschlichen haben.

 # apachectl -t
Syntax OK

Anschließend reloaden wir den Pache Webserver neu.

 # systemctl reload httpd.service

Bei Aufruf der URL-Erweiterungen können wir nun nach der Authentifizierung folgende Informationen erlangen:

  • /server-status : Statusinformationen zum Server bzw. virtuellen Host
  • /server-status?auto Erzeugen einer maschinell lesbare Ausgabe
  • /server-status?refresh=n : automatische Aktualisierung der Ausgabe alle n Sekunden
  • /server-info : Anzeige von Informationen zu Modulnamen, Konfigurationen, Hooks, Modulen und dem Server selbst
  • /server-info?config : Anzeige der Konfiguration inklusive aller inkludierten Konfigurationsdateien
  • /server-info?hooks : Anzeige nur der einzelnen Hooks, mit denen die Module verknüpft sind
  • /server-info?list : Anzeige einer einfachen Liste aller geladenen Module
  • /server-info?Modulname : Einschränkung der Anzeige von Informationen zu einem Modul mit dem angegeben Namen
  • /server-info?server : Anzeige von Grundinformationen des Apache HTTP Servers

Das HTTP-Protoll wird stetig weiterentwickelt, so wurde im RFC 7540 die Weiterentwicklung zum HTTP/2 Protokoll definiert.

Mit Hilfe des Apache-Moduls mod_http2 wurde diese Weiterentwicklung von HTTP, des weltweit erfolgreichsten Protokolls der Anwendungsschicht, implementiert. Es konzentriert sich dabei auf die effizientere Nutzung der Netzwerkressourcen und ändert nichts an den Grundlagen von HTTP, der Semantik. Es gibt immer noch Requests und Antworten, Kopfzeilen und die weiteren Grundlagen des HTTP-Protokolls. Weitere Informationen hierzu findet man auf der Howto-Seite der Apache Organisation.

Die Konfigurationsanpassung zu HTTP/2 werden in der Hauptkonfigurationsdatei /etc/httpd/conf/httpd.conf des HHTP-Daemon vorgenommen. Diese Erweitern wird nun wie folgt:

 # vim /etc/httpd/conf/httpd.conf
...
 
# Django : 2026-02-08
# default: #LoadModule http2_module modules/mod_http2.so
LoadModule http2_module modules/mod_http2.so
 
...
 
...
 
# Django : 2026-02-08                                               
# default: unset                                                    
<IfModule http2_module>                                             
  # Allows HTTP/2 negotiation (h2) via TLS ALPN for secure <VirtualHost>.
  # Allows HTTP/2 cleartext negotiation (h2c) upgrading from an initial 
  # HTTP/1.1 connection or via HTTP/2 preamble checking (Direct mode, 
  # see H2Direct:                                                   
  # https://httpd.apache.org/docs/current/mod/mod_http2.html#h2direct).
  Protocols h2 h2c http/1.1                                         
  # There is one more thing to ordering: the client has its own     
  # preferences, too. If you want, you can configure your server to 
  # select the protocol most preferred by the client:
  ProtocolsHonorOrder Off                                                            
</IfModule>
 
...

Die Aktivierung erfolgt wie immer dem gleichen Schema, als erstes wird die Konfiguration des Apache HTTP Servers auf Vertipper gecheckt und anschließend erfolgt ein Reload des Daemon.

 # apachectl -t && systemctl reload httpd.service 
Syntax OK

Im Internet finden Sie viele (kostenlose) Tools, mit denen man nun schnell und einfach testen kann, ob eine Webseite per HTTP/2 aufgerufen werden kann, ein Beispiel hierzu ist die Seite von keycdn.com.

Konfiguration

Mit Hilfe des Apache HTTPD Server-Modul mod_deflate wird der DEFLATE-Ausgabefilter realisiert, der es erlaubt die Auslieferung von Inhalten zu komprimieren, bevor diese zum anfordernden Client gesendet werden.

Zum Aktivieren des Moduls ergänzen wir unsere Hauptkonfigurationsdatei unseres Apache Daemon wie folgt.

 # vim /etc/httpd/conf/httpd.conf
...
 
# Django : 2026-02-08
# default: #LoadModule deflate_module modules/mod_deflate.so                         
LoadModule deflate_module modules/mod_deflate.so
 
...
 
...
 
# Django : 2026-02-08                                                                
# default: unset
<IfModule deflate_module>
  # Compression is implemented by the DEFLATE filter. The following 
  # directive will enable compression for all outgoing content.
  SetOutputFilter DEFLATE
  # Exclude uncompressible browser via part of user-agent string
  BrowserMatch ^Mozilla/4\.0[678] no-gzip
  BrowserMatch ^Mozilla/4 gzip-only-text/html
  BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
  # Exclude compression of content that cannot be further compressed
  # based on the file type.
  <IfModule setenvif_module>
    SetEnvIfNoCase Request_URI \.(?:png|jpe?g|gif|tar|gz|zip)$ no-gzip
  </IfModule>
  <IfModule headers_module>
    # The mod_deflate module sends a Vary: Accept-Encoding HTTP 
    # response header to alert proxies that a cached response should
    # be sent only to clients that send the appropriate Accept-
    # -Encoding request header. This prevents compressed content
    # from being sent to a client that will not understand it.
    Header append Vary User-Agent
  </IfModule>
</IfModule>
 
...

Die Aktivierung folgt auch hier wie immer dem gleichen Schema:

 # apachectl -t && systemctl reload httpd.service 
Syntax OK

Anpassung Logging

Beim Apache HTTPD Server-Modul mod_deflate können dem Logging Daten zu den ausgelieferten Bytes und den jeweiligen Komprimierungsgrad mitgegeben werden. Wir wollen also nun unser Logging entsprechend ergänzen. Hierzu erweitern wir die bestehende LOG-Direktive des Apache HTTPD Server wie folgt.

 # vim /etc/httpd/conf/httpd.conf
<IfModule log_config_module>
  #
  # The following directives define some format nicknames for use with
  # a CustomLog directive (see below).
  #
  LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
  LogFormat "%h %l %u %t \"%r\" %>s %b" common
 
  <IfModule logio_module>
    # You need to enable mod_logio.c to use %I and %O                                                   
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
  </IfModule>
 
  #
  # The location and format of the access logfile (Common Logfile Format).
  # If you do not define any access logfiles within a <VirtualHost>
  # container, they will be logged here.  Contrariwise, if you *do*
  # define per-<VirtualHost> access logfiles, transactions will be
  # logged therein and *not* in this file.
  #
  # Django : 2026-02-08
  # default: CustomLog "/var/log/httpd/access_log" common
  # CustomLog "/var/log/httpd/access_log" common
 
  #
  # If you prefer a logfile with access, agent, and referer information
  # (Combined Logfile Format) you can use the following directive.
  #
  # Django : 2026-02-08
  # default: #CustomLog "/var/log/httpd/access_log" combined
  CustomLog "/var/log/httpd/access_log" combined_deflate
 
  # Django : 2026-02-08
  # default: unset
  <IfModule deflate_module>
    # You need to enable mod_deflate.c to use instream, outstream and ratio.
    DeflateFilterNote Input instream
    DeflateFilterNote Output outstream
    DeflateFilterNote Ratio ratio
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %b %{outstream}n/%{instream}
  </IfModule> 
</IfModule>

Auch gilt, erst checken, dann reloaden!

 # apachectl -t && systemctl reload httpd.service 
Syntax OK

Konfiguration

Mit dem Apache HTTPD Server-Modul mod_remoteip versetzen wir unseren Apache Webserver in die Lage, die ursprüngliche IP-Adresse eines Clients für die Verbindung durch die IP-Adressenliste des Useragenten zu ersetzen, die von einem Load Balancer oder einem HTTP-Proxy über die Anfrage-Header übermittelt wird. Hierzu erweitern wir nun die Hauptkonfigurationsdatei unseres HTTP Daemon wie nachfolgend aufgezeigt.

 # vim /etc/httpd/conf/httpd.conf
...
 
# Django : 2028-02-08                                                
# default: #LoadModule logio_module modules/mod_logio.so             
# This module provides the logging of input and output number of bytes 
# received/sent per request. The numbers reflect the actual bytes as 
# received on the network, which then takes into account the headers and
# bodies of requests and responses. The counting is done before SSL/TLS
# on input and after SSL/TLS on output, so the numbers will correctly
# reflect any changes made by encryption.                                                               
LoadModule logio_module modules/mod_logio.so
 
...
 
...
 
# Django : 2026-02-08                                                
# default: #LoadModule remoteip_module modules/mod_remoteip.so       
# This module is used to treat the useragent which initiated the request
# as the originating useragent as identified by httpd for the purposes
# of authorization and logging, even where that useragent is behind a
# load balancer, front end server, or proxy server.                  
# The module overrides the client IP address for the connection with the
# useragent IP address reported in the request header configured with
# the RemoteIPHeader directive.                                                                         
LoadModule remoteip_module modules/mod_remoteip.so
 
...

Die Aktivierung folgt auch hier wie immer dem gleichen Schema:

 # apachectl -t && systemctl reload httpd.service 
Syntax OK

Logging

Wie auch schon beim Beispiel mod_deflate erfolgt die Anpassung beim Logging mit Hilfe der Konfigurationsdatei /etc/httpd/conf/httpd.conf im Abschnitt log_config_module.

 # vim /etc/httpd/conf/httpd.conf
...
 
<IfModule log_config_module>
  #
  # The following directives define some format nicknames for use with
  # a CustomLog directive (see below).
  #
  LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
  LogFormat "%h %l %u %t \"%r\" %>s %b" common
 
  # Django : 2026-02-08
  # default: <IfModule logio_module>
  #            # You need to enable mod_logio.c to use %I and %O
  #            LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio                                                                                                        
  #          </IfModule>
  <IfModule logio_module>
    # This module provides the logging of input and output number of bytes received/sent per request.
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %{SSL_PROTOCOL}x %{SSL_CIPHER}x %I %O" combined_ssl
    LogFormat "%h %l %u %t \"%r\" %>s %b %{SSL_PROTOCOL}x %{SSL_CIPHER}x %I %O" common_ssl
  </IfModule>
 
  <IfModule setenvif_module>
    # The mod_setenvif module allows you to set internal environment variables
    # according to whether different aspects of the request match regular
    # expressions you specify. These environment variables can be used by
    # other parts of the server to make decisions about actions to be taken,
    # as well as becoming available to CGI scripts and SSI pages
    SetEnvIF User-Agent "HAProxy" dontlog=yes
  </IfModule>
  <IfModule remoteip_module>
    # This module is used to treat the useragent which initiated the request
    # as the originating useragent as identified by httpd for the purposes of
    # authorization and logging, even where that useragent is behind a load
    # balancer, front end server, or proxy server.
    # The module overrides the client IP address for the connection with the
    # useragent IP address reported in the request header configured with the
    # RemoteIPHeader directive.
    # Additionally, this module implements the server side of HAProxy's PROXY
    # Protocol when using the RemoteIPProxyProtocol directive.
    RemoteIPHeader X-Forwarded-For
    RemoteIPInternalProxy 10.0.0.80
    RemoteIPInternalProxy fd00::3:10:0:0:80
  </IfModule>
  <IfModule logio_module>
    CustomLog /var/log/httpd/access.log combined_deflate_ssl "expr=(reqenv('dontlog') != 'yes')"
  </IfModule>
 
  #
  # The location and format of the access logfile (Common Logfile Format).
  # If you do not define any access logfiles within a <VirtualHost>
  # container, they will be logged here.  Contrariwise, if you *do*
  # define per-<VirtualHost> access logfiles, transactions will be
  # logged therein and *not* in this file.
  #
  # Django : 2026-02-08
  # default: CustomLog "/var/log/httpd/access_log" common
  # CustomLog "/var/log/httpd/access_log" common
 
  #
  # If you prefer a logfile with access, agent, and referer information
  # (Combined Logfile Format) you can use the following directive.
  #
  # Django : 2026-02-08
  # default: #CustomLog "/var/log/httpd/access_log" combined
  CustomLog "/var/log/httpd/access_log" combined_deflate
 
  # Django : 2026-02-08
  # default: unset
  <IfModule deflate_module>
    # The mod_deflate module provides the DEFLATE output filter that allows
    # output from your server to be compressed before being sent to the
    # client over the network. You need to enable mod_deflate.c to use
    #  instream, outstream and ratio.
    DeflateFilterNote Input instream
    DeflateFilterNote Output outstream
    DeflateFilterNote Ratio ratio
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %b %{outstream}n/%{instream}n (%{ratio}n%%)" combined_deflate
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %{SSL_PROTOCOL}x %{SSL_CIPHER}x %b %{outstream}n/%{instream}n (%{ratio}n%%)" combined_deflate_ssl
  </IfModule> 
</IfModule>
 
...

Wie soll es anders sein, auch gilt, erst checken, dann reloaden!

 # apachectl -t && systemctl reload httpd.service 
Syntax OK

FIXME

Im Gegensatz zu den Konfigurationsbeispielen wie den Einrichten eines DNS-Daemons auf Basis von ISC Bind unter Arch Linux oder DHCPv4|v6-Server mit DHCP ISC Kea unter Arch Linux einrichten und nutzen befassen wir uns noch nicht mit der Orchestrierung unseres Apache Web-Servers, sondern betrachten erst noch weitere Konfigurationsbeispiele.

  • FIXME
  • FIXME

Links

Diese Website verwendet Cookies. Durch die Nutzung der Website stimmen Sie dem Speichern von Cookies auf Ihrem Computer zu. Außerdem bestätigen Sie, dass Sie unsere Datenschutzbestimmungen gelesen und verstanden haben. Wenn Sie nicht einverstanden sind, verlassen Sie die Website.Weitere Information
  • linux/webserver/apache_1.txt
  • Zuletzt geändert: 08.02.2026 13:49.
  • von django