+ tatsächlich verwenden wir WSGI +
+ + ++ Das erscheint mir adäquat; das event-MPM ist vor allem von Vorteil bei Web-Applikationen, die viele Socket-Verbindungen offen halten. Zwar haben wir auch einiges an keep-Alive, und das blockiert dann jeweils einen Thread. In den konkreten Last-Messwerten sehe ich jedoch nie einen Engpaß, und wir verwenden jetzt (gegenüber früher) oft nur noch ein viertel des vorhandenen Arbeitsspeichers. +
+ + ++ ...basierend auf der %cpu, allerdings gefiltert auf die Threads, die überhaupt schon aktiv gelaufen sind (da Apache stets einen Pool an idle-Workern vorhält); angegeben als Verhältniszahl, 1.0 ≙ 100%, mißt den durchschnittlichen Anteil an der gesamten Prozeßzeit, welchen die Prozesse im "runnable"-State verbringen. Typische Werte sind 10% unter Last und <5% wenn weitgehend Idle +
+ + ++ also /etc/anubis/<service>.env +
+ + ++ Aggressively block AI/LLM related bots/agents by default +
+ + ++ +
++ # Search engine crawlers to allow, defaults to: +
++ # - Google (so they don't try to bypass Anubis) +
++ # - Apple +
++ # - Bing +
++ # - DuckDuckGo +
++ # - Qwant +
++ # - The Internet Archive +
++ # - Kagi +
++ # - Marginalia +
++ # - Mojeek +
+ + ++ Allow common "keeping the internet working" routes (well-known, favicon, robots.txt) +
+ + ++ Das ist ein Überbleibsel aus der Anfangszeit; Xena meinte erst, das das was bringt; Reviewer haben sie dann darauf aufmerksam gemacht, daß das IP-Daten leaken kann. Seither ist es deaktiviert +
+ + ++ Das erlaubt gewisse "OG"-Urls ohne Challenge durch +
+ + ++ # By default, send HTTP 200 back to clients that either get issued a challenge +
++ # or a denial. This seems weird, but this is load-bearing due to the fact that +
++ # the most aggressive scraper bots seem to really, really, want an HTTP 200 and +
++ # will stop sending requests once they get it. +
+ + ++ # Anubis can store temporary data in one of a few backends. See the storage +
++ # backends section of the docs for more information: +
++ # +
++ # https://anubis.techaro.lol/docs/admin/policies#storage-backends +
+ + ++ - import: (data)/crawlers/alibaba-cloud.yaml +
++ - import: (data)/crawlers/huawei-cloud.yaml +
+ + ++ das heißt, alles was mit User-Agent "Mozilla|Opera" daherkommt, aber keine andere Regel matcht, bekommt einen Gewichts-Malus von +10 +
+ + ++ derzeit eine Regel: überhaupt kein UserAgent ⟶ DENY +
+ + ++ +
++ # Search engine crawlers to allow, defaults to: +
++ # - Google (so they don't try to bypass Anubis) +
++ # - Apple +
++ # - Bing +
++ # - DuckDuckGo +
++ # - Qwant +
++ # - The Internet Archive +
++ # - Kagi +
++ # - Marginalia +
++ # - Mojeek +
+ + ++ Contains policies that exclusively reference policies in multiple other data folders. +
++ Akin to "stances" that the administrator can take, with reference to various topics, such as AI/LLM systems. +
+ + ++ S RSS VSZ %MEM %CUC CMD +
++ S 29948 1265196 0.7 1.506 /usr/bin/anubis +
+ + ++ ps -A -o s,rss,vsz,%mem,cuc,cmd +
+ + ++ siehe Notiz in hauZu.mm +
+ + ++ # /usr/lib/systemd/system/anubis@.service +
++ [Unit] +
++ Description="Anubis HTTP defense proxy (instance %i)" +
++ +
++ [Service] +
++ ExecStart=/usr/bin/anubis +
++ Restart=always +
++ RestartSec=30s +
++ EnvironmentFile=/etc/anubis/%i.env +
++ LimitNOFILE=infinity +
++ DynamicUser=yes +
++ CacheDirectory=anubis/%i +
++ CacheDirectoryMode=0755 +
++ StateDirectory=anubis/%i +
++ StateDirectoryMode=0755 +
++ RuntimeDirectory=anubis/%i +
++ RuntimeDirectoryMode=0755 +
++ ReadWritePaths=/run +
++ +
++ [Install] +
++ WantedBy=multi-user.target +
+ + ++ d.h. der Service erstellt einen transienten Unix User-Account, so lange er läuft, und entfernt diesen automatisch wenn er stoppt; das aktiviert automatisch zusätzliche Sandboxing-Optionen: der Service darf fast nirgends schreiben, er bekommt ein privates /temp-Dir (das nacher wieder verschwindet), und IPC-Files / Pipes werden automatisch wieder gelöscht. Insofern verbleiben keine Resourcen im System, die diesem pseudo-user gehören, nachdem der Service stoppt +
+ + ++ Wir brauchen das, weil wir ein normales Logfile am gewohnten Ort haben wollen. +
++ SystemD betreibt Service-Units aber normalerweise unter Sandboxing; und automatisch (wie hier), wenn wir einen "automatic user" verwenden +
++ Hinweis: dieser Override aggregiert sich mit dem Default, der ReadWritePath=/run +
+ + ++ DEB.control definiert keinerlei dependencies +
+ + ++ Entweder das ist tatsächlich ein AppImage, oder »man« nimmt es mit den Pakten nicht so sonderlich genau (oder verwendet irgend eine Wrapper-Software) +
+ + ++ Instanzname: lumiera +
+ + ++ logging: +
++ sink: file +
++ parameters: +
++ file: "/var/log/apache2/anubis.log" +
++ maxBackups: 0 # disable log-rotation by Golang: fahedouch/go-logrotate +
++ maxBytes: -1 # unlimited size +
++ maxAge: 0 # no clean-up (leave this to Linux logrotate) +
+ + ++ # Anubis JSON log 1/2026 +
++ /var/log/apache2/anubis.log { +
++ daily +
++ rotate 28 +
++ extension log +
++ dateext +
++ dateyesterday +
++ dateformat %Y-%m-%d. +
++ compress +
++ delaycompress +
++ missingok +
++ notifempty +
++ ignoreduplicates +
++ create 640 anubis staff +
++ postrotate +
++ if pgrep -f ^/usr/bin/anubis > /dev/null; then +
++ /usr/bin/systemctl stop anubis@lumiera 2>&1 | logger -t anubis.logrotate +
++ /usr/bin/systemctl start anubis@lumiera 2>&1 | logger -t anubis.logrotate +
++ fi +
++ endscript +
++ } +
+ + ++ Noch vor wenigen Monaten war sie skeptisch, aber dann hat sie wohl den Research von Antropic gesehen, dem zufolge bereits eine kleine Anzahl an vergifteten Trainingsdaten genügt, ein Modell zu korrumpieren, egal wie groß das Modell und die Trainingsdaten insgesamt sind +
+ + ++ Direkt nach dem Restart... +
++ WARN: REDIRECT_DOMAINS is not set, Anubis will only redirect to the same domain a request is coming from, see https://anubis.techaro.lol/docs/admin/configuration/redirect-domains +
+ + ++ # Retrieve origin IP of the request for logging +
++ RemoteIPHeader X-Real-Ip +
++ RemoteIPInternalProxy 127.0.0.1 +
+ + ++ damit Apache beim Rückübersetzen den Namen verwendet, der als ServerName im eingehenden VirtualHost steht +
+ + ++ sed -nre '\_\[12/Jan/2026:03:_, \_\[12/Jan/2026:14:_ p' \ +
++ trac-access.2026-01-12.log >trac.12.log +
+ + ++ jq --arg start "2026-01-12T15:00" --arg end "2026-01-12T17:00" \ +
++ -s 'map(select(.time[0:16] >= $start and .time[0:16]<= $end))' \ anubis.2026-01-12.log|less +
+ + ++ liest eine Folge von JSON-Werten und packt sie in ein Array, das dann in die Pipeline geschickt wird +
+ + ++ jq -r \ +
++ 'map([.time[0:19] \ +
++ , ."x-real-ip" \ +
++ , if .check_result == null \ +
++ then ["CHALLENGE","default"] \ +
++ else [.check_result.rule, .check_result.name] \ +
++ end \ +
++ , .path \ +
++ ]|flatten|@csv) \ +
++ |.[]' \ +
++ anub.12.json > anub.12.csv +
+ + ++ jq -r 'map([.time[0:19] , ."x-real-ip" , if .check_result == null then ["CHALLENGE","default"] else [.check_result.rule, .check_result.name] end , .path ]|flatten|@csv) |.[]' anub.12.json > anub.12.csv +
+ + ++ bei mir ist ein Element ein nested Array ⟹ flatten vor dem CSV-Filter +
+ + ++ von vorher 1.5 - 2 GiB auf nun 400 - 800 MiB +
+ ++ Es wollte sich halt Niemand(TM) mit dem lästigen Thema beschäftigen, solange bis die Hütte brennt... +
+ + ++ Also »Open Core« +
+ + ++ Ergebnis: drastische Reduktion aller Lasten +
+ + ++ Vergleichszeitraum: 9.1.26 13:00-24:00 +
++ Meßzeitraum-Anubis: 12.1.26 03:00-14:00 +
++ (jeweils 11 Stunden) +
++ +
++ Heute (Anubis-Messung) war weniger Last auf dem System: +
++ +
++ Deshalb setze ich die Zahlen jeweils ins Verhältnis +
++ zu der Meßgröße in www.lumiera.org (ohne Anubis). +
++ +
+| + Größe + | ++ Vergleich + | ++ mit Anubis + | +
|---|---|---|
| + Volumen + | ++ 61% + | ++ 0.6% + | +
| + PageImpressions + | ++ 117% + | ++ 4% + | +
| + UniqueVisitors + | ++ 26% + | ++ 1.6% + | +
+ +
++ UniqueVisitors am Gateway: 17% +
++ +
++ +
++ Am Gateway werden gefiltert (jeweils ohne mich selber) +
++ - 92% der PageImpressions +
++ - 92% der UniqueVisitors +
++ - 87% des Datenvolumens +
++ +
++ Anubis hat 2094 Transaktionen registriert +
++ +
++ Häufigkeit der Regeln: +
++ 1099 "bot/alibaba-cloud" +
++ 614 "default" +
++ 291 "bot/ai-catchall" +
++ 80 "bot/no-user-agent-string" +
++ 7 "threshold/mild-suspicion" +
++ 3 "bot/huawei-cloud" +
++ +
++ +
++ Anmerkung zum Datenvolumen vor dem Gateway: +
++ Viele Bots versuchen es immer wieder. Einer hat es 80 mal versucht. +
++ Im Schnitt versuchen die Bots 10 mal, reinzukommen. +
+ + ++ Das ist abhängig von der Feinabstimmung der Regeln, und wird nur solange gelten, bis die aggresiveren Bots auch die erweiterten Browser-Eigenschaften zuverlässig nachahmen +
+ + +