208.1 Grundlegende Apachekonfiguration Gewichtung 4

208.1 Grundlegende Apache-Konfiguration

Kandidaten sollten einen Web-Server installieren und konfigurieren können. Dieses Lernziel beinhaltet das Überwachen der Server-Last und -Leistung, das Beschränken des Zugriffs auf bestimmte Clients und Benutzer, das Einrichten der Unterstützung für Skriptsprachen als Module und die Konfiguration einer Benutzerauthentisierung. Außerdem enthalten ist die Konfiguration von Serveroptionen zur Einschränkung des Ressourcengebrauchs. Kandidaten sollten einen Web-Server für den Gebrauch virtueller Server und spezialisierten Dateizugriff konfigurieren können.

Hauptwissensgebiete:

Dies ist eine auszugsweise Liste der verwendeten Dateien, Begriffe und Hilfsprogramme:

Vorbereitung

Installation des Apache 2.4

Die Paketnamen lauten für meine verwendeten Distributionen:

Distribution Paketname
debian, suse, ubuntu apache2
centos httpd

Playbook playbooks/install_apache2.yml:

---
- name: Install Apache
  hosts:
    - lpic
  become: yes
  gather_facts: no
  tasks:
  - name: install apache2
    package:
      name: apache2
    when: inventory_hostname != "centos"
  - name: start apache2
    service:
      name: apache2
      state: started
      enabled: yes
    when: inventory_hostname != "centos"
  - name: install apache2
    package:
      name: httpd
    when: inventory_hostname == "centos"
  - name: start apache2
    service:
      name: httpd
      state: started
      enabled: yes
    when: inventory_hostname == "centos"

Installation

ansible-playbook playbooks/install_apache2.yml

Kontrolle mit systemctl:

ansible lpic -b -a 'systemctl -a' | grep -P '>>|http|apache'
debian | CHANGED | rc=0 >>
  apache2.service                                                                          loaded    active   running   The Apache HTTP Server
ubuntu | CHANGED | rc=0 >>
  apache2.service                                                                           loaded    active   running   The Apache HTTP Server
centos | CHANGED | rc=0 >>
  httpd.service                                                                                                  loaded    active   running   The Apache HTTP Server
suse | CHANGED | rc=0 >>
  apache2.service                                                                          loaded    active   running   The Apache Webserver
  apache2.target                                                                           loaded    inactive dead      Apache target allowing to control multi setup

Prozesse anschauen:

ansible lpic -b -a 'ps -ef' | grep -P '>>|http|apache'
debian | CHANGED | rc=0 >>
root     16499     1  0 10:50 ?        00:00:00 /usr/sbin/apache2 -k start
www-data 16501 16499  0 10:50 ?        00:00:06 /usr/sbin/apache2 -k start
www-data 16502 16499  0 10:50 ?        00:00:06 /usr/sbin/apache2 -k start
ubuntu | CHANGED | rc=0 >>
root      2437     1  0 02:50 ?        00:00:00 /usr/sbin/apache2 -k start
www-data  2439  2437  0 02:50 ?        00:00:00 /usr/sbin/apache2 -k start
www-data  2440  2437  0 02:50 ?        00:00:00 /usr/sbin/apache2 -k start
centos | CHANGED | rc=0 >>
root      3236     1  0 14:38 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    3237  3236  0 14:38 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    3238  3236  0 14:38 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    3239  3236  0 14:38 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    3240  3236  0 14:38 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    3241  3236  0 14:38 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
suse | CHANGED | rc=0 >>
root      7299     1  0 14:38 ?        00:00:00 /usr/sbin/httpd-prefork -DSYSCONFIG -C PidFile /var/run/httpd.pid -C Include /etc/apache2/sysconfig.d//loadmodule.conf -C Include /etc/apache2/sysconfig.d//global.conf -f /etc/apache2/httpd.conf -c Include /etc/apache2/sysconfig.d//include.conf -DSYSTEMD -DFOREGROUND -k start
wwwrun    7306  7299  0 14:38 ?        00:00:00 /usr/sbin/httpd-prefork -DSYSCONFIG -C PidFile /var/run/httpd.pid -C Include /etc/apache2/sysconfig.d//loadmodule.conf -C Include /etc/apache2/sysconfig.d//global.conf -f /etc/apache2/httpd.conf -c Include /etc/apache2/sysconfig.d//include.conf -DSYSTEMD -DFOREGROUND -k start
wwwrun    7307  7299  0 14:38 ?        00:00:00 /usr/sbin/httpd-prefork -DSYSCONFIG -C PidFile /var/run/httpd.pid -C Include /etc/apache2/sysconfig.d//loadmodule.conf -C Include /etc/apache2/sysconfig.d//global.conf -f /etc/apache2/httpd.conf -c Include /etc/apache2/sysconfig.d//include.conf -DSYSTEMD -DFOREGROUND -k start
wwwrun    7308  7299  0 14:38 ?        00:00:00 /usr/sbin/httpd-prefork -DSYSCONFIG -C PidFile /var/run/httpd.pid -C Include /etc/apache2/sysconfig.d//loadmodule.conf -C Include /etc/apache2/sysconfig.d//global.conf -f /etc/apache2/httpd.conf -c Include /etc/apache2/sysconfig.d//include.conf -DSYSTEMD -DFOREGROUND -k start
wwwrun    7309  7299  0 14:38 ?        00:00:00 /usr/sbin/httpd-prefork -DSYSCONFIG -C PidFile /var/run/httpd.pid -C Include /etc/apache2/sysconfig.d//loadmodule.conf -C Include /etc/apache2/sysconfig.d//global.conf -f /etc/apache2/httpd.conf -c Include /etc/apache2/sysconfig.d//include.conf -DSYSTEMD -DFOREGROUND -k start
wwwrun    7310  7299  0 14:38 ?        00:00:00 /usr/sbin/httpd-prefork -DSYSCONFIG -C PidFile /var/run/httpd.pid -C Include /etc/apache2/sysconfig.d//loadmodule.conf -C Include /etc/apache2/sysconfig.d//global.conf -f /etc/apache2/httpd.conf -c Include /etc/apache2/sysconfig.d//include.conf -DSYSTEMD -DFOREGROUND -k start

Versions-Check mit apachectl -v:

ansible lpic -b -a 'apachectl -v'
debian | CHANGED | rc=0 >>
Server version: Apache/2.4.25 (Debian)
Server built:   2019-10-13T15:43:54

ubuntu | CHANGED | rc=0 >>
Server version: Apache/2.4.29 (Ubuntu)
Server built:   2019-09-16T12:58:48

centos | CHANGED | rc=0 >>
Server version: Apache/2.4.6 (CentOS)
Server built:   Aug  8 2019 11:41:18

suse | CHANGED | rc=0 >>
Server version: Apache/2.4.23 (Linux/SUSE)
Server built:   2019-04-04 14:59:07.000000000 +0000

Konfiguration / Einstellungen checken

hier nur am Beispiel von Debian:

ansible debian -b -a 'apachectl -h'
debian | FAILED | rc=1 >>
Action '-h' failed.
The Apache error log may have more information.Usage: /usr/sbin/apache2 [-D name] [-d directory] [-f file]
                         [-C "directive"] [-c "directive"]
                         [-k start|restart|graceful|graceful-stop|stop]
                         [-v] [-V] [-h] [-l] [-L] [-t] [-T] [-S] [-X]
Options:
  -D name            : define a name for use in <IfDefine name> directives
  -d directory       : specify an alternate initial ServerRoot
  -f file            : specify an alternate ServerConfigFile
  -C "directive"     : process directive before reading config files
  -c "directive"     : process directive after reading config files
  -e level           : show startup errors of level (see LogLevel)
  -E file            : log startup errors to file
  -v                 : show version number
  -V                 : show compile settings
  -h                 : list available command line options (this page)
  -l                 : list compiled in modules
  -L                 : list available configuration directives
  -t -D DUMP_VHOSTS  : show parsed vhost settings
  -t -D DUMP_RUN_CFG : show parsed run settings
  -S                 : a synonym for -t -D DUMP_VHOSTS -D DUMP_RUN_CFG
  -t -D DUMP_MODULES : show all loaded modules
  -M                 : a synonym for -t -D DUMP_MODULES
  -t -D DUMP_INCLUDES: show all included configuration files
  -t                 : run syntax check for config files
  -T                 : start without DocumentRoot(s) check
  -X                 : debug mode (only one worker, do not detach)non-zero return code
Einstellungen die beim Kompilieren des apache2 gesetzt wurden:
ansible centos -b -a 'apachectl -V'
centos | CHANGED | rc=0 >>
Server version: Apache/2.4.6 (CentOS)
Server built:   Aug  8 2019 11:41:18
Server's Module Magic Number: 20120211:24
Server loaded:  APR 1.4.8, APR-UTIL 1.5.2
Compiled using: APR 1.4.8, APR-UTIL 1.5.2
Architecture:   64-bit
Server MPM:     prefork
  threaded:     no
    forked:     yes (variable process count)
Server compiled with....
 -D APR_HAS_SENDFILE
 -D APR_HAS_MMAP
 -D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
 -D APR_USE_SYSVSEM_SERIALIZE
 -D APR_USE_PTHREAD_SERIALIZE
 -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
 -D APR_HAS_OTHER_CHILD
 -D AP_HAVE_RELIABLE_PIPED_LOGS
 -D DYNAMIC_MODULE_LIMIT=256
 -D HTTPD_ROOT="/etc/httpd"
 -D SUEXEC_BIN="/usr/sbin/suexec"
 -D DEFAULT_PIDLOG="/run/httpd/httpd.pid"
 -D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
 -D DEFAULT_ERRORLOG="logs/error_log"
 -D AP_TYPES_CONFIG_FILE="conf/mime.types"
 -D SERVER_CONFIG_FILE="conf/httpd.conf"AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using fe80::5054:ff:fec9:c704. Set the 'ServerName' directive globally to suppress this message

hier schauen wir uns die zwei wichtigsten auf allen 4 Systemen genauer an:

ansible lpic -b -a 'apachectl -V' | grep -P 'Server MPM:|threaded:|>>'
debian | CHANGED | rc=0 >>
Server MPM:     event
  threaded:     yes (fixed thread count)
centos | CHANGED | rc=0 >>
Server MPM:     prefork
  threaded:     no
suse | CHANGED | rc=0 >>
Server MPM:     prefork
  threaded:     no
ubuntu | CHANGED | rc=0 >>
Server MPM:     event
  threaded:     yes (fixed thread count)

MPM steht hier für Multi-Processing Module . Aktuell sind drei verschieden MPMs verbreitet:

die Unterschiede liegen in der Speichernutzung und der Performance:

MPM-Type Beschreibung
prefork Prefork MPM startet mehrere untergeordnete Prozesse. Jeder untergeordnete Prozess verarbeitet jeweils eine Verbindung. Prefork verwendet im Vergleich zu Worker-MPM viel Arbeitsspeicher. Prefork ist das Standard-MPM, das vom Apache2-Server verwendet wird. In Preform MPM werden immer nur wenige (MinSpareServers) definierte Prozesse als Reserve ausgeführt, sodass neue Anforderungen nicht auf den Start eines neuen Prozesses warten müssen.
worker Worker MPM generiert mehrere untergeordnete Prozesse ähnlich wie Prefork. Jeder untergeordnete Prozess führt viele Threads aus. Jeder Thread verarbeitet jeweils eine Verbindung. In Worker MPM ist ein hybrider Multiprozess-Multi-Thread-Server implementiert. Worker MPM verwendet im Vergleich zu Prefork MPM wenig Arbeitsspeicher.
event Event MPM wurde in Apache 2.4 eingeführt. Es ähnelt Worker MPM, wurde jedoch für die Verwaltung hoher Lasten entwickelt. Mit diesem MPM können mehr Anforderungen gleichzeitig bedient werden, indem einige Verarbeitungsaufgaben an unterstützende Threads übergeben werden. Mit diesem MPM versucht Apache, das “Keep Alive” -Problem zu beheben, mit dem andere MPMs konfrontiert sind. Wenn ein Client die erste Anforderung abschließt, kann der Client die Verbindung offen halten und weitere Anforderungen über denselben Socket senden, wodurch die Verbindungsüberlastung verringert wird.

Die bereits beim kompilieren eingestellten Einstellungen bezüglich des verwendeten MPMs lassen sich durch da aktivieren und deaktivieren entsprechender Module bzw. verwenden unterschiedlicher Binaries umschalten.

WICHTIG:

Um zusätzliche Umgebungsvariablen dem Apache2 Prozess mitzugeben, kann man die Datei (bei Centos/Redhat und Suse) /etc/sysconfig/httpd bearbeiten. Bei Debian-like Systemen lautet diese Datei /etc/apache2/envvars.

208.1.1 wichtige Direktiven

208.1.2 Authentifizierung

Modul mod_auth_basic

Hier wird über die Direktive AuthUserFile die Datei mit den verschlüsselten Passwörtern verlinkt. Diese Datei wird mit dem Befehl htpasswd erzeugt.

wichtige htpasswd-Parameter sind (siehe auch https://cht.sh/htpasswd)

htpasswd -c path/to/file user_name

htpasswd path/to/file user_name

htpasswd -b path/to/file user_name password

htpasswd -D path/to/file user_name

htpasswd -v path/to/file user_name

Modul mod_authz_host

Ausführliche Beschreibung unter https://httpd.apache.org/docs/2.4/mod/mod_authz_host.html.

Die Direktiven des Modules können in <Directory>, <Files>, oder <Location> Sektionen oder in der .htaccess-Datei verwendet werden. Dabei wird der Zugriff über Hostnamen oder IP-Adressen gesteuert. Grundsätzlich sind alle Request-Methoden (GET, PUT, POST, etc) davon betroffen, es sei denn man übersteuert das Verhalten mit einer <Limit>-Sektion.

Die Einschränkung über IP-Adressen kann folgende Formen haben:

Vollständig:

Require ip 192.168.1.104 192.168.1.205

Partiale Angaben:

Require ip 10 172.20 192.168.2

Netzwerk/Netzmaske Pärchen:

Require ip 10.1.0.0/255.255.0.0

CIDR-Notation:

# private Adresse:
Require ip 192.168.0.0/16 172.16.0.0/12 10.0.0.0/8

IPv6

Require ip 2001:db8::a00:20ff:fea7:ccea
Require ip 2001:db8:1:1::a
Require ip 2001:db8:2:1::/64

Die angegebenen top-Level, second-Level etc. Domain-Namen müssen konkret übereinstimmen, Teilstrings der jeweiligen Level matchen nicht. Bei diesem Verfahren findet erst ein Reverse-DNS-Lookup und danach ein DNS-Lookup statt. Im folgenden Beispiel matched 123.example.org aber nicht 1example.org

Require host example.org
Require host .net example.edu

Hier findet nur ein DNS-Lookup statt. Wenn die IP-Adresse des Clients mit der eines der DNS-Lookups übereinstimmt, ist die Require-Direktive bestätigt.

Require forward-dns bla.example.org

bedient alle lokalen Anfragen, also immer verwenden, wenn auf dem Webserver lokale Anfragen durchgeführt werden.

ACHTUNG: Anfragen die über einen Proxy reinkommen, müssen entweder dort kontrolliert werden, oder mit mod_remoteip behandelt werden. Das geht vermutlich über den LPIC2 Rahmen hinaus.

Modul mod_authz_groupfile

mit hilfe dieses Modules kann man eine weitere Textdatei über die Direktive AuthGroupFile <path> einbinden, in der man User zu Gruppen zuordnet:

grp1: user1 user2
grp2: user3 user4

um dann später nur bestimmte Gruppe zuzulassen verwendet man die Direktive Require group <groupname1> [<groupname2> ...]

AuthGroupFile /data/groups
Require group grp1 grp2

.htaccess Datei verwenden

die Authorisierungsderiktiven können auch über eine .htacces Datei im DocumentRoot des vhosts oder eines seiner Unterverzeichnisse verwaltet werden. Das muss jedoch über die Apache-Konfiguration in einer Directory-Sektion erlaubt werden. Zum Beispiel mit:

<Directory /data/www/my.domain.tdl/html/>
  AllowOverride AuthConfig # oder mit dem stärkeren `AllowOverride All`
</Directory>

Anwendung

<Location />
  <RequireAny>
     AuthType Basic
     AuthName "Geheimer Bereich"
     AuthBasicProvider file
     AuthUserFile /data/pwfile
     Require user oliver.gaida # alternativ auch: Require group grp1 ... oder Require valid-user
     # private Adresse brauchen sich nicht authentifizieren
     Require ip 192.168.0.0/16 172.16.0.0/12 10.0.0.0/8
  </RequireAny>
</Location>

Bemerkung: Innerhalb der RequireAny-Sektion genügt es, wenn eine der angegebenen Require-Direktiven erfüllt ist, damit der Zugriff erlaubt wird.

Erzeugen des Passwortfiles :

$ sudo htpasswd -c /data/pwfile oliver.gaida
New password:
Re-type new password:
Adding password for user oliver.gaida

Logfiles

Erstmal dafür sorgen dass ein paar Logfiles erstellt werden:

ansible lpic -a 'curl -s http://localhost' | grep -iP '>>|title.*apache'

und nun mit locate mal nach den logfiles suchen:

ansible lpic -b -a 'updatedb'

und nun mal nach Logfiles suchen:

WSL-000@~$ansible lpic -b -a 'locate access.log'
debian | CHANGED | rc=0 >>
/var/log/apache2/access.log
/var/log/apache2/other_vhosts_access.log

ubuntu | CHANGED | rc=0 >>
/var/log/apache2/access.log
/var/log/apache2/access.log.1
/var/log/apache2/other_vhosts_access.log

centos | FAILED | rc=1 >>
non-zero return code

suse | FAILED | rc=1 >>
non-zero return code

WSL-000@~$ansible lpic -b -a 'locate error.log'
debian | CHANGED | rc=0 >>
/var/log/apache2/error.log

ubuntu | CHANGED | rc=0 >>
/var/log/apache2/error.log
/var/log/apache2/error.log.1

centos | FAILED | rc=1 >>
non-zero return code

suse | FAILED | rc=1 >>
non-zero return code

Wo hat centos seine Logfiles? Wo liegt die Hauptkonfigurationsdatei? Das erfahren wir über apachectl -V oder httpd -V (bei centos):

[root@centos ~]# httpd -V
...
 -D HTTPD_ROOT="/etc/httpd"
...
 -D SERVER_CONFIG_FILE="conf/httpd.conf"

Der Pfad zum Konfigfile setzt sich aus HTTPD_ROOT und SERVER_CONFIG_FILE zusammen: /etc/httpd/conf/httpd.conf

Nun suchen wir nach allen Zeilen die den String log enthalten und sich auch auf die Konfiguration auswirken, also weder Leer- noch Kommentarzeilen.

[root@centos ~]# grep -i log /etc/httpd/conf/httpd.conf  | grep -vP '^(\s*|\s*#.*)$'
ErrorLog "logs/error_log"
LogLevel warn
<IfModule log_config_module>
    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>
      LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
    CustomLog "logs/access_log" combined

Aha es heißt access_log. Bei suse auch:

ansible suse,centos -b -a 'locate access_log'
centos | CHANGED | rc=0 >>
/var/log/httpd/access_log

suse | CHANGED | rc=0 >>
/var/log/apache2/access_log

ansible suse,centos -b -a 'locate error_log'
centos | CHANGED | rc=0 >>
/var/log/httpd/error_log

suse | CHANGED | rc=0 >>
/var/log/apache2/error_log

Bemerkung: Hier sehen wir auch gleich wie das Modul heißt, dass zum Setzen von Log-Formaten verwendet wird. Die einzelnen Parameter kann man hier nachlesen.

Die Direktive ErrorLog ist im apache-core implementiert. Hingegen CustomLog kommt mit dem Modul log_config mit.

Errorlog

Die Errorlog Direktive kann im Kontext der Server- und Virtualhost-Konfiguration angegeben werden.

Syntax:

ErrorLog Dateiname|syslog[:facility]

siehe https://httpd.apache.org/docs/2.4/mod/mod_log_config.html#customlog

Tuning-Einstellungen

verschaffen wir uns mal einen Überblick, wie die Hauptkonfigurationsdateien des Apache2.4 der einzelnen Distros lauten:

ansible lpic -b -a 'apachectl -V' | grep -P '>>|ROOT|CONFIG' | grep -v 'AP_TYPES_CONFIG_FILE'
debian | CHANGED | rc=0 >>
 -D HTTPD_ROOT="/etc/apache2"
 -D SERVER_CONFIG_FILE="apache2.conf"
ubuntu | CHANGED | rc=0 >>
 -D HTTPD_ROOT="/etc/apache2"
 -D SERVER_CONFIG_FILE="apache2.conf"
centos | CHANGED | rc=0 >>
 -D HTTPD_ROOT="/etc/httpd"
 -D SERVER_CONFIG_FILE="conf/httpd.conf"
suse | CHANGED | rc=0 >>
 -D HTTPD_ROOT="/srv/www"
 -D SERVER_CONFIG_FILE="/etc/apache2/httpd.conf"
Distro main-Konfigfile-Pfad (default)
CentOS /etc/httpd/conf/httpd.conf
debian, Ubuntu /etc/apache2/apache2.conf
suse /etc/apache2/httpd.conf

Mit Hilfe der Distro Facts können wir dann wieder arbeiten:

ansible lpic -b -m setup -a "filter=ansible_distribution_file_variety" | grep ansible_distribution_file_variety
        "ansible_distribution_file_variety": "Debian",
        "ansible_distribution_file_variety": "SUSE",
        "ansible_distribution_file_variety": "RedHat",
        "ansible_distribution_file_variety": "Debian",

nun mit einem geeigneten Playbook Parameter prüfen oder setzen:

Datei playbooks/check_apache2_conf.yml:

---
- name: Apache2.4 Konfigfile check
  hosts:
    - lpic
  become: yes
  vars:
    dist:
      Debian:
        config: /etc/apache2/apache2.conf
      SUSE:
        config: /etc/apache2/httpd.conf
      RedHat:
        config: /etc/httpd/conf/httpd.conf
  tasks:
    - name: show ServerName Direktive
      shell: "grep -iP '^\\s*{{ directive }}' {{ dist[ansible_distribution_file_variety].config }}" # Backslash must escaped with Backslash
      register: returned_json
    - name: Ausgabe
      debug:
        var: returned_json.stdout_lines
ansible-playbook check_apache2_conf.yml -e 'directive=\w*Server\w*'

PLAY [Apache2.4 Konfigfile check] *************************************************************************************************************************************************************************************************************************************
TASK [Gathering Facts] ************************************************************************************************************************************************************************************************************************************************ok: [debian]
ok: [centos]
ok: [suse]
ok: [ubuntu]

TASK [show ServerName Direktive] **************************************************************************************************************************************************************************************************************************************changed: [debian]
changed: [ubuntu]
changed: [centos]
fatal: [suse]: FAILED! => {"changed": true, "cmd": "grep -iP '\\s*^\\w*Server\\w*' /etc/apache2/httpd.conf", "delta": "0:00:00.015739", "end": "2019-11-24 15:29:57.319370", "msg": "non-zero return code", "rc": 1, "start": "2019-11-24 15:29:57.303631", "stderr": "", "stderr_lines": [], "stdout": "", "stdout_lines": []}

TASK [Ausgabe] ********************************************************************************************************************************************************************************************************************************************************ok: [centos] => {
    "returned_json.stdout_lines": [
        "ServerName Centos",
        "ServerRoot \"/etc/httpd\"",
        "ServerAdmin root@localhost"
    ]
}
ok: [debian] => {
    "returned_json.stdout_lines": [
        "ServerName Debian "
    ]
}
ok: [ubuntu] => {
    "returned_json.stdout_lines": [
        "ServerName Ubuntu"
    ]
}

PLAY RECAP ************************************************************************************************************************************************************************************************************************************************************centos                     : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
debian                     : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
suse                       : ok=1    changed=0    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0
ubuntu                     : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

um nun auch die included-Konfigurationsdateien mit zu durchsuchen können wir uns von apachectl helfen lassen:

apachectl  -t -D DUMP_INCLUDES
Included configuration files:
  (*) /etc/apache2/apache2.conf
    (147) /etc/apache2/mods-enabled/access_compat.load
    (147) /etc/apache2/mods-enabled/alias.load
    (147) /etc/apache2/mods-enabled/auth_basic.load
...
apachectl  -t -D DUMP_INCLUDES | sed '1 d' | sed -E 's/^\s+\([^\)]+\)\s+//g'
/etc/apache2/apache2.conf
/etc/apache2/mods-enabled/access_compat.load
/etc/apache2/mods-enabled/alias.load
/etc/apache2/mods-enabled/auth_basic.load
...
apachectl  -t -D DUMP_INCLUDES | sed '1 d' | sed -E 's/^\s+\([^\)]+\)\s+//g' |  xargs grep  -iP '^\s*Server\w*'
/etc/apache2/apache2.conf:ServerName Ubuntu
/etc/apache2/conf-enabled/security.conf:ServerTokens OS
/etc/apache2/conf-enabled/security.conf:ServerSignature On
/etc/apache2/sites-enabled/000-default.conf:    ServerAdmin webmaster@localhost

Datei playbooks/check_apache2_conf_all_includes.yml:

---
- name: Apache2.4 Konfigfile check
  hosts:
    - lpic
  become: yes
  gather_facts: no
  tasks:
    - name: show ServerName Direktive
      shell: "apachectl  -t -D DUMP_INCLUDES | sed '1 d' | sed -E 's/^\\s+\\([^\\)]+\\)\\s+//g' |  xargs grep  -iP '^\\s*{{ directive }}'" # Backslash must escaped with Backslash
      register: returned_json
    - name: Ausgabe
      debug:
        var: returned_json.stdout_lines

Mal schauen, was wir jetzt finden:

ansible-playbook playbooks/check_apache2_conf_all_includes.yml -e 'directive=\w*(Server|Spare|Child)\w*'

Leider unterstützt centos die apachectl-Parameter ` -t -D DUMP_INCLUDES nicht. Das liegt laut Bugreport [https://bz.apache.org/bugzilla/show_bug.cgi?id=59376](https://bz.apache.org/bugzilla/show_bug.cgi?id=59376) an der Apache Version, der Parameter wird erst aber Apache-Version 2.4.23 und höher unterstützt. Laut dem Bugreport kommt man hier mit dem Modul mod_info` weiter.

ok: [debian] => {
    "returned_json.stdout_lines": [
        "/etc/apache2/apache2.conf:ServerName Debian ",
        "/etc/apache2/mods-enabled/mpm_event.conf:\tStartServers\t\t\t 2",
        "/etc/apache2/mods-enabled/mpm_event.conf:\tMinSpareThreads\t\t 25",
        "/etc/apache2/mods-enabled/mpm_event.conf:\tMaxSpareThreads\t\t 75",
        "/etc/apache2/mods-enabled/mpm_event.conf:\tThreadsPerChild\t\t 25",
        "/etc/apache2/mods-enabled/mpm_event.conf:\tMaxConnectionsPerChild   0",
        "/etc/apache2/conf-enabled/security.conf:ServerTokens OS",
        "/etc/apache2/conf-enabled/security.conf:ServerSignature On",
        "/etc/apache2/sites-enabled/000-default.conf:\tServerAdmin webmaster@localhost"
    ]
}
ok: [suse] => {
    "returned_json.stdout_lines": [
        "/etc/apache2/sysconfig.d/global.conf:ServerSignature off",
        "/etc/apache2/sysconfig.d/global.conf:ServerTokens ProductOnly",
        "/etc/apache2/server-tuning.conf:\tStartServers         5",
        "/etc/apache2/server-tuning.conf:\tMinSpareServers      5",
        "/etc/apache2/server-tuning.conf:\tMaxSpareServers     10",
        "/etc/apache2/server-tuning.conf:\tServerLimit        150",
        "/etc/apache2/server-tuning.conf:\tMaxRequestsPerChild  10000",
        "/etc/apache2/server-tuning.conf:\tStartServers         3",
        "/etc/apache2/server-tuning.conf:\tMinSpareThreads     25",
        "/etc/apache2/server-tuning.conf:\tMaxSpareThreads     75 ",
        "/etc/apache2/server-tuning.conf:\tThreadsPerChild     25",
        "/etc/apache2/server-tuning.conf:\tMaxRequestsPerChild  10000"
    ]
}
ok: [ubuntu] => {
    "returned_json.stdout_lines": [
        "/etc/apache2/apache2.conf:ServerName Ubuntu",
        "/etc/apache2/mods-enabled/mpm_event.conf:\tStartServers\t\t\t 2",
        "/etc/apache2/mods-enabled/mpm_event.conf:\tMinSpareThreads\t\t 25",
        "/etc/apache2/mods-enabled/mpm_event.conf:\tMaxSpareThreads\t\t 75",
        "/etc/apache2/mods-enabled/mpm_event.conf:\tThreadsPerChild\t\t 25",
        "/etc/apache2/mods-enabled/mpm_event.conf:\tMaxConnectionsPerChild   0",
        "/etc/apache2/conf-enabled/security.conf:ServerTokens OS",
        "/etc/apache2/conf-enabled/security.conf:ServerSignature On",
        "/etc/apache2/sites-enabled/000-default.conf:\tServerAdmin webmaster@localhost"
    ]
}

Wichtige Parameter:

Direktive Bedeutung (d = default) Module
ServerLimit Obergrenze für die konfigurierbare Anzahl von Prozessen leader, perchild, prefork, threadpool, worker
StartServers Anzahl der Kindprozesse des Servers, die beim Start erstellt werden (d-worker und d-event: 3, d-prefork: 5) leader, mpmt_os2, prefork, threadpool, worker
ThreadLimit Bestimmt die Obergrenze der konfigurierbaren Anzahl von Threads pro Kindprozess (d: 1920) leader, mpm_winnt, perchild, threadpool, worker
ThreadsPerChild Anzahl der Threads, die mit jedem Kindprozess gestartet werden (d: 64) leader, mpm_winnt, threadpool, worker
MaxConnectionsPerChild Maximale Anzahl der Verbindungen die ein Kind-Prozess während seiner Existens verwalten kann (d: 0 = unbegrenzt) event, worker, prefork, mpm_winnt, mpm_netware, mpmt_os2
MaxRequestsPerChild (alter Name für MaxConnectionsPerChild, wird noch unterstützt) event, worker, prefork, mpm_winnt, mpm_netware, mpmt_os2
MinSpareThreads Minimale Anzahl von Leerlauf-Threads, die vorgehalten werden, um Anfragen zu beantworten. (d: 75) event, worker, mpm_netware, mpmt_os2
MaxSpareThreads Maximale Anzahl von Leerlauf-Threads, die vorgehalten werden, um Anfragen zu beantworten. (d: 250) event, worker, mpm_netware, mpmt_os2
MinSpareServers Minimale Anzahl von Leerlauf-Prozessen (d: 5) prefork
MaxSpareServers Maximale Anzahl von Leerlauf-Prozessen (d: 10) prefork

die VirtualHost Direktive

siehe https://httpd.apache.org/docs/2.4/en/mod/core.html#virtualhost

Will man mehr als eine Domain unter einem Apache-Webserver hosten, so benötigt man diese Direktive mit der man eine Sektion kennzeichnet. In dieser Sektion werden Einstellungen der betreffenden Domain (ServerName) getroffen.

Syntax:

<VirtualHost addr[:port] [addr[:port]] ...>
...
</VirtualHost>

addr kann folgende Werte haben:

Definitionen ohne Platzhalter haben eine höhere Priorität. Wenn kein _default_ definiert wurde und eine Anfrage hineinkommt, für die keine Definition zutrifft, so wird die erste VirtualHost Konfiguration der angefragten IP-Adresse als default-Host verwendet.

Achtung: IPv6 Adressen müssen in eckige Klammern eingeschlossen werden, damit der Port von der IPv6-Adresse abgegrenzt ist:

<VirtualHost [2001:db8::a00:20ff:fea7:ccea]:80>

Eine gewöhnlich VirtualHost Konfiguration kann wie folgt aussehen:

<VirtualHost 10.1.2.3:80>
  ServerAdmin webmaster@host.example.com
  DocumentRoot "/www/docs/host.example.com"
  ServerName host.example.com
  ErrorLog "logs/host.example.com-error_log"
  TransferLog "logs/host.example.com-access_log"
</VirtualHost>

Redirects

siehe https://httpd.apache.org/docs/2.4/en/mod/mod_alias.html#redirect

Sendet eine externe Umleitung, in der der Client aufgefordert wird, eine andere URL abzurufen.

Module: mod_alias

Syntax:

Redirect [status] [URL-path] URL

Kontext: server config, virtual host, directory, .htaccess

Status kann folgende Werte annehmen:

Status Bedeutung
permanent Gibt einen permanenten Weiterleitungsstatus (301) zurück, der angibt, dass die Ressource permanent verschoben wurde.
temp (DEFAULT) Gibt einen temporären Weiterleitungsstatus zurück (302). Dies ist die Standardeinstellung.
seeother Gibt den Status “Andere anzeigen” (303) zurück, der angibt, dass die Ressource ersetzt wurde.
gone Gibt einen “Gone” -Status (410) zurück, der angibt, dass die Ressource dauerhaft entfernt wurde. Wenn dieser Status verwendet wird, sollte das URL-Argument weggelassen werden.

HOME