przesłaniająca dyrektywę access_log nginx - zduplikowane wpisy dziennika

17

Używam domyślnego pakietu nginx na serwerze Ubuntu 14.04. Jest używany /etc/nginx/nginx.confjako główna konfiguracja, a następnie obejmuje konfiguracje z /etc/nginx/conf.d/*.confi /etc/nginx/sites-enabled/*.

Domyślna konfiguracja nginx ma tę dyrektywę dotyczącą logowania do dziennika dostępu

access_log /var/log/nginx/access.log;

Chciałbym dodać nagłówek X-Forwarded-For, więc robię to w conf.dfolderze:

log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                 '$status $body_bytes_sent "$http_referer" '
                 '"$http_user_agent" "$http_x_forwarded_for"';

access_log  /var/log/nginx/access.log  main;

Problemem jest to, że otrzymuję dwa rekordy w pliku access.log - jeden z informacjami o nagłówku, a drugi bez.

Wiem, że mogę nadpisać nginx.confsam plik, ale wolę go unikać, jeśli to możliwe. Chciałbym również nadal używać tego samego pliku dziennika ( access.log).

Czy istnieje sposób, aby powiedzieć Nginxowi, aby zastąpił poprzednią dyrektywę i po prostu zmienił format dziennika bez modyfikowania głównego nginx.confpliku?

Yoav Aner
źródło
Nie. Po prostu usuń go z nginx.conf
Alexey Ten
1
Otworzyłem bilet na to; trac.nginx.org/nginx/ticket/1084
cweiske

Odpowiedzi:

6

odpowiedź na twoje pytanie brzmi NIE, nie możesz przesłonić formatu dziennika na żadnym poziomie w nginx i nie możesz przesłonić dziennika dostępu na tym samym poziomie, z wyjątkiem jego wyłączenia. Możesz jednak osiągnąć to, co chciałeś, bez zmiany nginx.conf, ale będziesz musiał to zrobić na poziomie serwera {}.

Problem polega na tym, że dołączenie conf.d / * znajduje się w http {}, czyli dokładnie tam, gdzie znajduje się dyrektywa access_log. To, co możesz zrobić bez dotykania nginx.conf, to zmiana dowolnego serwera {}, którego używasz (jeśli go nie skonfigurowałeś, używasz domyślnego serwera znajdującego się w / etc / nginx / sites-enabled / default). Aby osiągnąć to samo bez zmiany pliku nginx.conf, należy zmienić plik w folderze conf.d na: log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log off;

A potem na serwerze {} wstaw: access_log /var/log/nginx/access.log main;

To powinno zapewnić ci to, czego chciałeś na początku.

Dzielność
źródło
Dzięki, to działa świetnie. Tyle, że zwykle istnieje już mainformat_logu, więc musisz wybrać inną nazwę.
Kutzi