禁用nginx对特定请求的日志记录

16

我想基于请求URI在nginx日志中“忽略”或重定向某些请求。

到目前为止,我有这个:

server {
  listen      80;
  #...
  access_log  /var/log/nginx/site.access;
  error_log   /var/log/nginx/site.error info;
  #...

  try_files $uri @app

  location = /lbcheck.html {
    access_log off;
    log_not_found off;
    try_files $uri @app;
  }

  location @app {
    proxy_redirect     off;
    proxy_pass http://unix:/tmp/site.unicorn.sock;
    #...
  }

}
基本上,我希望被代理的@app响应请求/lbcheck.html,但我不想在/var/log/nginx/site.access中记录它。
我知道可以在location @app中使用if ($uri = /lbcheck.html) { access_log off; }来实现,但是if语句是不好的,所以我不想使用它们。

你能再试一次,不使用try_files吗? - user1600649
“if” 并不邪恶,但它们会改变“上下文”,因此在使用 if 时真正发生的事情总是很难理解,但是出于这个目的,它非常完美。 - Thomas Decaux
@ThomasDecaux 这个怎么样?http://wiki.nginx.org/IfIsEvil - Bert Goethals
据我所知,您只需避免在if块中使用内容处理程序。 - Thomas Decaux
2个回答

25

您可以使用条件日志记录来实现此目的。它应该类似于以下内容:

map $request $loggable {
    ~*lbcheck\.html 0;
    default 1;
}
access_log  /path/logs/name.log if=$loggable;

2
但是这似乎只能在nginx 1.7.0版本中实现。 - Ernestas
1
正确的,它从那个版本开始就可用了。 - Tom
5
如果$loggable;为真,需要在access_log/var/log/snaplink26.log之间使用combined`。 - DeamonMV

6
我不确定是否有一种方法可以仅在Nginx的配置语法中完成此操作,我尝试过了,似乎没有if语句是不可能的。
然而,我知道你正在尝试的方式违背了Nginx编写配置文件的理念。
相反地,你应该使用你喜欢的任何配置工具生成nginx.conf文件,以便实际的配置文件简单明了,所有复杂部分都由工具为您生成。
例如,你的源文件生成的nginx.conf应该类似于:
%START_APP_CONFIG%
    proxy_redirect     off;
    proxy_pass http://unix:/tmp/site.unicorn.sock;
%END_APP_CONFIG%


location = /lbcheck.html {
    access_log off;
    %INSERT_APP_CONFIG%
}

location @app {
    %INSERT_APP_CONFIG%
}

虽然这看起来可能需要大量的工作才能调整单个配置变量,但实际上它使得使用配置文件在长期(和中期)更加愉快,因为您始终会生成易于阅读和理解的配置文件,而不是在其中添加复杂的条件。


1
您还可以使用 include,例如 include php-fpm.conf;,在站点配置文件的任何位置包含 /etc/nginx/php-fpm.conf 的内容。 - alanaktion

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接