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:
- Apache-2.4-Konfigurationsdateien, Begriffe und Hilfsprogramme
- Konfiguration und Inhalt von Apache-Protokolldateien
- Methoden und Dateien zur Zugriffsbeschränkung
- Konfiguration von mod_perl und PHP
- Dateien und Hilfsprogramme für die Benutzerauthentisierung von Clients
- Konfiguration der Maximalzugriffe und Minimal- und Maximalanzahl von Servern und Clients
- Einrichtung virtueller Hosts mit Apache 2.4 (mit und ohne eigene IP-Adressen)
- Verwendung von Redirect-Direktiven in den Apache-Konfigurationsdateien für spezialisierten Dateizugriff
Dies ist eine auszugsweise Liste der verwendeten Dateien, Begriffe und Hilfsprogramme:
- Zugriffs- und Fehlerprotokolle
- .htaccess
- httpd.conf
- mod_auth_basic, mod_authz_host und mod_access_compat
- htpasswd
- AuthUserFile, AuthGroupFile
- apachectl, apache2ctl
- httpd, apache2
Vorbereitung
Installation des Apache 2.4
- Apache2.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:
- prefork
- worker
- event
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
MinSpareServers
Minimale Anzahl der unbeschäftigten Kindprozesse des Servers. siehe auch https://httpd.apache.org/docs/2.4/mod/prefork.html#minspareservers
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)
- Create/overwrite htpasswd file:
htpasswd -c path/to/file user_name
- Add user to htpasswd file or update existing user:
htpasswd path/to/file user_name
- Add user to htpasswd file in batch mode without an interactive password prompt (for script usage):
htpasswd -b path/to/file user_name password
- Delete user from htpasswd file:
htpasswd -D path/to/file user_name
- Verify user password:
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.
Require ip
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
Require host
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
Require forward-dns
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
Require local
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:
- IP-Adresse
- FQDN, nicht empfohlen
*
-Zeichen als Platzhalter für sämtliche IP-Adressen- die Zeichenkette
_default_
welche ein Alias für*
ist
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. |