substituindo a diretiva nginx access_log - entradas de log duplicadas

16

Estou usando o pacote nginx padrão no servidor Ubuntu 14.04. Ele está usando /etc/nginx/nginx.confcomo configuração principal e inclui configurações de /etc/nginx/conf.d/*.confe /etc/nginx/sites-enabled/*.

A configuração padrão do nginx possui essa diretiva para efetuar logon no log de acesso

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

Eu gostaria de adicionar o cabeçalho X-Forwarded-For, então faço isso dentro da conf.dpasta:

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;

O problema que tenho é que estou recebendo dois registros dentro do meu arquivo access.log - um com as informações do cabeçalho e outro sem.

Sei que posso substituir o nginx.confarquivo em si, mas prefiro evitá-lo, se possível. Eu também gostaria de continuar usando o mesmo arquivo de log ( access.log).

Existe uma maneira de dizer ao nginx para substituir a diretiva anterior e simplesmente alterar o formato do log sem modificar o nginx.confarquivo principal ?

Yoav Aner
fonte
Não. Apenas remova-o do nginx.conf
Alexey Dez
1
Eu abri um ingresso para isso; trac.nginx.org/nginx/ticket/1084
cweiske 26/09/16

Respostas:

4

a resposta para sua pergunta é NÃO, você não pode substituir um formato de log em nenhum nível no nginx e você não pode substituir o access_log quando estiver no mesmo nível, exceto desativando-o. No entanto, você pode conseguir o que queria sem alterar o nginx.conf, mas precisará fazê-lo no nível do servidor {}.

O problema aqui é que a inclusão de conf.d / * está dentro do http {}, que é exatamente onde está a diretiva access_log. O que você pode fazer sem tocar no nginx.conf é alterar o servidor {} que você estiver usando (se você não configurou um, está usando o servidor padrão localizado em / etc / nginx / sites-enabled / default). Portanto, para conseguir o mesmo sem alterar o nginx.conf, você deve alterar seu arquivo na pasta conf.d para: 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;

E então dentro do seu servidor {} coloque: access_log /var/log/nginx/access.log main;

Isso deve te dar o que você queria no começo.

Valor
fonte
Obrigado, isso funciona muito bem. Exceto que geralmente já mainexiste um log_format, para que você precise escolher outro nome.
Kutzi 27/05/19