Autor: csett86

  • Caching for Ghost, NGINX edition

    The (only) recommended stack to self-host Ghost via ghost-cli already has an nginx in it (for SSL termination), but its not using its caching feature. So to survive the „Mastodon hug of death“, as Elena put it, lets add a small cache to it.

    By default Ghost adds headers that effectively forbid caching, because the default cache-control header has a lifetime (max-age) set of 0. So lets change that first:

    Add a caching config to the ghost config.production.json file (see https://ghost.org/docs/config/#caching for full details):

    "caching": {
      "frontend": {
        "maxAge": 60
      },
      "contentAPI": {
        "maxAge": 60
      }
    }

    Then go into the nginx config file for the site (the one that ghost-cli created in /etc/nginx/sites-available/) and add the bare minimum, because by nginx has quite good default values for many cache options.

    1. Give nginx a place to store the cached files, eg in /tmp

    proxy_cache_path /tmp/nginx_ghost levels=1:2 keys_zone=ghostcache:10m max_size=100m inactive=24h;

    2. Within the existing location block that does the reverse proxying, lets do these four things:

    • enable the caching (proxy_cache ghostcache;)
    • protect the poor ghost instance that only one request for each cache key hit it (proxy_cache_lock on;)
    • allow it to update the cache during serving „outdated entries“ (proxy_cache_background_update on;)
    • continue to serve cached content even if ghost should fall over (proxy_cache_use_stale ...)
    proxy_cache ghostcache;
    proxy_cache_lock on;
    proxy_cache_background_update on;
    proxy_cache_use_stale updating error timeout http_500 http_502 http_429;

    3. Lastly, to see it in action, lets add a header that puts the cache status into it so that we can see it from the browser dev tools:

    add_header X-Cache-Status $upstream_cache_status;

    And thats already it, restart ghost (to activate the config), reload nginx:

    sudo systemctl restart ghost...
    sudo systemctl reload nginx

    Just for completeness, my full nginx config then looks like this:

    proxy_cache_path /tmp/nginx_ghost levels=1:2 keys_zone=ghostcache:10m max_size=100m inactive=24h;
    
    map $status $header_content_type_options {
        204 "";
        default "nosniff";
    }
    
    server {
        listen 443 ssl http2;
        listen [::]:443 ssl http2;
    
        server_name blog.settgast.org;
        root /var/www/blog/system/nginx-root; # Used for acme.sh SSL verification (https://acme.sh)
    
        ssl_certificate /etc/letsencrypt/blog.settgast.org/fullchain.cer;
        ssl_certificate_key /etc/letsencrypt/blog.settgast.org/blog.settgast.org.key;
        include /etc/nginx/snippets/ssl-params.conf;
    
        location / {
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header Host $http_host;
            proxy_pass http://127.0.0.1:2368;
    
    	add_header X-Content-Type-Options $header_content_type_options;
    
    	proxy_cache ghostcache;
    	proxy_cache_lock on;
    	proxy_cache_background_update on;
    	proxy_cache_use_stale updating error timeout http_500 http_502 http_429;
    	add_header X-Cache-Status $upstream_cache_status;
        }
    
        location ~ /.well-known {
            allow all;
        }
    
        client_max_body_size 1g;
    }

    Benchmarking

    To benchmark it a bit, lets use the wrk tool and hit ghost with 500 parallel connections, once default without caching, once with caching enabled:

    As a baseline I ran it without the caching, so in default mode:

    wrk -c 500 -t 4 https://blog.settgast.org/caching-for-ghost-nginx-edition/
    Running 10s test @ https://blog.settgast.org/caching-for-ghost-nginx-edition/
      4 threads and 500 connections
      Thread Stats   Avg      Stdev     Max   +/- Stdev
        Latency     1.13s   507.40ms   1.99s    58.33%
        Req/Sec    22.18     15.36    60.00     61.22%
      371 requests in 10.08s, 5.53MB read
      Socket errors: connect 0, read 0, write 0, timeout 311
    Requests/sec:     36.80
    Transfer/sec:    561.85KB

    36 requests per second, thats not much. Or to put it differently: From the 500 connections started, only 371 completed within 10 seconds, the others were still loading.

    Now lets repeat this with NGINX caching enabled:

    wrk -c 500 -t 4 https://blog.settgast.org/caching-for-ghost-nginx-edition/
    Running 10s test @ https://blog.settgast.org/caching-for-ghost-nginx-edition/
      4 threads and 500 connections
      Thread Stats   Avg      Stdev     Max   +/- Stdev
        Latency    41.36ms   70.71ms   1.05s    93.24%
        Req/Sec     3.84k   804.38     5.36k    83.79%
      139524 requests in 10.06s, 1.95GB read
    Requests/sec:  13865.81
    Transfer/sec:    198.63MB

    Over 13 thousand requests per second from a small VPS (2CPUs, 4GB RAM), or a factor of 380 times more requests!

    References

    Fediverse-Reaktionen
  • Dynamische Analyse von Apple iOS Apps

    Dynamische Analyse von Apple iOS Apps – Überwachung datenschutzrelevanter Vorgänge in Smartphone-Anwendungen

    Ziel der Arbeit ist es, ein dynamisches und performantes Analyseverfahren für iOS-Anwendungen zu entwickeln und zu dokumentieren. Innerhalb dieses Analyseverfahrens werden Zugriffe auf personenbezogene Daten wie das Adressbuch, identifizierende Daten wie die MAC-Adresse, die Verwendung von Sensoren und Aktoren und der Netzwerkverkehr jeder analysierten Anwendung erfasst. Des Weiteren wird die Verwendung von Werbenetzwerken und Nutzungsstatistik-Dienstleistern durch Anwendungen protokolliert. Schließlich wird auch die Verwendung von Sicherheitsmaßnahmen wie Dateiverschlüsselung und Passwortverwaltung innerhalb von Anwendungen gegen Angriffe von außen erfasst.

    Die vorliegende Arbeit zeigt ein auf API-Hooking basierendes Analyseverfahren. Dieses ist als MobileSubstrate-Tweak für iPhones mit Jailbreak programmiert. Anhand von Benchmarks wird gezeigt, dass das dynamische Analyseverfahren die Rechenleistung nicht beeinträchtigt, welche den Anwendungen zur Verfügung steht.

    Bei der Analyse der 300 am häufigsten heruntergeladenen Anwendungen zeigen sich folgende Ergebnisse: 2 % greifen auf das Adressbuch zu, aber 19,5 % nutzen bereits beim Start den aktuellen Ort, 56,2 % lesen die MAC-Adresse aus, 36 % nutzen Flurry, 7,1 % Google AdMob und 82,5 % erzeugen bereits in den ersten 30 Sekunden Netzwerkverkehr.

    Dynamische Analyse von Apple iOS Apps (pdf, 1,4 MB)

  • Benchmarking Time Capsule 2 TB (4. Generation)

    Da ich keine Benchmark-Werte für die Apple Time Capsule 2TB gefunden habe, habe ich selbst die Geschwindigkeit der LAN-Schnittstelle getestet.

    Dazu wird folgende Time Capsule verwendet:

    • Modell: MD032Z/A
    • Festplatte: 2 TB
    • Firmware: 7.6.3

    Szenario: Time Capsule und iMac sind direkt über Gigabit-LAN verbunden, 1 große Datei (1 GB, also 1 000 000 000 Byte) wird mit cp in der Shell kopiert und die Zeit mit time gemessen:

    time cp 1GB.img /Volumes/Data

    real 0m28.378s
    user 0m0.003s
    sys 0m3.160s

    Die angegebene Zeit ist die „real“-Zeit, die time ausgibt. Ergebnisse:

    • Lesen: 44,73 MB/s (1 GB in 22,356 Sekunden)
    • Schreiben: 35,24 MB/s (1 GB in 28,378 Sekunden)

    Die Werte sind jetzt nicht überragend und können sicher nicht mit RAID-NAS-Systemen mithalten, aber für Backupzwecke find ichs schnell genug.

    PS: Große Dateien unter Mac OS X mit dd schnell erstellen:

    dd if=/dev/zero of=1GB.img bs=1000 count=0 seek=1000000

  • Weitere Fortschritte beim Glasfaser-Ausbau

    Der Glasfaser-Ausbau in Erlangen-Bruck macht schnelle Fortschritte, Stand der Arbeiten am 14. Mai 2013:

    Am 16. Mai ist das Loch auch schon wieder zu:

    Außerdem eröffnet passend dazu am 6. Juni ein M-Net-Shop in der Erlanger Fußgängerzone, Ecke Hauptstraße/Friedrichstraße

  • Glasfaser-Ausbau in Erlangen-Bruck

    Die Erlanger Stadtwerke (ESTW) bauen zusammen mit M-net im Stadtteil Erlangen-Bruck ein Glasfasernetz.

    Ankündigung Glasfaser-Ausbau Erlangen-Bruck

    Konkret wird in der Max-Planck-Straße, Noetherstraße, Schwedlerstraße und Heinrich-Hertz-Straße im Bereich der GeWoBau-Wohnungen FTTC realisiert. Fertigstellung soll laut Herr Wagner von den Stadtwerken bereits Ende August 2013 sein.

    Das genaue Ausbaugebiet ist hier gut zu sehen:

    Ausbaugebiet Glasfaser Erlangen-Bruck

    Im „offiziellen“ Plan der Stadtwerke ist davon noch nichts zu sehn. Da die Bagger hier schon vor Ort aktiv sind, ist mir das relativ egal.

    Weitere Impressionen:

  • Der Spiegel hat Recht: Liebe macht blind!

    Zitat: „Wenn es um ein mögliches Tempolimit geht, pochen viele Deutsche mit vollkommen irrationalen Argumenten auf das Recht zum Rasen. Die Wahrheit ist: Es gibt keine guten Gründe gegen ein Tempolimit – und die Debatte darum erinnert leider stark an den Streit um schärfere Waffengesetze in den USA.“

    https://www.spiegel.de/auto/aktuell/tempolimit-auf-autobahnen-liebe-macht-blind-a-898824.html

  • Verlässliche forensische Live-Analyse

    Zusammenfassung:

    Martignoni et al. stellen mit HyperSleuth ein Framework zur verlässlichen, forensischen Live-Analyse vor. Es nutzt hardwarebasierte Virtualisierungsunterstützung aktueller x86-Prozessoren, um ein laufendes Betriebssystem ohne merkbare Unterbrechung zu virtualisieren. Die forensische Analyse ist danach gegenüber Manipulationen geschützt, da der Hypervisor die endgültige Kontrolle über die Hardware besitzt. Sie ist gegenüber dem analysierten Betriebssystem transparent und kann daher während des Produktiveinsatzes mit nur geringen Leistungseinbußen durchgeführt werden. Zur Absicherung des Virtualisierungsvorgangs wird ein Prüfsummenverfahren über den Hypervisor mit Laufzeitmessung durch eine forensische Workstation durchgeführt.

    HyperSleuth ist modular aufgebaut und implementiert drei Analysemodule: ein Modul zur Erstellung eines Speicherabbilds, das nach dem copy-on-write-Prinzip arbeitet, ein Lügendetektor zur Erkennung von Schadsoftware und ein Modul zur Erstellung eines Systemaufrufprotokolls, mit dem auf die internen Abläufe unbekannter Software geschlossen werden kann.

    Verlässliche forensische Live-Analyse (pdf, 1,3MB)

    Quelle: L. Martignoni, A. Fattori, R. Paleari und L. Cavallaro: Live and Trustworthy Forensic Analysis of Commodity Production Systems (pdf, 700kB), Proc. of 13th int. conf. on Recent advances in intrusion detection. Seiten 297–316. Springer, Heidelberg (2010)

  • Agile Softwareentwicklung im Forschungsumfeld

    Zusammenfassung:

    Softwareentwicklung in Forschungsabteilungen läuft meist nach organisch gewachsenen Strukturen ab. Dies ist sowohl auf die reine Prototypenentwicklung ohne späteren Support als auch auf die hohe Fluktuation unter den studentischen Mitarbeitern zurückzuführen. Methoden der klassischen Softwaretechnik sind sehr selten anzutreffen. Innerhalb dieser Arbeit wurde untersucht, inwiefern sich agile Softwareentwicklung mit ihrer radikal anderen Grundeinstellung für dieses Umfeld eignet.

    Dabei wurde der aktuelle Entwicklungsprozess dokumentiert und dann die organisatorischen Rahmenbedingungen mit den grundlegenden Annahmen agiler Softwareentwicklung in Einklang gebracht. Die Einführung wurde beispielhaft mit testgetriebener Entwicklung als Experiment entworfen und durchgeführt. Dabei wurde deutlich, dass sowohl die Einarbeitungszeit als auch der kontinuierliche Zeitaufwand in vertretbarem Rahmen blieben. Lediglich die Selbstdisziplin der Entwickler stellte sich als möglicher Hinderungsgrund für die Anwendbarkeit heraus.

    Agile Softwareentwicklung im Forschungsumfeld (pdf, 696KB)

  • Object Correlation Evaluation for Location Data Fusion

    In a complex tracking environment like an airport many objects are tracked simultaneously. Some of these objects correlate to each other naturally, and thus the questions are how this correlation can be detected and how it can be used for increasing accuracy of the localisation system. The detection of the correlation is done by deciding if two objects are physically or logically bound or connected with each other. This could for example imply that a person is carrying a suitcase or sitting in a car, if these objects are tracked in a localisation system. The proposed approach to answer this question follows a two-step approach by checking computational-inexpensive preconditions first and evaluating a test statistic afterwards. This test statistic must be independent on the used fusion filter like Kalman or Particle Filter. Our results show, that one can reliably detect the physical binding and unbinding events and furthermore increase the location accuracy.

    Object Correlation Evaluation for Location Data Fusion (pdf, IEEE, kostenpflichtig)

  • Miriam Triebel vom bayerischen Club ausgezeichnet

    Die Arbeit „Einzelhandelsgroßprojekte aus Sicht der Raumplanung – Beispiel FOC Ingolstadt Village“ von Miriam Triebel wurde vom bayerischen Club am 7.2.2007 als eine von acht herausragenden Facharbeiten im Jahr 2006 ausgezeichnet.
    In ihrer Arbeit untersuchte sie die Angebotsform des FOC am Beispiel des Ingolstadt Village und veranschaulichte ihre Ergebnisse mit Fotos, Diagrammen und Karten, einer empirischen Untersuchung sowie einem eigens produzierten Film.
    Nähere Details und die anderen ausgezeichnetes Arbeiten finden Sie auf der Seite des bayerischen Landtags.