So blockieren Sie Nginx-Zugriffsprotokollanweisungen von bestimmten Benutzeragenten

8

Ich möchte die Protokollierung in der Nginx-Zugriffsprotokolldatei aufgrund bestimmter Anforderungen von http-Benutzeragenten deaktivieren.

Grundsätzlich aus dem Amazon ELB Health Check und unserer externen (Pingdom) Überwachung. Da diese alle paar Sekunden auftreten, ist das Durchsuchen der Protokolle schwierig.

"GET / HTTP/1.1" 200 727 "-" "ELB-HealthChecker/1.0"
"GET /login HTTP/1.1" 200 7492 "-" "Pingdom.com_bot_version_1.4_(http://www.pingdom.com/)"

Ich konnte die Protokollierung für Bilddateien blockieren, habe jedoch nichts für eingehende Anfragen gesehen:

location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico|xml|svg)$ {
        access_log        off;
        expires           30d;
}

Danke im Voraus!


Also habe ich die Empfehlung von @Gnarfoz ausprobiert, hatte aber einige interessante Nebenwirkungen. Während diese beiden "Health Checks" nicht protokolliert wurden, erkannte Pingdom den Server auch während des Betriebs als DOWN. Das ist interessant, da der Load Balancer dies nicht getan hat, wodurch der Knoten, den wir getestet haben, gelöscht worden wäre, wenn dies der Fall gewesen wäre.

Ich habe den MAP-Abschnitt in den HTML-Block unter meinen Protokollen eingefügt:

access_log /www/access.log;
error_log /www/error.log;

map $http_user_agent $ignore_ua {
            default                 0;
            "~Pingdom.*"            1;
            "ELB-HealthChecker/1.0" 1;
    }

Und ich habe die IF-Anweisung mit dem Standardspeicherort in meinen Serverblock eingefügt:

location / {
                try_files $uri $uri/ /index.php?$args;

                if ($ignore_ua) {
                       access_log off;
                }
        }

Als ich dies tat, begann Pingdom 404 Fehler in der Fehlerprotokolldatei zu generieren:

2012/08/03 17:10:33 [error] 6250#0: *164 open() "/www/public_html/login" failed (2: No such file or directory), client: 10.xx.xx.xx, server: xxx.com, request: "GET /login HTTP/1.1", host: "xxx.com"
2012/08/03 17:11:32 [error] 6250#0: *240 open() "/www/public_html/login" failed (2: No such file or directory), client: 10.xx.xx.xx, server: xxx.com, request: "GET /login HTTP/1.1", host: "xxx.com"
briannyc
quelle
Das ist übrigens der User-Agent, nicht der Referrer.
Gnarfoz
Danke, ich war mir nicht sicher, ob ich damit die richtige Terminologie verwendet habe
briannyc
Ah, mein schlechtes. Ich habe zwar noch keinen Kaffee getrunken, aber ich denke, Sie müssen auch etwas in diesem Standortblock zurückgeben. Also vielleicht ein einfacher return 200;nach dem access_log off;könnte den Trick machen. (Nicht-) Vererbung von Nginx-Konfigurationsanweisungen ist mir immer noch nicht ganz klar ...
Gnarfoz
Sie haben Recht, das Hinzufügen return 200;hat perfekt funktioniert! Danke für deine Hilfe.
Briannyc
Gut zu hören, dass das funktioniert. Ich habe meine Antwort entsprechend aktualisiert.
Gnarfoz

Antworten:

6

Versuche dies:

# map goes *outside* of the "server" block
map $http_user_agent $ignore_ua {
    default                 0;
    "~Pingdom.*"            1;
    "ELB-HealthChecker/1.0" 1;
}

server {
    # Things omitted for brevity

    location / {
        if ($ignore_ua) {
            access_log off;
            return 200;
        }
    }
}    

Das if-Teil müsste wahrscheinlich in Ihren entsprechenden Standortblock integriert werden.

Relevante Nginx-Dokumentation: map , if , access_log

Gnarfoz
quelle
Versuchte Ihre Empfehlung mit einigen interessanten Nebenwirkungen. Möglicherweise habe ich die IF-Anweisung an der falschen Stelle abgelegt. Ich werde weiter damit spielen.
Briannyc
1
Das hat bei mir nicht funktioniert.
Mauvis Ledford
Hat auch bei mir nicht funktioniert, aber ich denke, das ist auf dem richtigen Weg, um damit umzugehen.
xxdesmus
1
Winziges Update - Die Karte geht übrigens außerhalb des Serverblocks, nur für den Fall, dass dies den Leuten hilft. Das funktioniert aber bei mir.
xxdesmus