переопределение директивы nginx access_log - дублирование записей журнала

переопределение директивы nginx access_log - дублирование записей журнала

Я использую пакет nginx по умолчанию на сервере Ubuntu 14.04. Он используется /etc/nginx/nginx.confкак основная конфигурация, а затем включает конфигурации из /etc/nginx/conf.d/*.confи /etc/nginx/sites-enabled/*.

Конфигурация nginx по умолчанию содержит эту директиву для записи в журнал доступа

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

Я хотел бы добавить заголовок X-Forwarded-For, поэтому я делаю это внутри папки conf.d:

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;

Проблема в том, что в моем файле access.log появляются две записи: одна с информацией заголовка, а другая — без нее.

Я знаю, что могу перезаписать nginx.confсам файл, но я бы предпочел избежать этого, если это возможно. Я также хотел бы продолжать использовать тот же файл журнала ( access.log).

Есть ли способ указать nginx переопределить предыдущую директиву и просто изменить формат журнала, не изменяя основной nginx.confфайл?

решение1

ответ на ваш вопрос - НЕТ, вы не можете переопределить log_format на любом уровне в nginx, и вы не можете переопределить access_log на том же уровне, кроме как выключив его. Тем не менее, вы можете добиться того, чего хотели, не изменяя nginx.conf, но вам придется сделать это на уровне сервера {}.

Проблема здесь в том, что включение conf.d/* находится внутри http {}, где как раз и находится директива access_log. Что вы можете сделать, не трогая nginx.conf, так это изменить используемый вами server{} (если вы его не настроили, вы используете сервер по умолчанию, расположенный в /etc/nginx/sites-enabled/default). Таким образом, чтобы добиться того же самого, не изменяя nginx.conf, вам следует изменить файл в папке conf.d на: 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;

И затем внутри вашего сервера{} поместите: access_log /var/log/nginx/access.log main;

Это должно дать вам то, чего вы хотели в самом начале.

Связанный контент