Nginx + Varnish auf Debian/Ubuntu

Zurück zur “Webseiten beschleunigen” – Übersicht

5.4) Nginx mit Varnish


“Varnish ist ein Web-Beschleuniger für dynamische Web-Seiten mit viel Inhalt. Im Gegensatz zu anderen Web-Beschleunigern, die häufig aus clientseitigen Proxies oder aus Servern entstanden, wurde Varnish von Grund auf als Web-Beschleuniger konzipiert.” – Wiki


Als erstes erweitern wir unsere sources.list, so dass wir die Varnish-Software einfach installieren / updaten können:


Ubuntu:

echo "http://repo.varnish-cache.org/ubuntu/ lucid varnish-2.1" >> /etc/apt/sources.list


Debian:

echo "deb http://repo.varnish-cache.org/debian/ lenny varnish-2.1" >> /etc/apt/sources.list


Nun installieren wir Varnish…

curl http://repo.varnish-cache.org/debian/GPG-key.txt | apt-key add -
aptitude install varnish


Nun müssen wir einige Eistellungen an Varnish vornehmen, so dass dieser als erstes angesprochen wird…

vim /etc/default/varnish
# Configuration file for varnish
#
# /etc/init.d/varnish expects the variables $DAEMON_OPTS, $NFILES and $MEMLOCK
# to be set from this shell script fragment.
#

# Should we start varnishd at boot?  Set to "yes" to enable.
START=yes

# Maximum number of open files (for ulimit -n)
NFILES=131072

# Maximum locked memory size (for ulimit -l)
# Used for locking the shared memory log in memory.  If you increase log size,
# you need to increase this number as well
MEMLOCK=82000

# Default varnish instance name is the local nodename.  Can be overridden with
# the -n switch, to have more instances on a single server.
INSTANCE=$(uname -n)

## Configuration with VCL
#
DAEMON_OPTS="-a :80 \
             -T localhost:6082 \
             -f /etc/varnish/default.vcl \
             -S /etc/varnish/secret \
             -s file,/var/lib/varnish/$INSTANCE/varnish_storage.bin,1G"

## TEST
#
#DAEMON_OPTS="-a :80 \
#             -T localhost:6082 \
#             -f /etc/varnish/default.vcl \
#             -s malloc,512M \
#             -p lru_interval=3600 \
#             -p thread_pool_max=2000 \
#             -p listen_depth=2048 \
#             -p 'cc_command=exec cc -fpic -shared -Wl,-x -L/usr/include/libmemcached/memcached.h -lmemcached -o %o %s' \
#             -h classic,500009 \
#             -t 0"

## Alternative 3, Advanced configuration
#
# See varnishd(1) for more information.
#
# # Main configuration file. You probably want to change it :)
# VARNISH_VCL_CONF=/etc/varnish/default.vcl
#
# # Default address and port to bind to
# # Blank address means all IPv4 and IPv6 interfaces, otherwise specify
# # a host name, an IPv4 dotted quad, or an IPv6 address in brackets.
# VARNISH_LISTEN_ADDRESS=
# VARNISH_LISTEN_PORT=6081

#
# # Telnet admin interface listen address and port
# VARNISH_ADMIN_LISTEN_ADDRESS=127.0.0.1
# VARNISH_ADMIN_LISTEN_PORT=6082
#
# # The minimum number of worker threads to start
# VARNISH_MIN_THREADS=1
#
# # The Maximum number of worker threads to start
# VARNISH_MAX_THREADS=1000
#
# # Idle timeout for worker threads
# VARNISH_THREAD_TIMEOUT=120
#
# # Cache file location
# VARNISH_STORAGE_FILE=/var/lib/varnish/$INSTANCE/varnish_storage.bin
#
# # Cache file size: in bytes, optionally using k / M / G / T suffix,
# # or in percentage of available disk space using the % suffix.
# VARNISH_STORAGE_SIZE=1G
#
# # File containing administration secret
# VARNISH_SECRET_FILE=/etc/varnish/secret
#
# # Backend storage specification
# VARNISH_STORAGE="file,${VARNISH_STORAGE_FILE},${VARNISH_STORAGE_SIZE}"
#
# # Default TTL used when the backend does not specify one
# VARNISH_TTL=120
#
# # DAEMON_OPTS is used by the init script.  If you add or remove options, make
# # sure you update this section, too.
# DAEMON_OPTS="-a ${VARNISH_LISTEN_ADDRESS}:${VARNISH_LISTEN_PORT} \
#              -f ${VARNISH_VCL_CONF} \
#              -T ${VARNISH_ADMIN_LISTEN_ADDRESS}:${VARNISH_ADMIN_LISTEN_PORT} \
#              -t ${VARNISH_TTL} \
#              -w ${VARNISH_MIN_THREADS},${VARNISH_MAX_THREADS},${VARNISH_THREAD_TIMEOUT} \
#              -S ${VARNISH_SECRET_FILE} \
#              -s ${VARNISH_STORAGE}"
#


Nun muss du die Konfig anpassen, ich zeige hier ein Beispiel für meinen WordPress Blog… ggf. musst du für deine Webseiten jedoch noch weitere Einstellungen ändern.


vim /etc/varnish/default.vcl
backend default {
        .host = "127.0.0.1";
        .port = "8080";
}

acl purge {
        "localhost";
}

sub vcl_fetch {
        set beresp.ttl = 12h;
        set req.grace = 24h;
        if (req.url ~ "wp-(login|admin)") {
                return (pass);
        }
        if (req.url ~ "feed") {
                return (pass);
        }
        return (deliver);
        unset beresp.http.set-cookie;
        if (req.url ~ "\.(jpeg|jpg|png|gif|ico|swf|js|css|txt|gz|zip|rar|bz2|tgz|tbz|html|htm|pdf|pls|torrent)$") {
                set beresp.ttl = 48h;
        }

        remove req.http.X-Forwarded-For;
        set    req.http.X-Forwarded-For = req.http.rlnclientipaddr;
        if (req.url ~ "^/w00tw00t") {
                error 403 "Not permitted";
        }
        return(deliver);
}

sub vcl_deliver {
        if (obj.hits > 0) {
                set resp.http.X-Cache = "HIT";
                set resp.http.X-Cache-Hits = obj.hits;
        } else {
                set resp.http.X-Cache = "MISS";
        }
        remove resp.http.X-Varnish;
        remove resp.http.Via;
        remove resp.http.Age;
        remove resp.http.X-Powered-By;
}

sub vcl_recv {
        set req.grace = 6h;
        if (req.request == "PURGE") {
                if(!client.ip ~ purge) {
                        error 405 "Not allowed.";
                }
                purge("req.url ~ ^" req.url "$ && req.http.host == "req.http.host);
        }
        if (req.url ~ "\.(jpg|png|gif|gz|tgz|bz2|lzma|tbz)(\?.*|)$") {
                remove req.http.Accept-Encoding;
        } elsif (req.http.Accept-Encoding ~ "gzip") {
                set req.http.Accept-Encoding = "gzip";
        } elsif (req.http.Accept-Encoding ~ "deflate") {
                set req.http.Accept-Encoding = "deflate";
        } else {
                remove req.http.Accept-Encoding;
        }
        if( req.url ~ "^/wp-(login|admin)" || req.http.Cookie ~ "wordpress_logged_in_" ) {
                return (pass);
        }
        if (!(req.url ~ "wp-(login|admin)")) {
                unset req.http.cookie;
        }
        if (req.request != "GET" &&
                req.request != "HEAD" &&
                req.request != "PUT" &&
                req.request != "POST" &&
                req.request != "TRACE" &&
                req.request != "OPTIONS" &&
                req.request != "DELETE") {
                return (pipe);
        }
        if (req.request != "GET" && req.request != "HEAD") {
                return (pass);
        }
        if (req.http.Authorization || req.http.Cookie) {
                return (pass);
        }
        if (req.url ~ "\.(jpeg|jpg|png|gif|ico|swf|js|css|txt|gz|zip|rar|bz2|tgz|tbz|html|htm|pdf|pls|torrent)(\?.*|)$") {
                unset req.http.Authenticate;
                unset req.http.POSTDATA;
                set req.request = "GET";
                set req.url = regsub(req.url, "\?.*$", "");
                return (lookup);
        }
        unset req.http.cookie;
        return (lookup);
}

sub vcl_pipe {
        set bereq.http.connection = "close";
        if (req.http.X-Forwarded-For) {
                set bereq.http.X-Forwarded-For = req.http.X-Forwarded-For;
        } else {
                set bereq.http.X-Forwarded-For = regsub(client.ip, ":.*", "");
        }
}

sub vcl_pass {
        set bereq.http.connection = "close";
        if (req.http.X-Forwarded-For) {
                set bereq.http.X-Forwarded-For = req.http.X-Forwarded-For;
        } else {
                set bereq.http.X-Forwarded-For = regsub(client.ip, ":.*", "");
        }
}


Parallel müssen wir nun unseren Webserver, egal ob Apache oder in diesem Fall Nginx, auf den Port 8080 lauschen lassen.  Beim Nginx ist dies relativ simpel, du muss nur “listen 80” -> “listen 8080” ändern. Ich zeige an dieser Stelle jedoch einmal meine Nginx-Konfiguration für meinen WordPress Blog.

[stextbox id=”warning”]Wie immer gilt, erst verstehen, dann kopieren… :-)[/stextbox]

server {
        listen 8080;
        server_name suckup.de www.suckup.de blog.voku-online.de linux.voku-online.de windows.voku-online.de ubuntu.voku-online.de allgemein.voku-online.de cdn1.voku-online.de cdn2.voku-online.de cdn3.voku-online.de cdn4.voku-online.de cdn5.voku-online.de *.suckup.de;
        root /var/www/www.suckup.de/web/;
        index index.php;
        access_log /var/log/nginx/suckup.access.log main;
        error_log /var/log/nginx/suckup.error.log;
        log_not_found on;

        ## Cache - testen
        open_file_cache max=2500 inactive=24h;
        open_file_cache_valid    24h;
        open_file_cache_min_uses 2;
        open_file_cache_errors   on;

        location ~* ^.+.(htm|html|jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js)(\?[0-9]+)?$ {
                root /var/www/www.suckup.de/web/;
                access_log off;
                expires max;
                break;
        }

        ## Optimierung - "(css/js).php" to "(css/js)"
        location /wp-content/plugins/wp-special-textboxes/css/ {
                location ~* \.(css.php)$ {
                        if ($args ~* ver=(.*)$) {
                                rewrite ^ $scheme://$host/wp-content/cache/wp-special-textboxes.css? permanent;
                        }
                }
        }
        location /wp-content/plugins/wp-special-textboxes/js/ {
                location ~* \.(js.php)$ {
                        if ($args ~* ver=(.*)$) {
                                rewrite ^ $scheme://$host/wp-content/cache/wstb.js? permanent;
                        }
                }
        }
        if ($args ~* ver=3.0.1$) {
                rewrite ^ $scheme://$host/wp-content/cache/wp-special-textboxes.css? permanent;
        }

        if (-f $request_filename) {
                break;
        }
        if (!-e $request_filename) {
                rewrite ^(.+)$ /index.php?q=$1 last;
        }

        # -----------------------------------------
        # http://wiki.nginx.org/Wordpress

        ## remove any multislashes //
        if ($request_uri ~* "\/\/") {
                rewrite ^/(.*) $scheme://$host/$1 permanent;
        }

        ## Slash am Ende anfuegen ?!?
        #if ($request_uri ~* "^[\w\-\/]+[^\/?]$") {
                #rewrite ^(.*)$ $scheme://$host$1/ permanent;
        #}

        ## www eifuegen
        #if ($host !~* ^(www|subdomain)) {
                #rewrite ^/(.*)$ $scheme://www.$host/$1 permanent;
        #}

        ## www vorne entfernen
        if ($host ~* ^www\.(.*)) {
                set $host_without_www $1;
                rewrite ^(.*)$ http://$host_without_www$1 permanent;
        }

        ## immer SSL verwenden
        #rewrite ^(.*) https://$server_name$1 permanent;

        ## immer HTTP verwenden
        #rewrite ^(.*) http://$server_name$1 permanent;

        ## Feedburner
        rewrite ^/e107_plugins/rss_menu/rss.php?(.*)$ http://suckup.de/feed/ last;
        if ($http_user_agent !~ (FeedBurner|Googlebot)) {
                rewrite ^/feed/?$ http://feeds.feedburner.com/suckup last;
                break;
        }

        ## WordPress3
        #if (!-e $request_filename) {
                #rewrite ^(.+)$ /index.php?q=$1 last;
                #break;
        #}

        ## WordPress3 MU
        #if (!-e $request_filename) {
                #rewrite ^.+/?(/wp-.*) $1 last;
                #rewrite ^.+/?(/.*\.php)$ $1 last;
                #rewrite ^(.+)$ /index.php?q=$1 last;
                #break;
        #}

        ## WordPress3 Multi-Domain
        rewrite ^.*/files/(.*)$ /wp-includes/ms-files.php?file=$1 last;
        if (!-e $request_filename) {
                rewrite ^.+/?(/ms-.*) $1 last;
                rewrite ^/files/(.+) /wp-includes/ms-files.php?file=$1 last;
                rewrite ^.+/?(/wp-.*) $1 last;
                rewrite ^.+/?(/.*.php)$ $1 last;
                rewrite ^(.+)$ /index.php?q=$1 last;
                break;
        }
        location ~* ^.+.(htm|html|jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js)(\?[0-9]+)?$ {
                access_log off;
                expires max;
                root /var/www/www.suckup.de/web/;
                rewrite ^/.(/wp-.*/.*.(html|jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js))(\?[0-9]+)?$ $1 last;
                break;
                rewrite ^.*/files/(.*(html|jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js))(\?[0-9]+)?$ /wp-includes/ms-files.php?file=$1 last;
                break;
                if (!-e $request_filename) {
                        rewrite ^.+/?(/wp-.*) $1 last;
                        rewrite ^.+/?(/.*.php)$ $1 last;
                        rewrite ^(.+)$ /index.php?q=$1 last;
                        break;
                }
        }

        ## WordPress-Forum
        if (!-e $request_filename) {
                rewrite ^/forums/topic/(.*)$ /forums/topic.php?q=$1 last;
                rewrite ^/forums/forum/(.*)$ /forums/forum.php?q=$1 last;
                rewrite ^/forums/profile/(.*)$ /forums/profile.php?q=$1 last;
                rewrite ^/forums/view/(.*)$ /forums/view.php?q=$1 last;
                rewrite ^/forums/tags/(.*)$ /forums/tags.php?q=$1 last;
                rewrite ^/forums/rss/(.*)$ /forums/rss.php?q=$1 last;
                rewrite ^/forums/bb-admin/ /forums/bb-admin/index.php last;
                rewrite ^/forums/ /forums/index.php last;
                break;
        }

        ## WordPress W3 Total Cache
        set $totalcache_file '';
        set $totalcache_uri $request_uri;
        if ($request_method = POST) {
                set $totalcache_uri '';
        }
        if ($query_string) {
                set $totalcache_uri '';
        }
        if ($http_cookie ~* "comment_author_|wordpress|wp-postpass_" ) {
                set $totalcache_uri '';
        }
        if ($totalcache_uri ~ ^(.+)$) {
                set $totalcache_file /wp-content/w3tc-suckup.de/pgcache/$1/_default_.html.gzip;
        }
        if (-f $document_root$totalcache_file) {
                rewrite ^(.*)$ $totalcache_file break;
        }

        ## WordPress SuperCache
        #set $supercache_file '';
        #set $supercache_uri $request_uri;
        #if ($request_method = POST) {
                #set $supercache_uri '';
        #}
        #if ($query_string) {
                #set $supercache_uri '';
        #}
        #if ($http_cookie ~* "comment_author_|wordpress|wp-postpass_" ) {
                #set $supercache_uri '';
        #}
        #if ($supercache_uri ~ ^(.+)$) {
                #set $supercache_file /wp-content/cache/supercache/$http_host/$1index.html;
        #}
        #if (-f $document_root$supercache_file) {
                #rewrite ^(.*)$ $supercache_file break;
        #}

        #if (!-e $request_filename) {
                #rewrite . /index.php last;
        #}

        # -----------------------------------------

        ## memchached test
        #location / {
                #default_type text/html;
                #add_header "Content" "text/html; charset=utf8";
                #charset utf-8;
                #set $memcached_key $uri;
                #memcached_pass 127.0.0.1:11211;
                #error_page 500 404 405 = @fallback;
        #}
        #location @fallback {
                #try_files $uri $uri/ @suckup;
        #}

        location / {
                try_files $uri $uri/ @suckup;
                sub_filter suckup.de:8080
                'suckup.de:80';
                sub_filter_once on;
        }

        location @suckup {
                include /etc/nginx/fastcgi_params;
                fastcgi_param SCRIPT_FILENAME $document_root/index.php;
                fastcgi_param QUERY_STRING q=$uri&$args;
                fastcgi_param SCRIPT_NAME /index.php;
                fastcgi_pass 127.0.0.1:11000;
        }

        location ~ \.php$ {
                try_files $uri @suckup;
                ## memchached test
                #set $memcached_key $uri;
                #memcached_pass  127.0.0.1:11211;
                fastcgi_index index.php;
                fastcgi_pass 127.0.0.1:11000;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include /etc/nginx/fastcgi_params;
        }

        ## .htaccess & .htpassword sperren
        location ~ /\.ht {
                deny  all;
        }
}

C-Programm – Steuerzeichen

“Als Steuerzeichen bezeichnet man die Zeichen eines Zeichensatzes, die keine darstellbaren Zeichen repräsentieren. (Darstellbare Zeichen sind z. B. Buchstaben, Ziffern und Satzzeichen). Ursprünglich wurden sie zur Ansteuerung von Textausgabegeräten wie Textdruckern, Telegrammgeräten oder Fernschreibern verwendet. Durch Steuerzeichen ist es möglich, Steuerungsbefehle für die Ausgabegeräte innerhalb des Zeichensatzes zu übertragen, anstatt die Steuerungsinformationen über ein anderes Protokoll zu übertragen.” – Wiki


(Einige dieser Steuerzeichen habe ich bereits in meiner .bashrc eingetragen, um den Bash-Prompt Farbe zu verleihen.)


Steuerzeichen Bedeutung
\a
BEL (bell) – akkustisches Warnsignal
\b
BS (backspace) – setzt Cursor um eine Position nach links
\f
FF(formfeed) – ein Seitenvorschub wird ausgelöst.
\n
NL (newline) – Cursor geht zum Anfang der nächsten Zeile
\r
CR (carriage return) – Cursor springt zum Anfang der aktuellen Zeile
\t
HT (horizontal tab) – Zeilenvorschub zur nächsten horizontalen Tabulatorposition (meistens acht Leerzeichen weiter)
\v
VT (vertical tab) – Cursor springt zur nächsten vertikalen Tabulatorposition
\"
” wird ausgegeben
\'
‘ wird ausgegeben
\?
? wird ausgegeben
\\
\ wird ausgegeben
\0
NULL (ist die Endmarkierung eines Strings)
\nnn
Ausgabe eines Oktalwerts (z.B. \033 = ESCAPE-Zeichen)
\xhh
Ausgabe eines Hexdezimalwerts
\033[0m
normaler Text
\033[1m
Fettschrift
\033[4m
unterstrichen
\033[30m
Schriftfarbe Schwarz
\033[31m
Schriftfarbe Rot
\033[32m
Schriftfarbe Grün
\033[33m
Schriftfarbe Gelb
\033[34m
Schriftfarbe Blau
\033[35m
Schriftfarbe Violett
\033[36m
Schriftfarbe Türkis
\033[40m
Hintergrundfarbe Schwarz
\033[41m
Hintergrundfarbe Rot
\033[42m
Hintergrundfarbe Grün
\033[43m
Hintergrundfarbe Gelb
\033[44m
Hintergrundfarbe Blau
\033[45m
Hintergrundfarbe Violett
\033[46m
Hintergrundfarbe Türkis


Es folge Beispiele, wo dies angewendet wurde…

#include <stdio.h>

main() {
    printf("\033[1m\033[31mDieser Text ist fett und rot.\033[0m\n");
    return(0);
}
#include <stdio.h>

int main() {
        printf("Dies ist ein Test und es folgt ein Zeilenumbruch\n");
        printf("\tTab einfügen und noch ein Zeilenumbruch\n");
        printf("Dieser Text wird überschrieben\r");
        printf("Das Leer \bzeichen wird entfernt");
        printf("\n\n\n");
        printf("\tJ\n");
        printf("\tu\n");
        printf("\ts\n");
        printf("\tt for\tF\n");
        printf("\t\tu\n");
        printf("\t\tn");
        return 0;
}

/* Ausgabe:

Dies ist ein Test und es folgt ein Zeilenumbruch
        Tab einfügen und noch ein Zeilenumbruch
Das Leerzeichen wird entfernt%

        J
        u
        s
        t for   F
                u
                n
*/

lynx automatisieren

Bei einigen W-LANs muss man sich vorher per Browser auf einer Authentifizierungsseite einloggen, um dies zu umgehen habe ich einfach den Login-Vorgang mit lynx aufgezeichnet und dies in ein Skript verpackt.


# mit lynx die Tastatur Eingaben aufzeichnen
lynx -cmd_log wlan.log http://www.google.de/
# und diese als "Makro" wieder ausführen
lynx -cmd_script=wlan.log http://www.google.de/


#!/bin/bash

TERM="xterm"; export TERM  
export PATH="/sbin:/usr/sbin:/bin:/usr/bin:$PATH"

sleep 30  

# W-Lan Gateyway IP herausfinden ->
# Gateway-IPs | jedoch nicht eth | bei der Ausgabe muss vone 0.0.0.0 stehen | gewuenschte Ausgabe steht in an Stelle 10
# wenn man als Trennung der Zeichen ein Leerzeichen annimmt
GW=$(route -n | grep -v eth | grep -i "^0.0.0.0" | cut -f 10 -d " ")
# Variablen werden gesezt
PACKETS=3
STARTWERT=0
ENDWERT=5

# wenn die Variable "GW" nicht leer ist dann...
# (-z kann pruefen ob eine Variable leer ist)
if [ -n $GW ]; then
# ...solange der STARTWERT kleiner dem ENDWERT ist, wird folgendes ausgefuert
	while [ $STARTWERT -lt $ENDWERT ]; do
# schauen ob wir eine ANTWORT vom Gateway bekommen ->
# ping-test | Anzahl der zu sendenden / empfangenden Pakete | Ausgabe-Zeile auf "packets" eingrenzen | gewuenschte Ausgabe steht in an Stelle 4
# wenn man als Trennung der Zeichen ein Leerzeichen annimmt
		REQUEST=$(ping -qc $PACKETS $GW | grep packets | cut -f 4 -d " ")
# wenn die gesendeten Packete nicht der Anzahl der empfangenden entspricht...
		if [ $REQUEST != $PACKETS ]; then
# ...dann Variable = 1 -> Fehler
			EXITCODE=1
		else
# ...ansonsten Variable = 0 -> OK
			EXITCODE=0
		fi
# STARTWERT um 1 erhoehen, so dass die while-Schleife irgendwann beendet werden kann
		STARTWERT=$(expr $STARTWERT + 1)
	done
fi

# wenn alles OK war...
if [ $exitcode=0 ]; then
# ...wird lynx (Browser) mit User + Password automatisch gestartet
	gnome-terminal -e lynx -cmd_script=/home/lars/wlan.log http://www.google.de/
# und dem System wird mitgeteilt, dass alles OK ist
	exit 0
else
# bzw. dass ein Fehler aufgetreten ist
	exit 1
fi


Wenn man dieses Skript nun unter “/etc/network/if-up.d/” anlegt, und in der Datei “/etc/network/interfaces” unter dem Abschnitt z.B. “wlan0” folgende Zeile einfügt:

post-up /etc/network/if-up.d/wlan_login.sh

…wird dieses ausgeführt, sobald das W-Lan verbunden ist. Wenn jemand noch eine bessere Möglichkeit kennt, würde ich diese gerne hören… :-)

Ubuntu-10.10 – Maverick-Meerkat

Canonical hat heute, am 10.10.10 exakt um 10:10:10 Uhr UTC die neue Ubuntu-Version – 10.10 (Maverick Meerkat) veröffentlicht. Die Zahlen sind eine Anspielung auf “Per Anhalter durch die Galaxis”, wo die Zahl 42 die Antwort auf alle Fragen ist. (Binär 101010 -> Zahl 42) Ubuntu 10.10 hat kein LTS (Long Term Support) und wird daher (nur) 18 Monate mit Updates versorgt.

ubuntu-logo

10.10



Neuerungen:

– Linux 2.6.35.4

– bessere Multitouch-Unterstützung

– ALSA-Patches zur Behebung von Problemen mit Soundkarten und Mikrophonen

– diversen Treiber-Updates

– Sicherheitsverbesserungen für ARM

– …

btrfs (Dateisystem)

schnellerer Bootvorgang

neuer Style (Themes, Icons, Hintergrundbilder, …)

Ubuntu-Desktop
Ubuntu-Desktop

neue Standard Schriftart (Ubuntu font family)

neue Paketquellen (Repository – “extra.ubuntu.com”)

proprietäre Software Unterstützung (mp3, Flash, …)

Ubuntu-Install
Ubuntu-Installation

– “Software-Center” wurde aktualisiert (bittet nun auch kommerzielle Software und eine History-Funktion)

kauf-Software
kauf-Software

– “Ubuntu One” wurde besser im Desktop (Dateimanager) integriert

Ubuntu One
Ubuntu One

– “Ubuntu“-Version

– GNOME 2.32

– Sound-Indikatoren-Menü

Indikatoren
Indikatoren

– Shotwell ersetzt F-Spot (Fotoverwaltung)

Shotwell
Shotwell

– Evolution (E-Mail Client) wurde aktualisiert

– Gwibber (Twitter Client) wurde aktualisiert

– Ubuntu Netbook Edition kurz UNE (alte Bezeichnung “Ubuntu Netbook Remix”)

Unity (Standardoberfläche)

Unity
Unity

– Evolution Express (E-Mail Client)

– “Kubuntu-Version

– KDE 4.5.1 (Qt 4.7)

– PulseAudio

– Rekonq (Webbrowser)

– Bluedevil (Bluetooth-Anwendung)

Xubuntu“-Version

Xfce 4.6.2

– Parole (Media-Player)

– Xfburn (Brenn-Software)

– xfce4-taskmanager (Task-Manager)

Edubuntu-Version

Gnome Nanny (Zugriffsbeschränkung für Kinder)

– OEM-Installationsmodus

Ubuntu Studio -Version

– PulseAudio und JACK wurden verbessert (Soundserver)

– gnome-network-admin (Netzwerkkonfiguration-Tool)

Mythbuntu -Version

MythTV 0.23.1

 

Übersicht:

Komponente

Programm

Version

Bildbetrachter Shotwell 0.7.2
Brennprogramm Brasero 2.32
Browser Firefox 3.6.10
Chat-Programm Empathy 2.32
Compiler GCC 4.4.4
Datei-Manager Nautilus 2.32
Desktop Gnome 2.32
Desktop Unity 0.2.46
E-Mail-Programm Evolution 2.30.3
Kernel Linux 2.6.35
Musikplayer Rhythmbox 0.13.1
Office-Suite OpenOffice 3.2.1
Torrent-Client Transmission 2.04
Twitter-Client Gwibber 2.32
Videobearbeitung Pitivi 0.13.5
Videoplayer Totem 2.32

 

Download:

http://releases.ubuntu.com/10.10/


Ubuntu:
Alternate CD (64-bit)
Alternate CD (32-bit)

Desktop-Edition (64-bit)
Desktop-Edition (32-bit)

Server Edition (64-bit)
Server Edition (32-bit)


Kubuntu:
Desktop CD, 32bit
Desktop CD, 64bit

Desktop DVD, 32bit
Desktop DVD, 64bit

Desktop Alternate CD, 32bit
Desktop Alternate CD, 64bit


Weitere Versionen:
Xubuntu xubuntu.org/news/10.10-release

Edubuntu edubuntu.org/news/10.10-release

Mythbuntu mythbuntu.org/10.10/release

Ubuntu Studio wiki.ubuntu.com/UbuntuStudio/10.10release_notes



Die nächste Ubuntu-Version 11.04 soll übrigens im April 2011 erscheinen und den Codenamen Natty Narwhal haben.


Quellen:

http://www.pro-linux.de/news/1/16259/ubuntu-1010-veroeffentlicht.html

http://www.linux-community.de/Internal/Artikel/Online-Artikel/Das-ist-neu-in-Ubuntu-10.10-alias-Maverick-Meerkat

https://lists.ubuntu.com/archives/ubuntu-announce/2010-October/000139.html

Debian Backports

In der Debian-Distribution werden bekanntlich nur getestete Pakete verwendet und in einer Version (z.B. Debian-Version 5, “Lenny”) nur wichtige Korrekturen durchgeführt, aber keine weiteren Versionssprünge vorgenommen. Wenn ich nun eine neuere Version von einer bestimmten Software nutzen wollte, habe ich bisher auf backports.orgzurückgegriffen, seit zirka einem Monat gehört das Projekt nun offiziell zum Debian-Service und ist unter “packports.debian.orgzu erreichen. Die Quellen heißen deshalb “backport”, da diese aus dem Debian-Testing-Zweig (momentan Debian-Version 6, “Squeeze”) zurück portiert wurden. Das Paket “debian-backports-keyring” wird nun nicht mehr benötigt, da die Pakete nun mit den offiziellen Key von Debian unterzeichnet sind.

 

“Da sich die Adresse von backports.org zu backports.debian.org ändert, sollten alle Benutzer, um Überraschungen zu vermeiden, ihre Repositorien in sources.list so bald wie möglich anpassen. Die alte Adresse wird allerdings als Spiegel des Archivs noch für einige Zeit erhalten bleiben. Wer Pinning mit Backports-Paketen nutzt, sollte seine Einstellungen in der Datei preferences bald anpassen, da sich der Archivname in »Debian Backports« geändert hat.” – Pro-Linux.de

 

Wenn nun jedoch in im Testing-Zweig keine neue Software aufgenommen wird, wie es momentan der Fall ist und der Testing-Zweig somit eingefroren wird, um diesen auf die Stabilen-Zweig zu bringen, dann benötigt man ggf. auch noch die Quelle “lenny-backports-sloppy“. Somit kannst du bereits Software aus der Unstable-Version (Debian-Version 7, “Wheezy) verwenden, wenn du jedoch auf die kommende stabile Version “Squeeze” aktualisieren möchtest, dann benötigst du zwingend die zugehörigen Backports, zudem ist diese Quellen stets mit dem packports zu verwenden.

 

1.) Folgende Zeilen einfügen:

Entweder direkt in der “/etc/apt/sources.list”-Datei oder du musst im folgendem Unterverzeichnis (/etc/apt/sources.list.d/) eine Datei mit der Endung (.list) anlegen und dort die folgenden Zeilen einfühen.

deb http://backports.debian.org/debian-backports lenny-backports main
deb http://backports.debian.org/debian-backports lenny-backports-sloppy main

2.) Quellen aktualisieren

 

apt-get update

3.) Folgende Zeilen einfügen:

In der “/etc/apt/preferences”-Datei folgendes Einfügen, so dass du auch mit Sicherheit-Updates versorgt wirst.

 

Package: *
Pin: release a=lenny-backports
Pin-Priority: 200

4.) Pakete installieren

Mit dem folgendem Befehl kannst du nun, aus dem Backports Software installieren, hier gibt es noch mehr Infos zu aptitude. ;-)

 

aptitude -t lenny-backports install "package"

 

LibreOffice Installation unter Debian / Ubuntu

In diesem HowTo beschreibe ich wie du LibreOffice auf Debian/Ubuntu installierst. Kurz zum Hintergrund, warum OpenOffice zu -> LibreOffice wurde:

Gegründet wurde die Stiftung von verschiedenen Mitgliedern von OpenOffice.org. Auf der Webseite von “The Dokument Foundation” findet sich einer Liste der Gründungsmitglieder, diese haben diesen Schritt gewagt, da seit der Übernahmen von Sun durch Oracle nur noch wenige Ressourcen aus der Hamburger Entwicklungsabteilung ins Projekt eingeflossen seien. (Quelle: heise.de) Nun haben auch schon einige Firmen (GoogleNovell und Red Hat) angekündigt die neue Foundation zu unterstützen. Wer diesbezüglich noch mehr Infos sucht, kann sich folgenden Artikel durchlesen -> ikhaya.ubuntuusers.de


“Eine Abspaltung (auch Fork; engl. fork = Gabel, üblicherweise als Maskulinum verwendet) ist in der Softwareentwicklung ein Entwicklungszweig nach der Aufspaltung eines Projektes in zwei oder mehr Folgeprojekte, wobei Teile des Quellcodes und seiner Historie kopiert werden und dann unabhängig von dem ursprünglichen Projekt weiterentwickelt werden.” – Wiki


libreoffice


libreoffice-menü


Installation unter Ubuntu:




[stextbox id=”warning”]Fremdpakete können das System beschädigen -> wiki.ubuntuusers.de/fremdquellen[/stextbox]


sudo add-apt-repository ppa:libreoffice/ppa
sudo apt-get update
sudo apt-get install libreoffice
Gnome:
sudo apt-get install libreoffice-gnome
KDE:
sudo apt-get install libreoffice-kde


ggf. findest du hier noch weitere Infos …



Installation unter Debian:


[stextbox id=”warning”]Fremdpakete können das System beschädigen[/stextbox]


1.) Deinstallation von OpenOffice

sudo aptitude purge openoffice.org-base openoffice.org-base-core openoffice.org-common openoffice.org-gnome


Zwei mal mit “Y” bestätigen…

– Diese Lösung akzeptieren? [Y/n/q/?] Y

– Wollen Sie fortsetzen? [Y/n/?] Y

… und schon wird OpenOffice deinstalliert.


2.) LibreOffice (+deutsche Sprachdatei) herunterladen

Darauf achten, ob man die 32-Bit oder die 64-Bit Version herunterlädt.


32-Bit:
cd /tmp
wget http://ftp5.gwdg.de/pub/tdf/libreoffice/stable/3.3.0/deb/x86/LibO_3.3.0_Linux_x86_install-deb_en-US.tar.gz
wget http://ftp5.gwdg.de/pub/tdf/libreoffice/stable/3.3.0/deb/x86/LibO_3.3.0_Linux_x86_langpack-deb_de.tar.gz
64-Bit:
cd /tmp
wget http://download.documentfoundation.org/libreoffice/stable/3.3.0/deb/x86_64/LibO_3.3.0_Linux_x86-64_install-deb_en-US.tar.gz
wget http://download.documentfoundation.org/libreoffice/stable/3.3.0/deb/x86_64/LibO_3.3.0_Linux_x86-64_langpack-deb_de.tar.gz


3.) Datei entpacken

tar -xzvf LibO_3.3.0_Linux_x86_install-deb_en-US.tar.gz
tar -xzvf LibO_3.3.0_Linux_x86_langpack-deb_de.tar.gz


4.) Update LibreOffice

Falls bereits eine frühere Version von LibreOffice installiert ist, kannst du diese mit diesem Skript aktualisieren.

cd en-US
sudo ./update


5.) Installation von LibreOffice

cd DEBS
sudo dpkg -i *.deb
sudo dpkg -i desktop-integration/*menus*.deb

cd /tmp/DE/DEBS
sudo dpkg -i *.deb


E-Mail-Verschlüsselung per GnuPG

GnuPG (gpg) ist ein Kryptografie-System, dass heißt das Dateien und somit auch E-Mails mit einem öffentlichem Schlüssel verschlüsselt werden können und nur du dieser mit deinem privaten Schlüssel wieder entschlüsseln kannst. Wenn du nun verschlüsselte E-Mails empfangen möchtest, benötigst du als erstes einmal ein solches Schlüsselpaar, danach musst du den öffentlichen Schlüssel (wie der Name schon sagt) veröffentlichen, jemand muss diesen herunterladen und verwenden.Somit können andere Leute dir verschlüsselt Mails senden und nur du kannst diese lesen.


Ich werde den Vorgang anhand eines Beispieles erklären und immer verdeutlichen auf welcher Kiste (PC) ich gerade bin.


Debian

Auf dem Debian System hab ich Mutt (Mail-Client) und GnuPG installiert, um das Schlüsselpaar zu erzeugen und die verschlüsselten E-Mails per Mutt (am Ende vom Blog-Post) abzurufen und zu entschlüsseln.

1.) Die nötige Software installieren…

aptitude install pgp mutt

2.) Schlüssel erzeugen

(Bitte deinen Namen & Mail-Adresse angeben)

gpg --gen-key

gpg (GnuPG) 1.4.10; Copyright (C) 2008 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Please select what kind of key you want:
(1) RSA and RSA (default)
(2) DSA and Elgamal
(3) DSA (sign only)
(4) RSA (sign only)
Your selection? 1
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048)
Requested keysize is 2048 bits
Please specify how long the key should be valid.
0 = key does not expire
<n>  = key expires in n days
<n>w = key expires in n weeks
<n>m = key expires in n months
<n>y = key expires in n years
Key is valid for? (0)
Key does not expire at all
Is this correct? (y/N) y

You need a user ID to identify your key; the software constructs the user ID
from the Real Name, Comment and Email Address in this form:
“Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>”

Real name: Lars Moelleken
Email address: voku@voku-online.de
Comment:
You selected this USER-ID:
“Lars Moelleken <voku@voku-online.de>”

Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O
..+++++
.+++++
..+++++
.+++++
gpg: key E0000000 marked as ultimately trusted
public and secret key created and signed.

gpg: checking the trustdb
gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model
gpg: depth: 0  valid:   1  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 1u
pub   2048R/E0000000 2010-09-28
Key fingerprint = 0000 0000 0000 0000 0000  0000 0000 0000 0000 0000
uid                  Lars Moelleken <voku@voku-online.de>
sub   00000/C0000000 2010-09-28

3.) öffentlichen Schlüssel veröffentlichen

Wenn du die zuvor angegebenen Daten ggf. noch einmal ändern möchtest, kannst du dies mit dem folgendem Befehl bewerkstelligen, ansonsten… überspringe diesen Befehl einfach.

gpg --edit-key voku@voku-online.de

Nun schauen wir uns unseren öffentliche Schlüssel an, dort sollte nun bereits dein Name + E-Mail Adresse hinterlegt sein…

gpg --list-keys

… außerdem finden wir hier unsere Schlüssel-ID (Key-ID), welche wir benötigen, um den öffentlichen Schlüssel zu veröffentlichen.

gpg --send-key E0000000

Nun testen wir als erstes ob der Schlüssel bereits online verfügbar ist…

gpg --keyserver keys.gnupg.net --search-keys voku@voku-online.de


Ubuntu

Auf diesem System hab ich eine grafischen Mail-Client installiert (Claws-Mail) und den öffentlichen Schlüssel importiert und unterschrieben (beglaubigt), so dass ich verschlüsselte E-Mails verschicken kann, welche nur das zuvor erwähnte Debian System lesen kann.

1.) Die nötige Software installieren…

sudo aptitude install pgp gnupg-agent 
sudo aptitude install claws-mail claws-mail-pgpinline claws-mail-pgpmime
sudo aptitude install seahorse

Ggf. sind einige der Programm bereits auf deinem System installiert.

2.) Öffentlichen Schlüssel importieren

Nun können wir mit dem folgendem  Befehl, den Öffentlichen-Key importieren…

gpg --keyserver keys.gnupg.net --search-keys voku@voku-online.de

… nun können wir uns die Key-ID mit folgendem Befehl anschauen …

gpg --list-keys

… und mit diesem Befehl beglaubigen. (E00000000 muss natürlich durch deine angezeigte Key-ID ersetzt werden)

gpg --sign-key E0000000

3.) Software verwenden

Nachdem du in Claws-Mail das PGP Plugin aktiviert hast (“Konfiguration” -> “Erweiterungen / Plugins”) kannst du beim verfassen einer E-Mail unter dem Menüpunkt “Optionen” -> “Datenschutzsystem” -> “PGP MIME”  auswählen und danach “Optionen” -> “Verschlüsseln” und nun wird die E-Mail verschlüsselt versendet. Natürlich lassen sich die öffentlichen und auch privaten Schlüssel global im System verwenden, so dass du nun auch z.B. mit “evolution” verschlüsselte E-Mails versenden kann


Debian

Wenn du ggf. deinen privaten Schlüssel, zum lesen von erhaltenen E-Mails auf mehreren PCs verwenden möchtest, musst du diesem erst Exportieren und auf dem Ziel-PC wieder importieren, wenn das nicht der Fall sein sollte, kannst du diese Schritte überspringen.

1.) Privaten Schlüssel abspeichern

Der nachfolgende Befehl exportiert deinen privaten Schlüssel, also Vorsicht wo du diesen abspeicherst und wie du diesen auf einen anderen PC kopierst.

gpg --export-secret-keys > secret.keys


Ubuntu

2.) Privaten Schlüssel importieren

Wenn wir den Key z.B. per “scp” auf unseren zweit Rechner kopiert haben, können wir diesen mit folgendem Befehl einfügen. (und die Datei danach löschen)

gpg --import secret.keys

Zusätzlich zu den bereits installieren Programmen installieren wir nun noch “seahorse-plugin” …

seahorse-plugins

… der Datei-Manager (nautilus) und der Text-Editor (gedit) unterstützen mit dem diesem Programm GPG-Entschlüsselung. (einfach rechte Maustaste auf eine gpg-Verschlüsselte Datei und auf  “Mit Datei entschlüsseln öffnen” klicken)


Debian

Kommen wir nun zur Konfiguration von Mutt . Da wir den Mail-Client bereits am Anfang des Beitrages installiert hatten, beschreibe ich hier die wichtigsten Einstellungen und zeige meine Konfiguration, welche leicht an andere E-Mail Accounts angepasst werden kann.

1.) Als erstes laden wir die Beispiel-Konfiguration herunter.

cd ~

wget http://suckup.de/muttrc.txt
mv muttrc.txt .muttrc

wget http://suckup.de/mailcap.txt
mv mailcap.txt .mailcap

mkdit -p ~/.mutt/cache/headers
mkdir ~/.mutt/cache/bodies

2.) Im zweiten Schritt ändern wir die Konfiguration (ein wenig)

vim .muttrc

#set spoolfile=”imaps://user@domain.de:993″
#set folder=”imaps://user@domain.de/INBOX”

<- Hier musst du deine IMAP-Daten eintragen…

# direkt per sendmail (z.B. wenn du direkt auf dem Server arbeitest)
#set sendmail=”/usr/sbin/sendmail -oem -t -oi”
#set smtp_url=”smtp://user@domain.de/”
# ssmtp musst installiert und konfiguriert sein…
#set sendmail=”/usr/sbin/ssmtp -fuser@domain.de -au user@domain.de -ap password”

<- Hier musst du deine SMTP-Daten (bzw. sendmail) eintragen, bitte für eine Methode entscheiden…

#set pgp_sign_as=E0000000

-> Hier trägst du deine Key-ID von deinem GPG-Schlüssel ein…


Der Mail-Client lässt sich bis ins kleinste konfigurieren, dazu ist die Konfiguration an den meisten Stellen bereits kommentiert und lässt sich nun bereits starten.: mutt

Hier noch ein paar hilfreiche Tipps:

m -> neue E-Mail schreiben (:wq -> und mit “y” am Ende bestätigen)
r -> antworten auf eine E-Mail
f -> weiterleiten einer E-Mail
e -> kompletten Header anzeigen lassen
c -> anderen Mail-Ordner öffnen
ENTER -> E-Mail lesen
SPACE -> nächste Seite einer E-Mail ansehen
q -> E-Mail wieder verlassen und zurück zur Postfach bzw. mutt beenden wenn du nicht in einer E-Mail bist
/ -> suchen, nach E-Mails oder im Inhalt von E-Mails oder in der Hilfe …
Pfeiltasten -> navigieren im Postfach (E-Mails auswählen)
? -> Hilfe anzeigen


Hier noch ein paar Links zum Thema:

http://www.gentoo.org/doc/en/gnupg-user.xml (Englisch)

http://www.kire.ch/linux/gnupg_spf.pdf

http://www.dewinter.com/gnupg_howto/

gpg --list-keys

Ubuntu aufräumen

Wer Ubuntu einmal aufräumen möchte, kann folgendes Skript dafür verwenden, außerdem kann man mit dem Programm localpurge überflüssige Sprach-Dateien löschen.


[stextbox id=”alert”]Nutzung auf eigene Gefahr und wie immer gilt, erst verstehen dann per “Copy&Past” kopieren![/stextbox]


#!/bin/bash

OLDCONF=$(dpkg -l|grep "^rc"|awk '{print $2}')
CURKERNEL=$(uname -r|sed 's/-*[a-z]//g'|sed 's/-386//g')
LINUXPKG="linux-(image|headers|ubuntu-modules|restricted-modules)"
METALINUXPKG="linux-(image|headers|restricted-modules)-(generic|i386|server|common|rt|xen)"
OLDKERNELS=$(dpkg -l|awk '{print $2}'|grep -E $LINUXPKG |grep -vE $METALINUXPKG|grep -v $CURKERNEL)
GELB="\033[1;33m"
ROT="\033[0;31m"
FARBLOS="\033[0m"

if [ $USER != root ]; then
  echo -e $ROT"Error: du bist nicht root"
  echo -e $GELB"Ende..."$FARBLOS
  exit 0
fi

echo -e $GELB"APT-Cache aufraumen..."$FARBLOS
aptitude autoclean

echo -e $GELB"nicht mehr benoetigte Abhaengigkeiten aufraumen..."$FARBLOS
apt-get autoremove

echo -e $GELB"alte Config-Dateien loeschen..."$FARBLOS
aptitude purge $OLDCONF

echo -e $GELB"alte Kernels loeschen..."$FARBLOS
aptitude purge $OLDKERNELS

echo -e $GELB"alle Trashes löschen..."$FARBLOS
rm -rf /home/*/.local/share/Trash/*/** &> /dev/null
rm -rf /root/.local/share/Trash/*/** &> /dev/null

echo -e $GELB"Alles sauber...!"$FARBLOS

Icinga

In diesem HowTo zeige ich wie du einen Monitoring-Server mit Icinga aufsetzt, dazu folgen einige Beispiele und eine optimierte Konfiguration.


Was ist Icinga?

Icinga ist ein “Fork” des wohlbekannten Überwachungssystems Nagios. Eine 100%ige Kompatibilität mit den internen Strukturen des letzteren erlaubt es Ihnen, mit Icinga alle Plugins und Addons zu benutzen, die von verschiedenen Firmen und der großen Community entwickelt wurden bzw. werden. Der Icinga-Dienst selbst läuft als eigenständiger Prozess mit eingeschränkten Rechten auf dem Server und lässt sich über die textbasierenden Konfigurationsdateien konfigurieren. Zudem läuft ein Web-Server (Apache2 + mod_cgi + mod_php5), um auf CGI basierende Web-Schnittstelle zum Abfragen der gesammelten Daten zuzugreifen. Wer bereits jetzt einen Blick auf die Software werfen will, sollte sich die Demo (User: guest, Passwort: guest) anschauen.


Windows-Server: Für das Monitoring von Windows-Servers kannst du die Software “NSClient++” einsetzten, in welcher nur das NRPE-Modul aktiviert werden muss, so dass Abfragen (Checks) serverseitig mit eingeschränkten Rechten ausgeführt werden und vom Monitoring-Server abgefragt werden können.

Linux-Server: Auch bei den Linux-Servern kommt ein NRPE-Server zum Einsatz, welcher die Abfragen (Checks) ebenfalls lokal ausführt und die Ergebnisse dem Monitoring-Server zur Verfügung stellt. Im laufe des HowTos, werde ich noch zeigen, wie man diesen installiert und konfiguriert.

SNMP: Einige Netzwerkkomponenten z.B. der Datendurchsatz von einigen Netzwerk-Schnittstellen, Temperaturwerte u.s.w. … können mittels SNMP abgefragt werden. Für diesen Zweck werden noch einige Erweiterungen (Plugins) für Icinga installiert.


Welches Betriebssystem?

In meinen Test nutze ich “Debian” in der aktuellen Version mit dem Codenamen “Lenny” . “Icinga” liegt in den nun offiziellen Backports bereits als vorkompiliertes Paket in den  Softwarequellen vor und kann daher leicht installiert und aktualisiert werden.


Vorbereitung der Umgebung

Betriebssystem
Ich nutze eine Standard Distribution von Debian (Lenny) mit minimalen vorinstallierten Anwendungen. Die Distribution bringt ein breites Spektrum am Software mit, so dass als erstes ein SSH-Server (openssh-server), Mailserver (postfix) und ein Webserver (apache2) nachinstalliert wurden. Wer sich mit der Paketverwaltung von Debian noch nicht so gut auskennt, sollte sich zuvor folgenden Post-Post durchlesen: suckup.de/blog/2010/02/13/aptitude-dpkg/


Monitoring-Server
Die Installation von Icinga wird über die Paketverwaltung des Betriebssystems realisiert, dazu müssen jedoch die zuvor erwähnten Backports mit im System aufgenommen werden.

echo 'deb http://backports.debian.org/debian-backports lenny-backports main' >> /etc/apt/sources.list
echo 'Package: *' >> /etc/apt/preferences
echo 'Pin: release a=lenny-backports' >> /etc/apt/preferences
echo 'Pin-Priority: 200' >> /etc/apt/preferences
apt-get updat

Installiert wurden die folgenden Pakete und dessen Abhängigkeiten.:

aptitude install icinga icinga-doc nagios-snmp-plugins nagios-nrpe-plugin

[stextbox id=”warning”]Hinweis: Bitte darauf achten, dass Nagios3 nicht mit installiert wird, da dies vom nagios-nrpe-plugin empfohlen wird.[/stextbox]

Die Pakete „nagios-plugins“, „nagios-plugins-standard“ – die Nagios-Plugins werden ebenfalls automatisch als Abhängigkeit per Paketverwaltung installiert, und werden bei Ininga automatisch in der folgenden Konfigurations-Datei integriert.


Konfiguration von Icinga

Als erstes zeige ich anhand von einem Schaubild, wie die Konfiguration später aussieht. In dem Schaubild sind jedoch nicht alle Konfigurations-Dateien vorhanden, dies dient nur der Veranschaulichung.


konfig_1

konfig_2

Hauptkonfigurationsdatei: icinga.cfg
In der Hauptkonfigurationsdatei werden Basisparameter der Monitoring-Software festgelegt. Da bereits die Nagios-Plugins, dass heißt die einzelnen Prüf-Programme (Checks) für z.B. SSH, SMTP, FTP u.s.w. über die  Paketverwaltung des Betriebssystems installiert wurden, wurden die bereits mit folgender Zeile mit aufgenommen.

cfg_dir=/etc/nagios-plugins/config/

Des-weiteren gibt die nächste Zeile an, welches Verzeichnis von Icinga rekursiv nach Dateien, welche auf .cfg enden, durchsucht wird, so dass weitere Konfigurations-Dateien einfach angelegt werden können.

cfg_dir=/etc/icinga/objects/

Bisher haben wir noch nichts an der Konfiguration geändert, ich habe die angesprochen Zeilen nur erwähnt, um die Konfiguration besser verstehen zu können. Aus dem selben Grund, stelle ich hier einmal kurze die Verzeichnisstruktur (tree) der Konfiguration dar.:

|– cgi.cfg
|– commands.cfg
|– objects
|   |– contact
|   |   |– contactgroups.cfg
|   |   |– contacts.cfg
|   |   `– contacts_templates.cfg
|   |– hosts
|   |   |– intern
|   |   |   |– linux_server.cfg
|   |   |   |– windows_server.cfg
|   |   |   |– drucker.cfg
|   |   |   `– […]
|   |   |– host_templates.cfg
|   |   |– hostextinfo.cfg
|   |   |– hostgroups.cfg
|   |   |– kunden
|   |   |   |– kunde1.cfg
|   |   |   |– kunde2.cfg
|   |   |   `– […]
|   |– services
|   |   |– services_host.cfg
|   |   `– services_templates.cfg
|   `– timeperiods.cfg
|– htpasswd.users
|– icinga.cfg
|– resource.cfg

[stextbox id=”info”]Tipp: Um über die Weboberfläche per CGI Befehle auszuführen, müssen wir “check_external_commands” von “0” auf “1” umstellen und dem Webserver (CGI) die Rechte auf folgende Datei geben.[/stextbox]

check_external_commands=1

dpkg-statoverride --update --add nagios www-data 660 /var/lib/icinga/rw/icinga.cmd


CGI-Konfigurationsdatei: cgi.cfg
In dieser Datei werden die Zugriffsrechte für die zuständigen Benutzer und einige Einstellungen bezüglich der Weboberfläche festgelegt.


Kommando-Konfigurationsdatei: commands.cfg
Alle Abfragen welche nicht bereits mit den Nagios-Plugins installiert wurden, z.B. speziell entwickelte Skripte oder Kommandos zum Senden von SMS / E-Mails werden in dieser Datei definiert.

cd /etc/icinga/
wget http://suckup.de/commands.txt
mv commands.txt commands.cfg


Objekt-Konfigurationsdateien: objects/*.cfg
Kommen wir zur Host- / Servicekonfiguration und dessen Verzeichnisstruktur, um mit Vorlagen und Vererbungen zu arbeitet, gehen wir wie folgt vor.:

[stextbox id=”warning”]Bitte nicht einfach alle Befehle nacheinander per “Copy&Past” einfügen, überlege was du tust und falls du bereits etwas an Icinga konfiguriert hast, sicher diese Datei vorher!!![/stextbox]

cd /etc/icinga/objects/

rm *.cfg
wget http://suckup.de/timeperiods.txt
mv timeperiods.txt timeperiods.cfg

rm timeperiods_icinga.cfg
mkdir contact/ doc/ hosts/ services/

rm extinfo_icinga.cfg generic-host_icinga.cfg generic-service_icinga.cfg  hostgroups_icinga.cfg localhost_icinga.cfg services_icinga.cfg  contacts_icinga.cfg
cd contact/

wget http://suckup.de/contacts_templates.txt
mv contacts_templates.txt  contacts_templates.cfg

wget http://suckup.de/contacts.txt
mv contacts.txt  contacts.cfg

wget http://suckup.de/contactgroups.txt
mv contactgroups.txt contactgroups.cfg

cd ..

[stextbox id=”info”]Tipp: In der Datei „contacts.cfg“ kannst du nun neue User eintragen und diese in der Datei  „contactgroups.cfg“ zu einer Gruppe zusammenfassen.[/stextbox]

cd hosts/
mkdir intern/ kunden/

wget http://suckup.de/host_template.txt
mv host_template.txt host_template.cfg

wget http://suckup.de/hostgroups.txt
mv hostgroups.txt hostgroups.cfg

[stextbox id=”info”]Tipp: In der Datei „hostgroups.cfg“ werden den Hostgruppen z.B. allen Windows-Server bestimmte Services zugeordnet, so dass in der Hostkonfiguration [intern/ und kunden/] nur noch die Hostgruppe zugeordnet werden muss, um alle zugeordneten Services zu checken.[/stextbox]

wget http://suckup.de/hostextinfo.txt
mv hostextinfo.txt hostextinfo.cfg

[stextbox id=”info”]Tipp: Um die „alte“ hostmap zu verwalten, kann man sich folgendes kleine Perl-Skript herunterladen, damit hat man eine GUI in der man die bereits eingetragenen hosts auf der Karte positionieren kann. Einfach mal bei google nach „nagios-2d-editor“ suchen.[/stextbox]

cd intern/

wget http://suckup.de/switch.txt
mv switch.txt switch.cfg

wget http://suckup.de/linux_server.txt
mv linux_server.txt linux_server.cfg

cd ..
cd kunden/

wget http://suckup.de/kunde1.txt
mv kunde1.txt kunde1.cfg

cd ../../services/

Die hier zur Verfügung gestellten Dateien (hostextinfo.cfg, switch.cfg, linux_server.cfg, kunde1.cfg) müssen natürlich noch angepasst, werden (Hostnamen, Domain, Kunden-Name, IP-Adresse, Abhängigkeiten…) und halten einzig der Veranschaulichung der Konfiguration her. :-)

wget http://suckup.de/services_templates.txt
mv services_templates.txt services_templates.cfg

wget http://suckup.de/services_host.txt
mv services_host.txt services_host.cfg

Auch die hier zur Verfügung gestellt Datei (services_host.cfg) muss im Produktiv-System noch angepasst werden, weitere hilfreiche Tipps befinden sich als Kommentare in den Dateien selbst.

Wer bisher jeden Host und Service komplett in die „hosts.cfg“ und „services.cfg“ geschriben hat, kann mit der zuvor erklärten Methode zirka 90% der Konfiguration einsparen, zudem wird das ganze übersichtlicher und es schleichen sich weniger Fehler ein.


konfig_3

[stextbox id=”info”]Tipp: Wenn du das Passwort, welches du bei der Installation angegeben hast, vergessen solltest, kannst du es per “htpasswd” neu setzten und auch neue User anlegen, dazu musst du neuen Usern die passenden Rechte in der “cgi.cfg”-Datei zuweisen .[/stextbox]


Nagios-Plugins

Damit Icinga in der Lage ist Server (Dienste) und andere Ressourcen zu überprüfen, wurden die verschiedene Plugins bereits bei der Vorbereitung der Monitoring-Umgebung installiert, jedoch fehlten ggf. noch Plugins welche wir zusätzlich verwenden möchten, um diese mit in die Konfiguration auszunehmen, gehen wir wie folgt vor.:

1.) In dem folgendem Verzeichnis legen wir das Check-Programm ab…

cd /usr/lib/nagios/plugins/

2.) Tragen das dazu passende Kommando in dieser Datei ein…

vim /etc/icinga/commands.cfg

3.) Fügen ggf. eine neue Gruppe hinzu oder nutzen eine bestehende und fügen den ensprechenden Service_Check hinzu…

vim /etc/icinga/objects/hosts/hostgroups.cfg

4.) Nun können wir die Gruppe in allen Hosts verwenden…

vim /etc/icinga/objects/hosts/[intern|kunden]/*.cfg


Performancedaten darstellen: PNP

Als nächstes wollen wir einige Performance-Daten visuell darstellen, dafür installieren wir PNP4NAGIOS. Wie dieses Programm funktioniert findest du weiter unten…

Einige Abhängigkeit wurden als erstes nachinstalliert.

aptitude install g++ make php5 php5-gd rrdcollect rrdtool librrdp-perl librrds-perl

Als nächstes wurde der Quellcode heruntergeladen, entpackt und für das laufende System konfiguriert.

cd /usr/src/
VERSION=0.6.6
wget http://downloads.sourceforge.net/project/pnp4nagios/PNP-0.6/pnp4nagios-$VERSION.tar.gz
tar -xvzf pnp4nagios-$VERSION.tar.gz
cd pnp4nagios-$VERSION
./configure

Danach wurden die in C geschriebenen Komponenten kompiliert.

make all

Und mit dem folgenden Befehlen wurden die Dateien (Programm, Konfiguration, zusätzliche Webserver-Konfiguration…) an die passende Stelle im Dateisystem kopiert.
make install && make install-webconf && make install-config && make install-init

Die Software wurde nun noch in Icinga integriert, dafür muss die “icinga.cfg“-Datei wie folgt angepasst werden.

# Performance-Daten aktivieren
process_performance_data=1
# Service Performance-Daten
service_perfdata_file=/usr/local/pnp4nagios/var/service-perfdata
service_perfdata_file_template=DATATYPE::SERVICEPERFDATA\tTIMET::$TIMET$\tHOSTNAME::$HOSTNAME$\tSERVICEDESC::$SERVICEDESC$\tSERVICEPERFDATA::$SERVICEPERFDATA$\tSERVICECHECKCOMMAND::$SERVICECHECKCOMMAND$\tHOSTSTATE::$HOSTSTATE$\tHOSTSTATETYPE::$HOSTSTATETYPE$\tSERVICESTATE::$SERVICESTATE$\tSERVICESTATETYPE::$SERVICESTATETYPE$
service_perfdata_file_mode=a
service_perfdata_file_processing_interval=15
service_perfdata_file_processing_command=process-service-perfdata-file
# Host Performance-Daten
host_perfdata_file=/usr/local/pnp4nagios/var/host-perfdata
host_perfdata_file_template=DATATYPE::HOSTPERFDATA\tTIMET::$TIMET$\tHOSTNAME::$HOSTNAME$\tHOSTPERFDATA::$HOSTPERFDATA$\tHOSTCHECKCOMMAND::$HOSTCHECKCOMMAND$\tHOSTSTATE::$HOSTSTATE$\tHOSTSTATETYPE::$HOSTSTATETYPE$
host_perfdata_file_mode=a
host_perfdata_file_processing_interval=15
host_perfdata_file_processing_command=process-host-perfdata-file

In der “commands.cfg” Konfiguration müssen zudem zwei neue Kommandos eingefügt werden, sofern diese nicht bereits vorhanden sind.

define command{
command_name        process-service-perfdata-file
command_line        /bin/mv /usr/local/pnp4nagios/var/service-perfdata /usr/local/pnp4nagios/var/spool/service-perfdata.$TIMET$
}
define command{
command_name        process-host-perfdata-file
command_line        /bin/mv /usr/local/pnp4nagios/var/host-perfdata /usr/local/pnp4nagios/var/spool/host-perfdata.$TIMET$
}
mv /usr/local/pnp4nagios/etc/npcd.cfg-sample /usr/local/pnp4nagios/etc/npcd.cfg

mv /etc/httpd/conf.d/pnp4nagios.conf /etc/apache2/conf.d/pnp4nagios.conf

In folgender Datei muss der Pfad zur passwd-Datei bearbeitet werden:

vim /etc/apache2/conf.d/pnp4nagios.conf

AuthUserFile /etc/icinga/htpasswd.users

rmdir /etc/httpd/conf.d && rmdir /etc/httpd/ && apache2ctl restart

[stextbox id=”info”]Tipp: Um nun zu prüfen, ob alle Voraussetzen erfüllt sind, rufen wir einfach die entsprechend Webseite auf: z.B.: http://icinga.test.de/pnp4nagios/[/stextbox]

Schlussendlich wird PNP mit folgender Konfigurationszeile in einer Host-Definition bzw. dessen Vorlage in die Weboberfläche integriert:

action_url     /pnp/index.php?host=$HOSTNAME$&srv=$SERVICEDESC$


pnp4nagios

Quelle: (3)

PNP4nagios Funktionsweise
PNP wird wie bereits zuvor beschrieben im Bulk-Modus (mit NPCD) betrieben. Dies bedeutet, dass die Performance-Daten in einem Verzeichnis gesammelt werden und dann von dem NPCD (Nagios Performance Data C Daemon) Dienst verarbeitet werden. Gegenüber dem Standard-Modus hat dieser den entscheidenden Vorteil, dass das Programm zur Verarbeitung der Performance-Daten nicht bei jeder Überprüfung (Check) ausgeführt werden muss und somit Systemressourcen eingespart werden.


pnp4nagios_config

Quelle: (3)

Monitoring-Client

Der „Nagios Remote Plugin Executor“ (NRPE) wird benötigt, um lokale Ressourcen auf den zu überwachenden Servern für den Nagios-Server bereitzustellen. Der NRPE-Dienst führt diese Überprüfungen wiederum über lokale Plugins aus. Unter Debian kann man den NRPE-Server mit folgendem Befehl installieren:

aptitude install nagios-nrpe-server nagios-plugins nagios-plugins-basic

Nun geben wir noch an, welche IP-Adresse auf die Daten zugreifen darf, also die IP-Adresse vom Monitoring-Server.

vim /etc/nagios/nrpe.cfg

allowed_hosts=X.X.X.X

Einige Kommandos sind bereits in der Datei nrpe.cfg definiert, diese Kommentieren wir jedoch nun aus und schreiben alle unsere Kommandos in die folgende Datei.

vim /etc/nagios/nrpe_local.cfg

z.B.:

# check system
command[check_users]=/usr/lib/nagios/plugins/check_users -w 5 -c 10
command[check_load]=/usr/lib/nagios/plugins/check_load -w 15,10,5 -c 30,25,20
command[check_zombie_procs]=/usr/lib/nagios/plugins/check_procs -w 5 -c 10 -s Z
command[check_total_procs]=/usr/lib/nagios/plugins/check_procs -w 150 -c 200
command[check_syslog]=/usr/lib/nagios/plugins/check_procs -C syslogd -c 1:1
command[check_retro]=/usr/lib/nagios/plugins/check_procs -C retroclient -w 1:20 -c 1:20
command[check_process]=/usr/lib/nagios/plugins/check_procs -C process.pl -w 1:1 -c 1:1
command[check_mailq]=/usr/lib/nagios/plugins/check_mailq -M postfix -w 250 -c 1000
command[check_procs]=/usr/lib/nagios/plugins/check_procs -w 250 -c 300
command[check_cron]=/usr/lib/nagios/plugins/check_procs -C cron -w 1:20 -c 1:20
command[check_bacula-fd]=/usr/lib/nagios/plugins/check_procs -C bacula-fd -w 1:1 -c 1:1
command[check_freshclam]=/usr/lib/nagios/plugins/check_procs -C freshclam -w 1:1 -c 1:1
command[check_amavisd]=/usr/lib/nagios/plugins/check_procs -u amavis -a amavisd -w 2:4 -c 1:5
command[check_clamd]=/usr/lib/nagios/plugins/check_procs -C clamd -w 1:5 -c 0:6
command[check_mysql]=/usr/lib/nagios/plugins/check_mysql -H 127.0.0.1 -u nagios -p test123
command[check_ssh]=/usr/lib/nagios/plugins/check_ssh -H 127.0.0.1
command[check_amavis_port]=/usr/lib/nagios/plugins/check_tcp -H 127.0.0.1 -p 10025
command[check_spamd]=/usr/lib/nagios/plugins/check_procs -C spamd -c 1:10

# check disks
command[check_disk_root]=/usr/lib/nagios/plugins/check_disk -w 1000 -c 750 -p /
command[check_disk_tmp]=/usr/lib/nagios/plugins/check_disk -w 200 -c 100 -p /tmp
command[check_disk_var]=/usr/lib/nagios/plugins/check_disk -w 1000 -c 750 -p /var
command[check_swap]=/usr/lib/nagios/plugins/check_swap -w 80% -c 25%


nrpe

Quelle: (4)

Qualitätssichernde Maßnahmen

Um die syntaktische Korrektheit der Konfiguration zu prüfen,  geben wir folgenden Befehl ein:

icinga -v /etc/icinga/icinga.cfg

[stextbox id=”info”]Tipp: In größeren Umgebungen kann es von Vorteil sein, die einzelnen Netzwerkkomponenten mit einem eindeutigem DNS-Hostnamen eingetragen.[/stextbox]


Anhang A

Literaturverzeichnis

(1) [nagios-buch] Wolfgang Barth, Nagios System- und Netzwerk-Monitoring, Open Source Press, 2008
(2) [icinga-webseite] Icinga, http://www.icinga.org
(3) [pnp-webseite] PNP, http://docs.pnp4nagios.org
(4) [nagios-doku] Nagios3, http://nagios.sourceforge.net/docs/3_0/


Anhang B

Glossar

CGI-Programme/Skripte – Das Common Gateway Interface (zu deutsch etwa „Allgemeine Vermittlungsrechner-Schnittstelle“) kann Webseiten dynamisch generieren. In Nagios werden die Statusberichte in der Weboberfläche mittels CGI-Programmen erstellt.

DNS – Der Domain Name Service ist ein Dienst zur Auflösung von Hostnamen in IP-Adressen und umgekehrt.

PING – Dies ist ein Programm, mit dem überprüft werden kann, ob ein bestimmter Host erreichbar ist und welche Zeit das Routing zu diesem hin und wieder zurück in Anspruch nimmt.

SMTP – Das Simple Mail Transfer Protocol (zu deutsch etwa „Einfaches E-Mail-Sendeverfahren“) ist ein Protokoll der Internetprotokollfamilie, das zum Austausch von E-Mails in Computernetzen dient.

SNMP – Das Simple Network Management Protocol (zu deutsch etwa „einfaches Netzwerkverwaltungsprotokoll“) dient zur Verwaltung von Netzwerkgeräten. Alle Parameter die über das Netzwerk ausgelesen und gesetzt werden können sind in der Management Information Base von dem jeweiligen Gerät eingetragen.


Anhang C

Abhängigkeitsprüfungen

Das nachfolgende Bild zeigt ein Diagramm von Netzwerkkomponenten und deren Abhängigkeiten, die von Nagios überwacht werden.
Switch2 ist in diesem Beispiel gerade nicht mehr erreichbar und somit in einen Problemzustand gewechselt. Nagios muss feststellen, ob der Host selber down ist oder nur nicht mehr erreichbar ist, weil eine weitere Netzwerkkomponente zuvor ausgefallen ist.
Es werden parallele Prüfungen für die direkten Nachbarn ausgelöst. Monitor1 und File1 werden zudem gleichzeitig parallel überprüft, da Switch2 von diesen abhängig ist.


nagios

Quelle: (4)

Anhang D

Topologie eines Beispielnetzwerks


nagios2

Quelle: (1)

1.) ein kritischen Zustand eines Dienstes wird festgestellt
2.) der dazu passende Host wird überprüft und ist nicht erreichbar
3.) die Abhängigkeiten des Hosts werden parallel überprüft
4.) der switch1 ist noch vom Nagios-Server (nagios) aus zu erreichen
5. – 6.)    die nachfolgenden Netzwerkkomponente sind momentan nicht erreichbar

In diesem Beispiel würde nur eine Benachrichtigung für den ausgefallenen switch2 generiert werden.

Gloobus-Vorschau für Ubuntu

Das Programm Gloobus zeigt, wie im folgendem Video zu sehen ist, von Dateien (Bildern, Archiven, Musik, Video…) eine Vorschau an, dabei wird dieser Vorschau durch das anklicken der Datei und einen darauf folgendem drücken der Leertaste aktiviert. Seht praktisch ist zudem die Option, (Zubehör -> Gloobus Preview -> Einstellungen -> “Bei Fokusverlust beenden”) das Programm automatisch zu schließen, sobald der Fokus nicht mehr auf dem Programm (Gloobus) ist.



Install: Gloobus

sudo add-apt-repository ppa:gloobus-dev/gloobus-preview
sudo apt-get update && sudo aptitude install gloobus-preview


Nun müssen wir noch eine Tastenkombination erstellen, um z.B. per <Strg> + <Space> die Vorschau zu anzuzeigen, alternativ können wir jedoch zusätzlich Nautilus Elementary (2.30) installieren und können direkt per Leertaste die Vorschau anzeigen lassen.


Install: Nautilus Elementary

sudo add-apt-repository ppa:am-monkeyd/nautilus-elementary-ppa
sudo apt-get update && sudo aptitude upgrade nautilus


Nun müssen wir den Dateimanager (Desktop) nur noch mit folgendem Befehl neu-starten.

nautilus -q