nginx在一个变量上的多个映射条件

时间:2018-09-12 18:00:15

标签: nginx logging vhosts

我正试图排除一个IP地址以及一个用户代理,使其不出现在我的任何vhost日志中。每个虚拟主机在各自的文件中配置了自己的日志文件。我将$if=$variable附加到每个日志文件定义中,并将其添加到nginx.conf:

map $http_user_agent $variable {
  ~MyUserAgent 0;
  default 1;
}

这有效。现在我想添加条件,例如此变量的IP地址(无需再次更改每个虚拟主机的配置)。

如果有可能进行全局配置,同时保留不同的日志文件位置,这也是可行的解决方案。

1 个答案:

答案 0 :(得分:1)

如果每个虚拟主机的日志记录都相同,则每个托管服务器甚至都不需要单独的文件。您可以在服务器级别指定日志记录指令,并使用变量为每个虚拟主机创建不同的日志

access_log /var/log/nginx/$host.log combined;
error_log /var/log/nginx/$host.error.log;

您可以将地图变量设置为任意值,并且可以组合多个地图以创建复杂的图案。您可以将其设置为有用的值,而不是将默认值设置为1,然后将其包含在日志中。

您可以在单个映射中匹配多个变量,因此您可以通过将其更改为以下内容来修改映射以将IP从日志中排除:

map $http_user_agent$remote_addr $variable {
  ~MyUserAgent 0;
  ~my.ip.ad.dy 0;
  default 1;
}

一旦找到匹配项,地图评估就会返回,因此,如果您的地图比较复杂,那么列出比较值的顺序就很重要