覆盖 nginx access_log 指令 ​​- 重复日志条目

覆盖 nginx access_log 指令 ​​- 重复日志条目

我在 Ubuntu 14.04 服务器上使用默认的 nginx 包。它用/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

您的问题的答案是否定的,您无法在 nginx 的任何级别覆盖 log_format,也无法在同一级别覆盖 access_log,除非将其关闭。但是,您可以在不更改 nginx.conf 的情况下实现所需的目的,但您必须在服务器 {} 级别执行此操作。

这里的问题是 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;

这应该能让你得到你一开始想要的东西。

相关内容