我在 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;
这应该能让你得到你一开始想要的东西。