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

16

Я использую стандартный пакет 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файла?

Йоав Анер
источник
Нет. Просто удалите его из nginx.conf
Алексей Тен
1
Я открыл билет на это; trac.nginx.org/nginx/ticket/1084
cweiske

Ответы:

4

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

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

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

доблесть
источник
Спасибо, это прекрасно работает. За исключением того, что обычно уже есть mainlog_format, так что вам нужно выбрать другое имя.
Куци