logrotate Konfiguration Apache2

Diese Konfiguration nutze ich für Apache2 VirtualHosts. Dabei liegen die von Apache angelegten Logfiles unter „/var/log/apache2/<vhostName>/“. Die Konfiguration des Speicherortes passiert in der VirtualHost-Konfiguration.

/var/log/apache2/<vhostName>/*.log {
       weekly
       missingok
       rotate 52
       compress
       dateext
       notifempty
       create 640 root adm
       olddir /var/log/apache2/<vhostName>/old/
}

Die Konfiguration sollte vor dem ersten Einsatz getestet werden:

logrotate -d /etc/logrotate.d/<ConfigDatei>

Dabei kommt dann in etwa so etwas heraus:

reading config file /etc/logrotate.d/<ConfigDatei>
reading config info for /var/log/apache2/<vhostName>/*.log
olddir is now /var/log/apache2/<vhostName>/old/

Handling 1 logs

rotating pattern: /var/log/apache2/<vhostName>/*.log  weekly (52 rotations)
olddir is /var/log/apache2/<vhostName>/old/, empty log files are not rotated, old logs are removed
considering log /var/log/apache2/<vhostName>/access.log
  log does not need rotating
considering log /var/log/apache2/<vhostName>/error.log
  log does not need rotating

logrotate Konfiguration iptables

Diese Konfiguration nutze ich für iptables. Dabei liegen die angelegten Logfiles unter „/var/log/iptables/“. Die Konfiguration des Speicherortes passiert in der iptables-Konfiguration.

/var/log/iptables/*.log {
       daily
       missingok
       rotate 90
       compress
       dateext
       notifempty
       create 640 root adm
       olddir /var/log/iptables/old/
}

Das Verzeichnis für die alten Logs muss manuell angelegt werden.

Zur Überprüfung der Konfiguration sollte man diese testen:

/usr/sbin/logrotate -d /etc/logrotate.d/iptables

Dann müsste ungefähr folgendes erscheinen:

/usr/sbin/logrotate -d /etc/logrotate.d/iptables
reading config file /etc/logrotate.d/iptables
reading config info for /var/log/iptables/*.log
olddir is now /var/log/iptables/old/

Handling 1 logs

rotating pattern: /var/log/iptables/*.log  after 1 days (90 rotations)
olddir is /var/log/iptables/old/, empty log files are not rotated, old logs are removed
considering log /var/log/iptables/accept.log
  log does not need rotating
considering log /var/log/iptables/drop.log
  log does not need rotating

 

read

Zeilenweise Möglichkeiten

Wenn man Informationen interaktiv vom Benutzer oder zeilenweise aus Dateien benötigt, kann auf das Programm read zurückgreifen. Zusätzlich kann man über einen angegebenen Separator auf einzelne Felder in einer Zeile zurückgreifen. Dazu habe ich hier merkenswerte Mehrzeiler aufgeschrieben.

Linux Benutzer für SQL-Import vorbereiten

#!/bin/bash
# exportUser2SQL.sh
# Exportiert alle User aus der /etc/passwd in ein SQL-Dump-File
#
rm ~/insertIntoUsers.sql
while IFS=':' read uid password uidNumber gidNumber gecos home shell; do
        echo "INSERT INTO users values ('$uid','x',$uidNumber,$gidNumber,'$gecos','$home','$shell');" >> ~/insertIntoUsers.sql;
done < /etc/passwd
-- insertIntoUsers.sql
INSERT INTO users VALUES ('root','x',0,0,'root','/root','/bin/bash');
INSERT INTO users VALUES ('bin','x',1,1,'bin','/bin','/sbin/nologin');
INSERT INTO users VALUES ('daemon','x',2,2,'daemon','/sbin','/sbin/nologin');
INSERT INTO users VALUES ('adm','x',3,4,'adm','/var/adm','/sbin/nologin');
INSERT INTO users VALUES ('lp','x',4,7,'lp','/var/spool/lpd','/sbin/nologin');
INSERT INTO users VALUES ('sync','x',5,0,'sync','/sbin','/bin/sync');
INSERT INTO users VALUES ('shutdown','x',6,0,'shutdown','/sbin','/sbin/shutdown');
INSERT INTO users VALUES ('halt','x',7,0,'halt','/sbin','/sbin/halt');
INSERT INTO users VALUES ('mail','x',8,12,'mail','/var/spool/mail','/sbin/nologin');
INSERT INTO users VALUES ('news','x',9,13,'news','/etc/news','');
INSERT INTO users VALUES ('uucp','x',10,14,'uucp','/var/spool/uucp','/sbin/nologin');
INSERT INTO users VALUES ('operator','x',11,0,'operator','/root','/sbin/nologin');
INSERT INTO users VALUES ('games','x',12,100,'games','/usr/games','/sbin/nologin');
INSERT INTO users VALUES ('gopher','x',13,30,'gopher','/var/gopher','/sbin/nologin');
INSERT INTO users VALUES ('ftp','x',14,50,'FTP User','/var/ftp','/sbin/nologin');
INSERT INTO users VALUES ('nobody','x',99,99,'Nobody','/','/sbin/nologin');
INSERT INTO users VALUES ('nscd','x',28,28,'NSCD Daemon','/','/sbin/nologin');
INSERT INTO users VALUES ('vcsa','x',69,69,'virtual console memory owner','/dev','/sbin/nologin');
INSERT INTO users VALUES ('pcap','x',77,77,'','/var/arpwatch','/sbin/nologin');
INSERT INTO users VALUES ('dbus','x',81,81,'System message bus','/','/sbin/nologin');
INSERT INTO users VALUES ('rpc','x',32,32,'Portmapper RPC user','/','/sbin/nologin');
INSERT INTO users VALUES ('mailnull','x',47,47,'','/var/spool/mqueue','/sbin/nologin');
INSERT INTO users VALUES ('smmsp','x',51,51,'','/var/spool/mqueue','/sbin/nologin');
INSERT INTO users VALUES ('sshd','x',74,74,'Privilege-separated SSH','/var/empty/sshd','/sbin/nologin');
INSERT INTO users VALUES ('rpcuser','x',29,29,'RPC Service User','/var/lib/nfs','/sbin/nologin');
INSERT INTO users VALUES ('nfsnobody','x',65534,65534,'Anonymous NFS User','/var/lib/nfs','/sbin/nologin');
INSERT INTO users VALUES ('haldaemon','x',68,68,'HAL daemon','/','/sbin/nologin');
INSERT INTO users VALUES ('avahi-autoipd','x',100,102,'avahi-autoipd','/var/lib/avahi-autoipd','/sbin/nologin');
INSERT INTO users VALUES ('ntp','x',38,38,'','/etc/ntp','/sbin/nologin');
INSERT INTO users VALUES ('avahi','x',70,70,'Avahi daemon','/','/sbin/nologin');
INSERT INTO users VALUES ('apache','x',48,48,'Apache','/var/www','/sbin/nologin');
INSERT INTO users VALUES ('hsqldb','x',96,96,'','/var/lib/hsqldb','/sbin/nologin');
INSERT INTO users VALUES ('xfs','x',43,43,'X Font Server','/etc/X11/fs','/sbin/nologin');
INSERT INTO users VALUES ('gdm','x',42,42,'','/var/gdm','/sbin/nologin');

Linux Gruppen für SQL-Import vorbereiten

#!/bin/bash
# exportGroupMember2SQL.sh
# Wer die Informationen aus den Linux-Gruppen in einer Datenbank
# benötigt, kann sich diese einfach als INSERT-Statements vorbereiten:
rm ~/insertIntoGroups.sql
rm ~/insertIntoMembers.sql
while IFS=':' read gid password gidNumber members; do
        echo "INSERT INTO groups values ('$gid','$password',$gidNumber);" >> ~/insertIntoGroups.sql;
        # Kommas durch Leerzeichen ersetzen, damit FOR-Schleife genutzt werden kann.
        grpmembers=$(echo $members | tr ',' ' ')
        for member in $grpmembers; do
                echo "INSERT INTO members values($gidNumber,'$member');" >> ~/insertIntoMembers.sql;
        done
done < /etc/group
-- insertIntoGroups.sql
INSERT INTO groups VALUES ('root','x',0);
INSERT INTO groups VALUES ('bin','x',1);
INSERT INTO groups VALUES ('daemon','x',2);
INSERT INTO groups VALUES ('sys','x',3);
INSERT INTO groups VALUES ('adm','x',4);
INSERT INTO groups VALUES ('tty','x',5);
INSERT INTO groups VALUES ('disk','x',6);
INSERT INTO groups VALUES ('lp','x',7);
INSERT INTO groups VALUES ('mem','x',8);
INSERT INTO groups VALUES ('kmem','x',9);
INSERT INTO groups VALUES ('wheel','x',10);
INSERT INTO groups VALUES ('mail','x',12);
INSERT INTO groups VALUES ('news','x',13);
INSERT INTO groups VALUES ('uucp','x',14);
INSERT INTO groups VALUES ('man','x',15);
INSERT INTO groups VALUES ('games','x',20);
INSERT INTO groups VALUES ('gopher','x',30);
INSERT INTO groups VALUES ('dip','x',40);
INSERT INTO groups VALUES ('ftp','x',50);
INSERT INTO groups VALUES ('lock','x',54);
INSERT INTO groups VALUES ('nobody','x',99);
INSERT INTO groups VALUES ('users','x',100);
INSERT INTO groups VALUES ('nscd','x',28);
INSERT INTO groups VALUES ('utmp','x',22);
INSERT INTO groups VALUES ('utempter','x',35);
INSERT INTO groups VALUES ('floppy','x',19);
INSERT INTO groups VALUES ('vcsa','x',69);
INSERT INTO groups VALUES ('pcap','x',77);
INSERT INTO groups VALUES ('slocate','x',21);
INSERT INTO groups VALUES ('dbus','x',81);
INSERT INTO groups VALUES ('audio','x',63);
INSERT INTO groups VALUES ('rpc','x',32);
INSERT INTO groups VALUES ('mailnull','x',47);
INSERT INTO groups VALUES ('smmsp','x',51);
INSERT INTO groups VALUES ('sshd','x',74);
INSERT INTO groups VALUES ('ecryptfs','x',101);
INSERT INTO groups VALUES ('rpcuser','x',29);
INSERT INTO groups VALUES ('nfsnobody','x',65534);
INSERT INTO groups VALUES ('haldaemon','x',68);
INSERT INTO groups VALUES ('avahi-autoipd','x',102);
INSERT INTO groups VALUES ('ntp','x',38);
INSERT INTO groups VALUES ('avahi','x',70);
INSERT INTO groups VALUES ('apache','x',48);
INSERT INTO groups VALUES ('hsqldb','x',96);
INSERT INTO groups VALUES ('xfs','x',43);
INSERT INTO groups VALUES ('gdm','x',42);
-- insertIntoMembers.sql
INSERT INTO members VALUES(0,'root');
INSERT INTO members VALUES(1,'root');
INSERT INTO members VALUES(1,'bin');
INSERT INTO members VALUES(1,'daemon');
INSERT INTO members VALUES(2,'root');
INSERT INTO members VALUES(2,'bin');
INSERT INTO members VALUES(2,'daemon');
INSERT INTO members VALUES(3,'root');
INSERT INTO members VALUES(3,'bin');
INSERT INTO members VALUES(3,'adm');
INSERT INTO members VALUES(4,'root');
INSERT INTO members VALUES(4,'adm');
INSERT INTO members VALUES(4,'daemon');
INSERT INTO members VALUES(6,'root');
INSERT INTO members VALUES(7,'daemon');
INSERT INTO members VALUES(7,'lp');
INSERT INTO members VALUES(10,'root');
INSERT INTO members VALUES(12,'mail');
INSERT INTO members VALUES(13,'news');
INSERT INTO members VALUES(14,'uucp');
INSERT INTO members VALUES(63,'gdm');

LVM einrichten

Benötigte Pakete

Wenn noch nicht vorhanden, muss lvm installiert werden:

aptitude install lvm2

Wie ihr ein Logical Volume nachträglich verkleinert, könnt ihr hier nachlesen.

Logical Volume hinzufügen

Ich beschreibe hier das nachträgliche Hinzufügen einer lvm-Partition für den Ordner /var/backups unter Debian Squeeze, um eine bereits vorhandene volle Festplatte zu entlasten.

Ausgangslage

Eine Ausgabe von fdisk -l und df -h schafft einen Überblick über die Ausgangslage

root# fdisk -l

Disk /dev/sda: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00081015

Device Boot Start End Blocks Id System
/dev/sda1 * 1 993 7976241 83 Linux
/dev/sda2 994 1044 409657+ 5 Extended
/dev/sda5 994 1044 409626 82 Linux swap / Solaris

Disk /dev/sdb: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x380b6e17

Device Boot Start End Blocks Id System
/dev/sdb1 1 1044 8385898+ 8e Linux LVM


Disk /dev/sdc: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xfeb5b445

Device Boot Start End Blocks Id System
/dev/sdc1 1 1305 10482381 8e Linux LVM
root# df -h
Dateisystem Size Used Avail Use% Eingehängt auf
/dev/sda1 7,5G 5,5G 1,7G 78% /
tmpfs 506M 0 506M 0% /lib/init/rw
udev 501M 104K 501M 1% /dev
tmpfs 506M 0 506M 0% /dev/shm

Wie zu erkennen ist, ist die einzig vorhandene Partion schon recht voll, so dass ich diese, durch Auslagern des Orderns /var/backups entlasten will. Zudem sind bereits zwei Festplatten zu sehen, auf den jeweils eine primäre Partition mit lvm als Partitionierungssystem eingerichtet sind.

PV, VG und LV einrichten…

…bedeutet nix anderes, als eine Partition für lvm zu aktivieren (Physical Volume erstellen).

root# pvcreate /dev/sdc1
Physical volume "/dev/sdc1" successfully created

Darauf wird dann eine Volume Group eingerichtet, die als Pool mehrere Physical Volumes aufnehmen kann. So kann man z.B. mehrere Festplatten innerhalb einer Volume Group verwenden. Hier sollte ein nicht all zu langer Name vergeben werden.

root# # vgcreate vg1 /dev/sdc1
Volume group "vg1" successfully created

Mit vgdisplay kann man sich dann die Einzelheiten zu der gerade eingerichteten Volume Group anschauen. Interessant ist dabei der Wert „Free PE“, der die Physikalischen Einheiten angibt, die noch für Logical Volumes zur Verfügung stehen.

# vgdisplay
--- Volume group ---
VG Name vg1
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 3
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 0
Open LV 0
Max PV 0
Cur PV 1
Act PV 1
VG Size 10,00 GiB
PE Size 4,00 MiB
Total PE 2559
Alloc PE / Size 0 / 0
Free PE / Size 2559 / 10,00 GiB
VG UUID GcAW6r-L2Lp-DCkA-k3P3-al0Q-kCRf-5UXYFu

Danach erstelle ich noch ein Logical Volume (LV) mit der maximalen Anzahl (2559) von freien Physikalischen Einheiten (siehe oben). Würde man hier beim erstellen die angezeigten 10G angeben, bekäme man eine Fehlermeldung, dass nicht genügend freier Speicherplatz in der Volume Group vorhanden ist.

# lvcreate -l 2559 -n backups vg1
Logical volume "backup" created

Dateisystem einrichten

Jetzt muss das Dateisystem auf der neuen Partition noch eingerichtet werden. Ich wähle dazu hier ext3.

root# mkfs.ext3 /dev/vg1/backups
mke2fs 1.41.12 (17-May-2010)
Dateisystem-Label=
OS-Typ: Linux
Blockgröße=4096 (log=2)
Fragmentgröße=4096 (log=2)
Stride=0 Blöcke, Stripebreite=0 Blöcke
655360 Inodes, 2620416 Blöcke
131020 Blöcke (5.00%) reserviert für den Superuser
Erster Datenblock=0
Maximale Dateisystem-Blöcke=2684354560
80 Blockgruppen
32768 Blöcke pro Gruppe, 32768 Fragmente pro Gruppe
8192 Inodes pro Gruppe
Superblock-Sicherungskopien gespeichert in den Blöcken:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632

Schreibe Inode-Tabellen: erledigt
Erstelle Journal (32768 Blöcke): erledigt
Schreibe Superblöcke und Dateisystem-Accountinginformationen: erledigt

Das Dateisystem wird automatisch nach jeweils 31 Einhäng-Vorgängen bzw.
alle 180 Tage überprüft, je nachdem, was zuerst eintritt. Dies kann durch
tune2fs -c oder -i geändert werden.

Mounten und Datenübernahme

Zuerst muss die erstellte Partition temporär gemountet werden, damit die alten Daten übernommen werden können:

root# mkdir /mnt/backups
root# mount -t ext3 /dev/mapper/vg1-backups /mnt/backups

Wie zu erkennen ist, habe ich die Verknüpfung über den Device-Mapper genutzt. Jetzt können die Daten verschoben werden. ACHTUNG: Die Dateien dürfen sich nicht im Zugriff befinden!

root# mv /var/backups/* /mnt/backups/
root# ls -alh /var/backups/
insgesamt 0

Danach kann die Partion aus dem temporären Speicherort ausgehängt und in den endgültigen Speicherort eingehängt werden:

root# umount /mnt/backups
root# mount -t ext3 /dev/mapper/vg1-backups /var/backups

Bitte nach Beendigung der Arbeit die Anpassungen in der /etc/fstab nicht vergessen!

Wie ihr ein Logical Volume nachträglich verkleinert, könnt ihr hier nachlesen.

logrotate Konfiguration Icinga

Diese Konfiguration nutze ich für Icinga. Dabei liegt das von Icinga angelegte Logfiles unter „/var/log/icinga/„. Die Konfiguration des Speicherortes passiert in der Icinga-Hauptkonfigurationsdatei „/etc/icinga.cfg„. In Icinga2 erfolgt die Konfiguration in der Datei „/etc/icinga2/features-available/mainlog.conf“ und zeigt standardmäßig auf „/var/log/icinga2/„.

/var/log/icinga/*.log {
       weekly
       missingok
       rotate 52
       compress
       dateext
       notifempty
       create 640 icinga adm
       olddir /var/log/icinga/old/
}

Die Konfiguration sollte vor dem ersten Einsatz getestet werden:

logrotate -d /etc/logrotate.d/<ConfigDatei>

Dabei kommt dann in etwa so etwas heraus:

reading config file /etc/logrotate.d/icinga
reading config info for /var/log/icinga/*.log
olddir is now /var/log/icinga/old/

Handling 1 logs

rotating pattern: /var/log/icinga/*.log weekly (52 rotations)
olddir is /var/log/icinga/old/, empty log files are not rotated, old logs are removed
considering log /var/log/icinga/icinga.log
log does not need rotating

Vim – Erweiterung des Texteditors vi

Suchen und Ersetzen mit vim

Hier mal die Suchen-Ersetzen-Möglichkeiten aus dem vimtutor:

Um das ERSTE Vorkommen von alt in einer Zeile durch neu zu ersetzen, tippe
 :s/alt/neu
Um ALLE Vorkommen von alt in einer Zeile durch neu zu ersetzen, tippe
 :s/alt/neu/g
Um Ausdrücke innerhalb von zwei Zeilen zu ersetzen, tippe
 :#,#s/alt/neu/g
Um alle Vorkommen in der ganzen Datei zu ersetzen, tippe
 :%s/alt/neu/g
Um jedes Mal nach einer Bestätigung gefragt zu werden, füge 'c' hinzu.
 :%s/alt/neu/gc (*c*onfirm)

Suchoptionen für vim

Manchmal sucht man ein Wort, findet es in vim aber nicht, weil bei der Suche standardmäßig die Groß-/Kleinschreibung unterschieden wird. Das bekommt durch das Setzen der Option „ignore case“ weg:

:set ic

Zusätzlich kann man sich die Fundstellen über die Option „hlsearch“ hervorheben lassen:

:set hls

Die inkrementelle Suche ist nur meines Erachtens gewöhnungsbedürftig:

:set is

Alle Optionen kann man sich natürlich auch dauerhaft in der zentral Datei /etc/vim/vimrc oder in der userspezifischen Datei ~/.vimrc speichern:

# Suchoptionen für vim :set ic hls is

Wer sich diese Optionen dauerhaft speichern will, kann das entweder für sich persönlich in der Datei ~/.vimrc oder zentral für alle Benutzer in /etc/vim/vimrc.local. Soll eine Konfiguration für alle zukünftigen Benutzer angelegt werden, muss diese im Verzeichnis /etc/skel abgelegt werden. Von dort werden alle Dateien in das Home-Verzeichnis des neuen Benutzers kopiert.

Universalwerkzeug sed

Einfaches Ersetzen in Dateien

Manchmal will einfach nur einen Wert an allen Stellen in einer Datei ersetzen:

sed -i 's/Alter Wert/Neuer Wert/g' /PfadZurDatei/Dateiname

Ersetzen von Text an gefundenen Stellen.

Manchmal muss es aber etwas aufwändiger sein. Wenn man z.B. einen String in einem Text sucht und in der gefundenen Zeile einen zweiten String ersetzen will. Hier am Beispiel einer NTP-Konfiguraton:

sed -i '/^server\ [0-3]\.debian\.pool\.ntp\.org/ s/server/#server/g' /etc/ntp.conf

Hier wird in der NTP-Konfiguration nach den Server-Einträgen gesucht (0.debian.pool.ntp.org, 1.debian.pool.ntp.org,2.debian.pool.ntp.org und 3.debian.pool.ntp.org). Diese Zeilen werden auskommentiert, um z.B. eigene NTP-Server für die Kerberos-Authentifizierung zu konfigurieren.

Wer öfter mit vim arbeitet, dem wird die Suchen-/Ersetzen-Formation bekannt vorkommen. Weitere Such-Ersetz-Möglichkeiten kann man hier nachlesen.

Sed – Manipulation von Textdateien

Sed ist ein Streaming Editor. Wer genaueres dazu wissen will, kann das auf Wikipedia nachlesen. Ich schreibe mir hier Zusammenstellungen auf, die mir merkenswert erscheinen.

Ersetzen in Dateien

Manchmal will einfach nur einen Wert an allen Stellen in einer Datei ersetzen:

sed -i 's/Alter Wert/Neuer Wert/g' /PfadZurDatei/Dateiname

Wer öfter mit vim arbeitet, dem wird die Suchen-/Ersetzen-Formation bekannt vorkommen. Weite Such-Ersetz-Möglichkeiten kann man hier nachlesen.

Will man z.B. etwas Anderes ersetzen, als das was man sucht, kann man das auch aufteilen:

sed '/Suchbegriff/ s/Alter Wert/Neuer Wert/' /PfadZurDatei/Dateiname

So werden in dem folgenden Beispiel alle Zeilen der NTP-Konfiguration auskommentiert, die auf den Debian NTP-Pool verweisen:

sed -i '/^server [0-3].debian.pool.ntp.org/ s/server/#server/g' /etc/ntp.conf

Konfiguration Apache Webserver

Mit dem Apache2 habe ich bisher mehrere Webserver aufgebaut. Dabei versuche ich unter Debian immer folgenden Aufbau zu nutzen.

VirtualHost-Konfigurationen

/etc/apache/sites-available/<vhostName>

So kann man diese einfach per „a2ensite“ und „a2dissite“ aktivieren und deaktivieren.

<VirtualHost *:80>
       ServerAdmin webmaster@example.com
       ServerName sub.domain.tld
       
       DocumentRoot /srv/www/vhosts/<vhostName>/htdocs/
       
       ErrorLog /var/log/apache2/<vhostName>/error.log
       LogLevel warn
       CustomLog /var/log/apache2/<vhostName>/access.log combined
       
       ErrorDocument 404 /error/404.html
       ErrorDocument 403 /error/403.html
       ErrorDocument 401 /error/401.html
       
       <Directory /srv/www/vhosts/<vhostName>/htdocs/>
               Options -Indexes FollowSymLinks
               AllowOverride None
               Order allow,deny
               allow from all
       </Directory>
       
       Alias /error /srv/www/vhosts/<vhostName>/ErrorDocuments
       <Directory /srv/www/vhosts/<vhostName>/ErrorDocuments/>
               Options None
               AllowOverride None
               Order allow,deny
               allow from all
       </Directory>
       
</VirtualHost>

Virtual Host Container

Ich nutze einen separaten Ordner als Container für alle Dateien, die diese Webseite betreffen …

/srv/www/vhosts/<vhostName>
/srv/www/vhosts/<vhostName>

… mit folgender Unterstruktur

drwxr-xr-x   2  root            root           4,0K 30. Apr 15:51 config
drwxr-xr-x   2  root            root           4,0K 30. Apr 15:51 ErrorDocuments
drwxr-xr-x   2  root            root           4,0K 30. Apr 15:51 htaccess
drwxr-xr-x   15 www-data        www-data       4,0K  2. Mai 12:27 htdocs

Der Ordner ErrorDocuments kann eigene Fehlerseiten enthalten, die so auch bei geschütztem Hauptbereich durch einen Alias getrennt freigegeben werden können (s.o.). Der Ordner htaccess enthält evtl. vorhandene Zutritts- oder Umschreibungsdateien, die so wieder separat vom Hauptbereich geschützt werden können. Der Ordner htdocs enthält den DocumentRoot des Virtual Hosts. Der Ordner config enthält zwei Dateien. Einmal lr-<vhostname> mit einer Konfiguration für den logrotate-Dienst und braucht so nur in das Verzeichnis /etc/logrotate.d/verlinkt werden. Und zum zweiten die Apache-Konfiguration a2-<vhostname>. So kann auch diese Datei einfach in das Verzeichnis/etc/apache2/sites-available verlinkt werden.

Log-Dateien

Die Logdateien sollten abhängig vom Betriebssystem in der dafür vorgesehenen Partion abgelegt werden. Durch diese Abtrennung kann verhindert werden, dass eine vollgelaufene Log-Partition das gesamte System zum Absturz bringt. Bei Debian lege ich die Webserver-Logs wie folgt ab:

/var/log/apache/<vhostName>
/var/log/apache/<vhostName>/old

Backup der vHosts

Backups sollten auf jeden Fall automatisch laufen, da einem sonst gerade die Daten fehlen, die man gerade benötigt.

Für die einzelnen vHost des Apache realisiere ich das per Script, das mir die gepackten Archive unter

/var/backups/www

ablegt. Es werden dabei automatisch für jeden einzelnen vHost-Ordner ein Backup-Ordner angelegt und dort jeweils in tägliches und wöchentliches Backup unterschieden. Da ich die wöchentlichen Backups aufhebe, verzichte auf monatliche Backups.

#!/bin/sh
# Angaben zu Quelle und Ziel
src=/srv/www/vhosts
dest=/var/backups/www
# Unterordner mit Archivnamen im Zielverz. erzeugen (0/1)?
sd=1
### Hilfsvariablen ###
# Wochentag
wd=$(date +"%w")
# Kalenderwoche
kw=$(date +"%W")
# Monat
mo=$(date +"%m")
# Jahr
year=$(date +"%Y")
# Datum
d=$(date +"%Y%m%d")
 
# Pruefen, ob Quellverzeichnis vorhanden ist...
if [ ! -e $src ]; then
  /bin/echo "Quellverzeichnis $src nicht vorhanden oder kein Zugriff"
  exit 0
fi
 
# Pruefen, ob Zielverzeichnis vorhanden ist...
# ... und wenn nicht, anlegen
if [ ! -e $dest ]; then /bin/mkdir -p $dest; fi
 
# Ins Quellverzeichnis wechseln, damit tar keine
# fuehrenden / entfernen muss...
# ... und dadurch keine Ausgaben bei Cron-Jobs entstehen
cd $src
 
# Alle vHost-Ordner einzeln packen
for i in $(/bin/ls); do
  # Alte Datei loeschen
  if [ -e $dest/$wd-$i*.tar.gz ]; then /bin/rm $dest/$wd-$i*.tar.gz; fi
  if [ -e $dest/$i/taeglich/$wd-$i*.tar.gz ]; then /bin/rm $dest/$i/taeglich/$wd-$i*.tar.gz; fi
  # Neue Datei erstellen
  if [ $sd == 1 ]; then
    if [ ! -e $dest/$i/taeglich ]; then /bin/mkdir -p $dest/$i/taeglich; fi
    /bin/tar -czf "$dest/$i/taeglich/$wd-$i-$d.tar.gz" $i
  else
    /bin/tar -czf "$dest/$wd-$i-$d.tar.gz" $i
  fi
  # Wochen-Datei kopieren
  if [ $wd == 1 ]; then
    if [ ! -e $dest/$i/woechentlich ]; then /bin/mkdir -p $dest/$i/woechentlich; fi
     /bin/cp "$dest/$i/taeglich/$wd-$i-$d.tar.gz" "$dest/$i/woechentlich/$year-$kw-$i-$d.tar.gz"
  fi
done

Absicherung des Apache-Servers

Ein Apache Webserver ist sehr gut für die Entwicklung geeignet, weil er viele Informationen ausgeben, die eine Fehlerbehebung und Entwicklung unterstützen. Diese Informationen sollten auf Produktivsystem aber nicht für die Öffentlichkeit verfügbar sein. Daher sollte man noch ein paar Sicherheits-Einstellungen für den Webserver vornehmen.

Single Sign On und Kerberos auf Debian

Wer jetzt noch seinen Apache Webserver auf Debian im Windows-Intranet mit SSO zu einem 2008 R2 AD Domain-Controller einrichten will, findet bei Stefan Macke den Beitrag „Single Sign On with Kerberos using Debian and Windows Server 2008 R2

Datetime-Wert zerlegen

Folgende Beschreibung hab ich im entwickler-forum.de gefunden.

Über die DATEPART-Funktion kann eine SELECT-Abfrage nur bestimmte Bestandteile zurückliefern.

 DECLARE @mydatetime DATETIME
 DECLARE @myms INT
 DECLARE @myss INT
 DECLARE @mymi INT
 DECLARE @myhh INT
 DECLARE @mydd INT
 DECLARE @mymm INT
 DECLARE @myyyyy INT
 
 SET @mydatetime=getdate()
 SET @myms = DATEPART(ms,@mydatetime)
 SET @myss = DATEPART(ss,@mydatetime)
 SET @mymi = DATEPART(mi,@mydatetime)
 SET @myhh = DATEPART(hh,@mydatetime)
 SET @mydd = DATEPART(dd, @mydatetime)
 SET @mymm=DATEPART(mm,@mydatetime)
 SET @myyyyy = DATEPART(yyyy, @mydatetime)
 
 SELECT @myyyyy AS 'Year', @mymm AS 'Month', @mydd AS 'Day of month',
        @myhh AS 'Hour', @mymi AS 'Minute', @myss AS 'Second',
        @myms AS 'Millisecond'

 

Veröffentlicht in MSSQL