Mal wieder Apache Paranoia

Um nichts nach außen dringen zu lassen sollte man die folgende Direktiven in seine Apache Konfig einbauen:

TraceEnable Off
FileETag None

TraceEnable kann man auf einem Livesystem ausschalten, denn dort führt man sowieso kein Debuggen oder ähnliches aus. FileETag abschalten führt zwar zu etwas mehr Last, aber bevor man sich mit dem Aufwand dafür herum schlägt oder mehr Server hinter einem Loadbalancer im Einsatz hat, lohnt es sich die Direktive zu deaktivieren. Das sagt sogar Yahoo.

WordPress sicher administrieren

Das Admininterface meines Blogs schütze ich logischerweise mit ssl. Dazu habe ich in die wp-config.php folgendes Eingetragen:

define('FORCE_SSL_ADMIN', true);
define('FORCE_SSL_LOGIN', true);

Jetzt habe ich aber auch Plugins installiert, die von https scheinbar noch nie was gehört haben. Jedenfalls funktionieren ein paar Sachen im Backend danach nicht mehr sauber. Eigentlich der Hammer und eigentlich ein Grund die entsprechenden Plugins gleich zu entsorgen. Wären die nur nicht mal so praktisch … Also muss wohl ein Workaround her. Zugegeben, der Workaround ist eher der Holzhammer aber erfunktioniert. Folgendes habe ich beim vhost in Apache ergänzt:

 
  ExtFilterDefine sslfix_rstf mode=output intype=text/html \
    cmd="/bin/sed 's|http://gmbd.de/wp-content/plugins|https://gmbd.de/wp-content/plugins|g' -"
  
    SetOutputFilter sslfix
  

Wichtig, dass es auf die Location „/wp-admin“ eingegrenzt ist und damit nur bei der Administration anschlägt. Ansonsten bremst das schon ordentlich. In der mod_ext_filter steht zur Performance folgendes:

Even when the performance characteristics are not suitable for production use, mod_ext_filter can be used as a prototype environment for filters.

Prevent Dos Attacks

Auf der HAProxy News Seite habe ich eben den kurzen Artikel „HAProxy to counter DoS attacks“ gelesen. Willy Tarreau schreibt dort warum HAProxy gegen Slowloris hilft. Sehr lesenswert! Ein Grund mehr warum HAProxy mein favorisierter Loadbalancer für http(s) ist.

Aber auch ohne HAProxy lässt sich solch ein Angriff beim Apache Webserver abwehren. Dafür kann man mod_qos nehmen. Eine gute kurze Anleitung für Debian findet sich wie so häufig bei howtoforge.com. Das Modul baue ich mir sicher vor dem nächsten Rothsee-Triathlon-Festival auf meinem Server ein 😀

Wehe dem, der slowloris gegen meine private Kiste einsetzt! 😀

PHP Notizen

Hab mal wieder eben was mit PHP zu tun gehabt. Daher 2 Notizen:

  1. Fehlermeldungen in PHP einschalten:
    Statt immer den Webserver oder die PHP.ini umzustellen reicht natürlich auch folgender Code im Skript:

    error_reporting(E_ALL);
    ini_set('display_errors', '1');
    
  2. Zeilenumbrüche unabhängig vom Betriebssystem:
    Warum Windows das anders macht als Linux/Unix nervt mich schon immer. Jedenfalls werde ich ab sofort statt „\r\n“ bzw. „\n“ in Zukunft die PHP Konstante PHP_EOL nehmen! Also sowas wie:

    $msg .=  PHP_EOL;
    

vlogger – Apache logfiles aufräumen

Nachdem ich die Konfiguration meiner VHosts auf meinem Notebook aufgeräumt habe, war jetzt mein Server dran. Dort habe ich mich um die Logfiles gekümmert und sie sauber getrennt. Dazu kommt jetzt vlogger zum Einsatz. Folgende 3 Zeilen in der apache2.conf machen die Arbeit:

ErrorLog "|/usr/sbin/vlogger -e -s error.log /var/log/apache2/"
LogFormat "%{Host}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" vlogger
CustomLog "|/usr/sbin/vlogger -s access.log /var/log/apache2/" vlogger

Sämtliche CustomLog Einträge bei den jeweiligen VHosts sind dann überflüssig. Vlogger erstellt pro virtuellen Host ein Verzeichnis unter /var/log/apache2 mit dem Namen des Hosts.

Apache vhost_alias

Ich hab ja schon mal hier geschrieben, dass ich für meinen localhost zig Hostnames angelegt habe. Darüber kann ich die Entwicklung der einzelnen Projekte super trennen. Jedes Projekt hat darüber seine eigene URL (z.B. http://intranet.localhost/). Bisher habe ich für jede URL einen virtuellen lokalen Webserver konfiguriert. Schöner Aufwand. Heute habe ich das endlich umgestellt und nutze jetzt mod_vhost_alias. Damit passiert das alles automatisch. Sehr geil. Hier mein neuer VHost:


        ServerName localhost
        VirtualDocumentRoot /var/www/%1
        
                Options FollowSymLinks
                AllowOverride None
        

Damit lege ich pro Projekt jetzt nur noch den Hostnamen an (projektname.localhost) und dann noch den Symlink auf das entsprechende Projektverzeichnis:

ln -s [Projekverzeichnis] /var/www/projektname

Fertig.

Top 10

Toms Kommentar hat mich mal motiviert meine aktuellen Top 10 aus der [[FOSS]] hier auf zu schreiben.

  1. KVM
    Virtualisierung ist das Thema Nummer eins zur Zeit. Damit sind erst viele andere Sachen möglich. Aktuell lasse ich Dank KVM ein Centos 4.7 auf einer Centos 5.2 als VM laufen. Xen ist raus gefallen aus meiner Top 10 Liste. Es mag zwar sicherer sein aber wer es nicht schafft aktuell zu bleiben fliegt raus.
  2. OpenNMS
    OpenNMS ist wirklich super. Dank Autodiscover hat man super schnell sein Netzwerk integriert und überwacht. Die integrierten Collectoren und Monitore erlauben es auch ganz einfach eigene Test zu integrieren ohne dass man was programmieren muss. Nagios hat es leider nicht mir in die Liste geschafft. Die Nagios Entwicklung ist leider viel zu langsam und Nagios selbst fehlen viel zu viele Selbstverständlichkeiten. Der Zug ist abgefahren.
  3. HAProxy
    HAProxy ist endlich ein wirklicher HTTP(s) Loadbalancer mit allen Features die man braucht. In Minuten eingerichtet und performant ohne Ende. LVS mag zwar ganz nett sein für andere TCP Geschichten aber ehrlich gesagt hatte ich noch nie für etwas anderes wie HTTP(s) Bedarf.
  4. Heartbeat
    Heartbeat ist meine HA-Lösung und dass obwohl ich hier immer noch auf die Version 1! setze. Bei meinen Cluster laufen normalerweise die Resourcen sowieso auf beiden Nodes, so dass ich nur die IP schwenken muss. Trotzdem muss ich mir mal Pacemaker genauer ansehen um beim Ausfall einer Resource auch zu schwenken.
  5. Quagga
    Nichts ist schlimmer als den Überblick zu verlieren. Quagga ist der Routing Daemon unter Linux für mich. Dank der „Cisco“-like Konfiguration kommt man sofort damit zu recht. Perfekt!
  6. WordPress
    Dank WordPress dokumentieren ich endlich meine privaten IT Krempel und finde ihn auch wieder. Durch die Öffentlichkeit meines Blogs bekomme ich auch sehr viel Tipps und Anregungen.
  7. OpenVPN
    Bei OpenVPN fehlt mir nur noch der Client fürs Handy. Zusammen mit Quagga ist OpenVPN wirklich super.
  8. Apache Http Server
    Obwohl es zig andere leichtere Server gibt ist der Apache immer noch mein Arbeitspferd. Richtig konfiguriert ist er richtig schnell.
  9. Postfix
    Kein MTA Daemon ist für mich schneller und einfacher eingerichtet. Neben der Performance von Postfix schätze ich auch die leichte Erweiterbarkeit.
  10. Bacula
    Backups sind super wichtig. Bacula hat mir schon oft den Hintern gerettet. Danke!

Mal sehen wie sich die Statistik so weiter entwickelt. Vor einem halben Jahr oder früher hätte sie noch ganz anders ausgesehen (Xen, Nagios, Exim, dokuwiki, LVS, …)

mod_setenvif

Weiter auf der Suche nach ein wenig mehr Performance auf meinem Apache Server habe ich wieder was eingestellt. Bei meiner Konfig sendet der Server die Apache internal dummy connections an den konfigurierten localhost. Der logt diese auch brav mit. Aber wen interessiert diese Einträge? Ich will die IOs verhindern. Daher habe ich folgende Zeilen in der Konfig ergänzt:

  SetEnvIf Remote_Addr "127\.0\.\.1" dontlog
  CustomLog /var/www/localhost/log/access.log combined env=!dontlog

Jetzt stellt sich für mich nur die Frage, ob das Laden des Moduls setenvif und diese Prüfung pro Request nicht mehr Resourcen fressen als das simple Speichern.

Spiderman is having me for dinner tonight… Teil 3

Ich hab ja schon in Teil 1 geschrieben, dass ich apc einsetze. Das Teil bringt ohne irgend welche Programmierung schon einiges. Es hält den Bytecode der PHP-Skripts im Speicher. Den Erfolg kann man ganz einfach so abrufen:

print_r(apc_cache_info());

Mit ein bisschen Programmieraufwand kann man Dank apc noch viel mehr rausholen. Auf rothsee-triathlon.de ist nicht alles neu und in php. Manche Teile laufen auch als alte Perl Skripts im Hintergrund. Die Hole ich mir dann per http zur Laufzeit rein. Nachdem das aber immer wieder die gleichen Files sind lässt sich der Content prima cachen. Also hab ich eine Funktion für diesen Zweck definiert:

function request_cache($url) {
        if (function_exists('apc_fetch')) {
           $md5=md5($url);
           $doc = apc_fetch($md5,&$success);
	   if(!$success) {
		$doc = file_get_contents($url);
		if ($doc === false) return "";
		apc_store($md5, $doc);
                $doc .= "\n";
           } else {
                $doc .= "\n";
           }
	} else {
		$doc = file_get_contents($url);
                $doc .= "\n";
        }

	return $doc;
}

und rufe sie wie folgt auf:

$value = request_cache($request);

Die gecachte Seite ist „nur“ ca. um den Faktor 100 schneller. Kleiner Aufwand hoher Nutzen. Sehr geil.