Wie protokolliere ich Nginx-Anfragen an einen bestimmten Ort in einer anderen Datei?

8

Ich habe einen Nginx, der als Proxy vor einem Backend fungiert, und ich möchte die an einen bestimmten Speicherort gestellten Anforderungen in eine separate Datei aufteilen.

Die Anforderungen sollten weiterhin an denselben Backend-Server gesendet werden, ich möchte sie jedoch nicht im Hauptzugriffsprotokoll anzeigen.

Außerdem möchte ich nicht alle Proxy_-Inhalte zweimal angeben.

server {
    ...
    access_log  /var/log/nginx/jira.access.log full;
    error_log  /var/log/nginx/jira.error.log;
    client_max_body_size 150m;        

    location /special/ {
        }

    location / {

            # many lines of config params for proxy_...
            proxy_pass   http://dowa-02.example.com:8080;
            ...
    }
}
Sorin
quelle

Antworten:

6

UPD

Hmmm ... access_logDirektive haben eine "Funktion".

Anforderungen werden in einem Kontext eines Speicherorts protokolliert, an dem die Verarbeitung endet. Dies kann vom ursprünglichen Speicherort abweichen, wenn während der Anforderungsverarbeitung eine interne Umleitung erfolgt.

Im Falle try_filesder internen Weiterleitung. Versuchen Sie try_files, includeden benannten Ort zu ändern und zu entfernen.

ENDE DER UPD


Um "proxy_ stuff" nicht viele Male zu wiederholen, können Sie beispielsweise die includeDirektive verwenden. Aber try_filesund benannter Ort sind viel besser :)

server {
    ...
    access_log  /var/log/nginx/jira.access.log full;
    error_log  /var/log/nginx/jira.error.log;
    client_max_body_size 150m;

    location /special/ {
        try_files $uri @backend;
        access_log /var/log/nginx/special.access.log full;
    }

    location / {
        try_files $uri @backend;
    }

    location @backend {
            # many lines of config params for proxy_...
            proxy_pass   http://dowa-02.example.com:8080;
            ...
    }
}
cadmi
quelle
danke, ich habe über den gleichen Ansatz nachgedacht, ihn implementiert service nginx reload, nichts geändert, nginx restartnichts geändert ... die spezielle Protokolldatei wird nicht erstellt und das Protokoll ist immer noch voll mit / special / Anfragen ...
sorin
Mit Nginx passierte etwas sehr Seltsames. Ich musste es erneut installieren, damit es funktioniert. Bis ich es stoppte, war jeder Befehl "erfolgreich", tat aber tatsächlich nichts.
Sorin
siehe Update, bitte
Cadmi
Die Frage ist nun, welcher der endgültige Kontext ist. Ich würde wirklich gerne benannte Speicherorte verwenden, da diese der richtige Weg sind, um die Konfiguration einfach zu warten. Jetzt: nginx erstellt die Protokolle, verwendet jedoch immer das Zugriffsprotokoll, das auf der serverEbene angegeben ist. Irgendwelche Problemumgehungen ohne Include?
Sorin
1
Nur includeist Problemumgehung. endgültiger Kontext am ursprünglichen Ort statt benannt - ein Merkmal der access_logRichtlinie.
Cadmi