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;

我知道我可以用if ($uri = /lbcheck.html) { access_log off; }inlocation @app但如果是邪恶的,所以我不想使用它们。

4

2 回答 2

22

您可以使用条件日志记录来做到这一点。它看起来像

map $request $loggable {
    ~*lbcheck\.html 0;
    default 1;
}
access_log  /path/logs/name.log if=$loggable;
于 2014-05-29T20:53:51.013 回答
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%
}

虽然这似乎需要做很多工作才能调整单个配置变量,但实际上从长期(和中期)来看,使用配置文件会更加愉快,因为您将始终生成易于阅读的配置文件并理解,而不是在其中包含复杂的条件。

于 2013-07-02T15:28:32.917 回答