Apache
Installation und Hinweise
- Installation
YAST: Filter / Paketkategorien / Einfacher Webserver mit Apache2
Damit werden alle benötigten Module automatisch installiert und konfiguriert.
- Konfiguration
Nicht mit YAST und nicht mit Webmin konfigurieren. Es entsteht ein Durcheinander, besonders was die Konfiguration der virtuellen Server betrifft.
Die zentrale Konfigurationsdatei ist zwar /etc/apache2/httpd.conf
, man soll aber eigene Anpassungen in der Datei /etc/apache2/httpd.conf.local
durchführen. Dann bleiben die Änderungen auch nach Updates erhalten.
Achtung:
- Damit
/etc/apache2/httpd.conf.local
eingebunden wird, muss in/etc/sysconfig/apache2
folgende Zeile eingetragen werden:
APACHE_CONF_INCLUDE_FILES="/etc/apache2/httpd.conf.local"
Authentifizierung über LDAP
- Apache Module mod_ldap und mod_authnz_ldap laden
Die Module brauchen nicht installiert werden, sie sind schon vorhanden.
In der Datei /etc/sysconfig/apache2
muss der Aufruf dieser Module eingetragen werden.
# /etc/sysconfig/apache2 APACHE_MODULES=" ... ldap authnz_ldap ... "
- Überprüfung
Nach Neustart des Apache2 Servers stehen die geladenen Module in der Datei /etc/apache2/sysconfig.d/loadmodule.conf
- Zugriffschutz definieren für ein Verzeichnis
Beispiele:
Zugriff für User aus der Gruppe hs_lehrer:
<Directory /srv/www/htdocs/divers> AuthType Basic AuthBasicProvider ldap AuthzLDAPAuthoritative on AuthName "Zugriff nur fuer Lehrerinnen und Lehrer" AuthLDAPURL "ldap://localhost:389/ou=Users,dc=network?uid" Require ldap-group cn=hs_lehrer,ou=Groups,dc=network Require ldap-attribute gidNumber=601 Require valid-user </Directory>
Zugriff für bestimmte User:
<Directory /srv/www/htdocs/dokuwiki> AuthType Basic AuthBasicProvider ldap AuthzLDAPAuthoritative on AuthName "IT Dokumentation HS Irgendwo" Require ldap-user grfe nedo kibe eifr AuthLDAPURL "ldap://localhost:389/ou=Users,dc=network?uid"
</Directory>
- Howto
Apache authentication and authorization using LDAP
Andere Konfigurationseinstellungen
Zugriff für Localhost
Allow from 127.0.0.0/255.0.0.0 ::1/128
Modul mod_userdir
Dadurch ist Zugriff auf die Webseiten der Benutzer möglich. Diese müssen sich im Homeverzeichnis unter public_html befinden. Die URL lautet dann z.B. für den Benuter hs_user: http://hs-irgendwo.at/~hs_user
Include /etc/apache2/mod_userdir.conf
Achtung: Falls virtuelle Server konfiguriert werden, so erfolgt die Einbindung von Userdir in der entsprechenden Konfigurationsdatei des betreffenden Virtuellen Servers:
# /etc/apache2/vhosts.d/hs-irgendwo.at.conf # ... <IfModule mod_userdir.c> UserDir public_html Include /etc/apache2/mod_userdir.conf </IfModule>
- Andere Einstellungen
RedirectMatch Permanent ^(.+)/favicon\.ico$ http://server.de/favicon.ico
#Disable HTTP TRACE / TRACK Methods (Cross-Site Tracing) TraceEnable off
Verzeichnisindex
Definition einer HEADER.html für Anzeige von Verzeichnissen durch Änderung in der Datei /etc/apache2/mod_autoindex-defaults.conf
.
HeaderName /HEADER.html
In der Datei /srv/www/htdocs/HEADER.html
wird die Kodierung der Anzeige mit UTF-8 vorgegeben:
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
Softlinks folgen
In der Datei
/etc/apache2/default-server.conf
DocumentRoot konfigurieren:
Options FollowSymlinks
Standard Dateiberechtigungen
# /etc/sysconfig/apache2 umask 0002
Siehe https://stackoverflow.com/questions/428416/setting-the-umask-of-the-apache-user
Apache Modul hinzufügen
- Eintrag in Konfiguration
Beispiel: Laden des Moduls php7 anstatt php5
pico /etc/sysconfig/apache2
APACHE_MODULES="authz_host actions alias auth_basic ssl php7 perl authn_core ..."
Weitere Informationen: http://enarion.net/web/apache/htaccess/mod_rewrite-on-suse/ am Beispiel mod_rewrite
Zugriffschutz
Zugriffschutz zentral konfigurieren
Änderungen an der Konfiguration werden in /etc/apache2/default-server.conf
geschrieben.
<Directory /srv/www/htdocs/dokuwiki> AuthType Basic AuthName "IT Dokumentation HS Irgendwo" AuthUserFile /srv/www/.authpass Require user root grfe nedo kibe eifr </Directory> <Directory /srv/www/htdocs/Lehrer> AuthType Basic AuthName "Lehrerbereich HS Irgendwo" AuthUserFile /srv/www/.authpass Require valid-user </Directory> <Directory /srv/www/htdocs/phpMyAdmin/libraries> AuthType Basic AuthName "phpMyAdmin" AuthUserFile /srv/www/.authpass Require user root grfe </Directory> <Directory /srv/www/htdocs/divers> AuthType Basic AuthName "Zugriffschutz Test" AuthUserFile /srv/www/htdocs/divers/.htpasswd Require valid-user </Directory>
Passwortdatei generieren
Passwortdatei: /srv/www/.authpass
Folgendes Shellscript kopiert die Lehrerpasswörter in obige Datei
# /usr/local/bin/htpasswd.sh for UserName in `grep 601 /etc/passwd | cut -d ":" -f 1` ; do grep $UserName: /etc/shadow | cut -d ":" -f 1,2 >> /srv/www/.authpass done
Passwortdatei über Kommandozeile
- Neue Passwortdatei erzeugen
htpasswd -c .htpasswd username # oder htpasswd2 -c .htpasswd username
- Weitere Benutzer hinzufügen
htpasswd .htpasswd username # oder htpasswd2 .htpasswd username
Anmerkung: Es waren zwei Konfigurationsänderungen nötig, um dies zu ermöglichen:
- Erstellung eines Softlinks /usr/sbin/htpasswd, der auf /usr/sbin/htpasswd2 verweist.
- Erstellung eines weiteren Softlinks /usr/bin/htpasswd, der auch auf /usr/sbin/htpasswd2 verweist.
- Setzen des SETUID Bits für die Datei /usr/sbin/htpasswd2
chmod u+s /usr/sbin/htpasswd2
Tool zum Erzeugen einer Passwortdatei für User
Mit dem Tool /vorlagen/HTML/phpaccess.php bzw. V:\HTML\phpaccess.php kann jeder User am Server seine persönliche Passwortdatei erzeugen.
Einfach diese Datei in das zu schützende Verzeichnis unterhalb von ~/public_html kopieren. Dieses Programm erzeugt sowohl die Datei .htaccess als auch die Passwortdatei .htpasswd.
- Benutzername: admin
- Passwort: admin
Benutzername und Passwort für den Administrator der zu schützenden Website sind in der Datei phpaccess.php gespeichert und sollten natürlich geändert werden.
PHP Konfiguration
Siehe Artikel: PHP
Virtuelle Server
Server für virtuelle Hosts konfigurieren
Folgende Zeilen in /etc/apache2/httpd.conf
oder in /etc/apache2/httpd.conf
einfügen:
NameVirtualHost * Include /etc/apache2/vhosts.d/*.conf
Damit wird der Webserver für namensbasierte virtuelle Hosts konfiguriert.
Virtuelle Hosts konfigurieren
Im Verzeichnis /etc/apache2/vhosts.d
braucht man für jeden virtuellen Server eine Konfigurationsdatei.
# Beispiel für eine Konfigurationsdatei eines virtuellen Hosts: # Dateiname: project.conf <VirtualHost *:80> ServerName project.gruber DocumentRoot /srv/www/htdocs/project # RewriteEngine On # RewriteCond %{HTTPS} !=on # RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] <Directory "/srv/www/htdocs/project"> Options FollowSymLinks AllowOverride All Require all granted </Directory> <Location /> Options FollowSymLinks AllowOverride None </Location> </VirtualHost> <VirtualHost *:443> ServerName project.gruber DocumentRoot /srv/www/htdocs/project SSLEngine on SSLCertificateFile /etc/apache2/ssl.crt/server.crt SSLCertificateKeyFile /etc/apache2/ssl.key/server.key <Directory "/srv/www/htdocs/project"> Options FollowSymLinks AllowOverride All Require all granted </Directory> <Location /> Options FollowSymLinks AllowOverride None </Location> </VirtualHost>
Namensauflösung
Für die Namensauflösung von Internet Domains sind diverse DNS Server zuständig. Betreibt man virtuelle Hosts aber auf einem Server im LAN bzw. auf einem Testrechner, muss man selber dafür sorgen, dass der jeweilige Hostname einer IP Adresse zugeordnet wird.
- Man kann die Zuordnungen in die Datei /etc/hosts eintragen:
# Beispiel für virtuelle Hosts auf dem lokalen Rechner 127.0.0.1 contao.localdomain contao 127.0.0.1 project.localdomain project ...
Für mich hat diese Lösung auf meinem Testrechner jedenfalls funktioniert.
Virtuelle Hosts für Systembenutzer bereitstellen
Die UserDir Konfiguration erfolgt innerhalb eines virtuellen Hosts.
- Auch der Standardserver muss als virtueller Host konfiguriert werden, in unserem Fall ist das die Datei
hs-irgendwo.at.conf
# hs-irgendwo.at.conf <VirtualHost *> DocumentRoot /srv/www/htdocs <Directory "/srv/www/htdocs"> allow from all Options +Indexes </Directory> ServerName hs-irgendwo.at DirectoryIndex index.html index.php HeaderName /HEADER.html </VirtualHost> <IfModule mod_userdir.c> UserDir public_html Include /etc/apache2/mod_userdir.conf </IfModule>
- Standardzeichensatz setzen
AddDefaultCharset utf-8
SSL
Konfiguration
Falls notwendig, das Modul mod_ssl aktivieren
a2enmod ssl
Dieser Befehl ergänzt die Variable $APACHE_MODULES in der Datei /etc/sysconfig/apache2
um den Eintrag "ssl"
# /etc/sysconfig/apache2 APACHE_TIMEOUT="30"
... damit genug Zeit bleibt für Eingabe der Passphrase beim Starten des Apache, falls Server Key durch Passphrase geschützt ist.
# /etc/apache2/listen.conf Listen 80 Listen 443
# /etc/apache2/default_server.conf NameVirtualHost *:80 NameVirtualHost *:443
SSL Zertifikat erstellen
Die folgenden Anweisungen sind der Seite http://wiki.ubuntuusers.de/Apache/SSL entnommen. Ich habe die Pfade an die Suse Konfiguration angepasst.
Privaten Schlüssel erzeugen
openssl genrsa -out /etc/ssl/private/myserver.key 2048
Zertifikat erstellen
Dieser Befehl erstellt ein selbst signiertes Zertifikat.
openssl req -new -x509 -key /etc/ssl/private/apache.key -days 365 -sha256 -out /etc/ssl/certs/apache.crt
- Zertifikat verteilen an Benutzer
Da das Zertifikat nicht von einer beglaubigten Stelle verifiziert ist, soll folgende Datei an die Benutzer ausgehändigt werden:
/etc/apache2/ssl.crt/ca.crt
- Import des Zertifikats in den Webbrowser
Damit beim Herstellen einer verschlüsselten Verbindung nicht die Warnung vor einem ungültigen Zertifikat erscheint, sollte diese Datei in den Webbrowser importiert werden. Siehe: http://wiki.fernuni-hagen.de/helpdesk/index.php/Zertifikat_importieren
SSL Zertifikate über Letsencrypt
Siehe Letsencrypt
DocumentRoot einbinden
Probleme mit Zugriff auf die DocumentRoot /srv/www/htdocs
lösen durch Einbinden einer neuen DocumentRoot über Bind Mounts in der /etc/fstab
/suse_old/srv /srv none bind 0 0
Troubles
Verzeichnis für icons
In der DocumentRoot soll sich kein Ordner mit dem Namen icons befinden.
- Es existiert im Apache ein Alias icons, der auf einen Ordner zeigt, welcher die Icons für die Indexdarstellung des Apache Servers enthält. Erstellt man einen eigenen Ordner mit dem Namen icons in der DocumentRoot, so wird dessen Inhalt im Browser nicht angezeigt sondern man bekommt den Inhalt des erwähnten Alias zu sehen.
Lösung: Ich habe meine eigenen Icons, die ich in verschiedenen PHP Projekten brauche, in include/icons
abgelegt. Auf diesen Ordner verweist ein Symlink:
cd /srv/www/htdocs/virtualhost ln -s include/icons myicons
Dieser Symlink muss in der DocumentRoot jedes virtuellen Hosts angelegt werden.
Cannot define multiple Listeners on the same IP:port
Listen 80 Listen 443
Diese Directiven dürfen nur einmal definiert sein.
- In
/etc/apache2/listen.conf
oder in/etc/apache2/default_server.conf
Ich habe diese Einträge aus /etc/apache2/default_server.conf
entfernt.
Siehe mein Posting https://serversupportforum.de/forum/webserver/61206-cannot-define-multiple-listeners-same-ip-port.html