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.

VN:F [1.9.22_1171]
Rating: 0.0/10 (0 votes cast)
VN:F [1.9.22_1171]
Rating: 0 (from 0 votes)

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! 😀

VN:F [1.9.22_1171]
Rating: 0.0/10 (0 votes cast)
VN:F [1.9.22_1171]
Rating: 0 (from 0 votes)

Mehr Speicher

Ich hab meinen Server endlich mehr Speicher gegeben. Mit den bisherigen 512MB war er doch oft sehr am Limit. Jetzt hat er stolze 4GB. Natürlich habe ich gleich den Speicher gerecht unter den Hauptdaemons (MySQL und Apache) auf dem Server aufgeteilt.

Mysql war einfach. Dort hab ich einfach die Standard my.cnf von Debian durch die my-large.cnf ausgetauscht. Fertig. Mal sehen ob das was bringt.

Nachdem alle meine Anwendungen auf dem Server unter PHP laufen haben ich mich beim Apache primär auf den APC gestürzt. Da habe ich den stolzen 32MB Cache eben vervierfacht. Für den 128MB Cache sind folgende Einträge notwendig:

/etc/sysctl.conf:

kernel.shmall = 134217728
kernel.shmmax = 134217728

Danach Aktivieren mit:

sysctl -p

Und noch APC konfigurieren:
/etc/php5/apache2/conf.d/apc.ini

apc.shm_size=128

Noch Apache neustarten. Fertig.

Mal sehen ob ich mir jetzt das Swappen nicht mehr so oft anhören muss Mein Server steht im Arbeitszimmer neben mir und da kann ich tatsächlich hören, wenn er swapt. 🙂

VN:F [1.9.22_1171]
Rating: 0.0/10 (0 votes cast)
VN:F [1.9.22_1171]
Rating: 0 (from 0 votes)

nginx – sagt mir (noch) nix

Oha, eben habe ich bei Netcraft gelesen, dass nginx der dritt beliebteste Webserver hinter Apache und IIs ist (ausgenommen den Google-Webserver). Lighttpd oder Cherokee werden nicht mal erwähnt. Ich bin überrascht weil er mir so gar nichts bisher gesagt hat. Aber scheinbar ist er wirklich interessant. nginx ist wohl deutlich mehr als ein Webserver, der Artikel hinter diesem Link zeigt auf, dass er für wordpress.com eingesetzt wird und dort sogar das Loabalancing von Pound übernommen hat. Sie hatten sich vorher die üblichen Verdächtigen LVS, HAProxy, Perlbal angesehen.

Damit kommt der Webserver unbedingt auf die „merke ich mir Liste

VN:F [1.9.22_1171]
Rating: 0.0/10 (0 votes cast)
VN:F [1.9.22_1171]
Rating: 0 (from 0 votes)

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:

1
2
3
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.

VN:F [1.9.22_1171]
Rating: 0.0/10 (0 votes cast)
VN:F [1.9.22_1171]
Rating: 0 (from 0 votes)

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:

1
2
3
4
5
6
7
8
<VirtualHost *>
        ServerName localhost
        VirtualDocumentRoot /var/www/%1
        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>
</VirtualHost>

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.

VN:F [1.9.22_1171]
Rating: 0.0/10 (0 votes cast)
VN:F [1.9.22_1171]
Rating: 0 (from 0 votes)

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.

VN:F [1.9.22_1171]
Rating: 0.0/10 (0 votes cast)
VN:F [1.9.22_1171]
Rating: 0 (from 0 votes)

Spiderman is having me for dinner tonight… Teil 2

Gestern Abend (gegen 22:00 Uhr) habe ich noch ein paar Ding optimiert. Am wichtigsten scheint mir, dass ich nur noch die PHP- und Apache Module lade, die ich wirklich benötige. Das hat meinen Speicher ordentlich entlastet und der Server hat seitdem wirklich massiv weniger Last!

Ich schreib das hier auf, weil es vielleicht jemand anderen auch erinnert mal auf zu räumen und damit ich nicht wieder anfange irgendwelche unnötigen Dinge zu installieren. Der Server hat mittlerweile soviel Traffic, dass er etwas Aufmerksamkeit und Sorgfalt verdient hat.

rrd2-system1

Achja noch was. Damit die Apache internal dummy connections nicht immer auf dem aufwendigsten Server aufschlagen habe ich mir einen localhost definiert. Das hilft

ServerName localhost
ServerAlias 127.0.0.1
ServerAlias 172.16.1.1
ServerAlias 212.114.250.32
DocumentRoot /var/www/localhost/htdocs
CustomLog /var/www/localhost/log/access.log combined
ErrorLog /var/www/localhost/log/error.log

AllowOverride None


GnuTLSEnable on
GnuTLSCertificateFile /etc/ssl/CA/private/it4sport.de.crt
GnuTLSKeyFile /etc/ssl/CA/private/it4sport.de.key
GnuTLSPriorities NORMAL
ServerName localhost
ServerAlias 127.0.0.1
ServerAlias 172.16.1.1
ServerAlias 212.114.250.32
DocumentRoot /var/www/localhost/htdocs
CustomLog /var/www/localhost/log/access.log combined
ErrorLog /var/www/localhost/log/error.log

AllowOverride None

In der index.html steht einzig und allein „no content“ drin.

Wenn ich noch mehr Stellschrauben finde und einstelle, dann schreibe ich hier mir das auf.

VN:F [1.9.22_1171]
Rating: 0.0/10 (0 votes cast)
VN:F [1.9.22_1171]
Rating: 0 (from 0 votes)

Spiderman is having me for dinner tonight…

Heute Mittag ist die Last auf meinem Server ins unermessliche (>10) gestiegen. Apache-Prozesse ohne Ende! Wer kommt schon auf die Idee, dass sämtliche Bots dieser Welt gleichzeitig alles von meiner Kiste absaugen wollen. Jetzt ist die Last wieder normal (<1). Was habe ich dazu getan? Als erstes habe ich mir die Apache Konfiguration angesehen. Hab mit der Anzahl der Worker und der MaxClients gespielt. Gebracht hat's aber fast nichts. Ich suche immer noch nach einer schlauen Empfehlung für diese Werte. Nachdem 90% meiner Seiten auf dem Server PHP-Seiten sind hab ich den APC-Accelerator installiert:

1
2
apt-get install php-apc
/etc/init.d/apache2 restart

Danach gings dem Server schon besser. Aber immer noch nicht gut.

Also habe ich mir die Logfiles angesehen. Speziell das Logfile von rothsee-triathlon.de hat mir die Augen geöffnet. Die Bots haben sich alles mögliche unnötige geholt. Daher habe mich endlich um die robots.txt gekümmert. Bei privaten Seiten sieht sie nun so aus:

User-agent: * 
Crawl-delay: 10
Disallow: /

Beim Rothsee-Triathlon verbiete ich erstmal alles und erlaube nur noch das wesentliche:

User-agent: * 
Crawl-delay: 10
Disallow: /la/page.php?id=_func_fotourkunde
Disallow: /la/page.php?id=_func_Bild_anzeigen 
Allow: /index.php
Allow: /la/index.php
Allow: /la/page.php
Disallow: /

Und schon schwitz mein Server nicht mehr. Muss ich mir aufschreiben. Nächstes mal verpenne ich das bestimmt wieder

VN:F [1.9.22_1171]
Rating: 0.0/10 (0 votes cast)
VN:F [1.9.22_1171]
Rating: 0 (from 0 votes)

Yslow oder gib Gas

Auf meiner Kiste läuft auch noch die Seite unsere Triathlon Abteilung. Diese Seite bekommt an den Tagen rund um das Wochenende vom Rothsee-Triathlon-Festival ordentlich Last ab. Und nachdem dieses Jahr beide Veranstaltungen am gleichen Wochenende sind ist die Performance noch viel wichtiger. Daher bleibt mir auch nichts übrig als dafür zu sorgen, dass die Seite möglichst schnell und resourcensparend ist. Obwohl ich schon viel an der Datenbankstruktur und an meinem Source optimiert habe muss ich da aber noch mal mit einem Profiler ran.

Auch ohne der eigenen Software geht noch mehr. Daher habe ich mir heute abend mal Yslow installiert. Warum das Teil Yslow heißt ist mir auch ein Rätsel… Jedenfalls untersucht das Teil die Website nach 13 verschiedenen Kriterien und gibt jeweils Tipps. Ein paar Ratschlägen kann ich oder will nicht folgen. Ein paar waren wirklich hilfreich:

  • Gzip components
    Ich hatte das deflate modul im apache noch nicht installiert. Jetzt ist es installiert und wie folgt konfiguriert:

    1
    2
    3
    
    <IfModule mod_deflate.c>
              AddOutputFilterByType DEFLATE text/html text/plain text/xml application/x-javascript text/css
    </IfModule>
  • Put JS at the bottom
    Logisch… aber warum muss man das erst gesagt bekommen 😉
  • Minify JS
    Vorerst verschwende ich noch die paar Bytes. Ich hab keine Lust nach dem Auschecken Whitespaces zu entfernen.
  • Avoid redirects
    Da hat mir Yslow doch tatsächlich gezeigt, dass ich ein Javascript einbinden will, dass gar nicht mehr exisitert. Danke.
  • Add an Expires header
    Bei dem dynamischen Content meiner Seite habe ich keine Lust mich da zu verschlechtern, aber nichts spricht dagegen die Javascripts und CSS langlebiger zu machen.

    1
    2
    3
    4
    
          ExpiresActive On
          ExpiresDefault "now plus 1 day"
          ExpiresByType text/css   "access plus 1 month"
          ExpiresByType text/js    "access plus 1 month"

Insgesamt ein echt nützliches Tool. Die Tipps sind eigentlich alle naheliegend nur übersieht man sie ständig.

Achja meine Seite hat ein „C“ bekommen. Das geht noch besser. Wir arbeiten daran aber yahoo.de hat auch nur ein C :)…

VN:F [1.9.22_1171]
Rating: 0.0/10 (0 votes cast)
VN:F [1.9.22_1171]
Rating: 0 (from 0 votes)