gpt4 book ai didi

logging - nginx 中的匿名 IP 日志记录?

转载 作者:行者123 更新时间:2023-12-02 23:41:32 24 4
gpt4 key购买 nike

为了尊重用户的隐私,我尝试在 nginx 日志文件中匿名化他们的 IP 地址。

实现此目的的一种方法是定义自定义日志格式,如下所示:

log_format noip '127.0.0.1 - [$time_local]  '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" $request_time';

此方法有两个缺点:我无法区分两个用户,并且无法使用地理位置工具。

最好的办法是“缩短”IP 地址(87.12.23.55 将变为 87.12.23.1)。

是否有可能使用 nginx 配置脚本来实现这一点?

最佳答案

即使已经有一个可接受的答案,该解决方案似乎也无效。

nginx 有 log_format 指令,该指令具有 http 上下文。这意味着,log_format 只能在配置文件的 http {} 部分中设置(有效),而不能在服务器部分中设置!

另一方面,我们有一个 if 指令,它具有服务器和位置的上下文

所以我们不能在服务器部分使用“if”和“log_format”(这是在可接受的解决方案中完成的)

所以 if 在这里没有帮助,而且 if 是邪恶的 ( http://wiki.nginx.org/IfIsEvil )!我们需要在http上下文中工作的东西,因为只有在那里log_format才能以有效的方式定义,并且这是服务器上下文之外唯一定义我们的虚拟主机的地方......

幸运的是,nginx 中有一个ma​​p功能! map 正在将一些值重新映射为新值(可在 log_format 指令中使用的变量中访问)。好消息是:这也适用于正则表达式。

因此,让我们将 IPv4 和 IPv6 地址映射为匿名地址。这必须分 3 步完成,因为 Map 无法累积返回值,它只能返回字符串或变量,而不能返回两者的组合。

因此,首先我们在日志文件中获取我们想要的 IP 部分,第二个映射返回象征匿名部分的部分,第三个映射规则再次将它们映射在一起。

以下是进入 http {} 上下文的规则:

map $remote_addr $ip_anonym1 {
default 0.0.0;
"~(?P<ip>(\d+)\.(\d+)\.(\d+))\.\d+" $ip;
"~(?P<ip>[^:]+:[^:]+):" $ip;
}

map $remote_addr $ip_anonym2 {
default .0;
"~(?P<ip>(\d+)\.(\d+)\.(\d+))\.\d+" .0;
"~(?P<ip>[^:]+:[^:]+):" ::;
}

map $ip_anonym1$ip_anonym2 $ip_anonymized {
default 0.0.0.0;
"~(?P<ip>.*)" $ip;
}

log_format anonymized '$ip_anonymized - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';

access_log /var/log/nginx/access.log anonymized;

将其添加到 nginx.conf 配置文件后,请记住重新加载 nginx。如果您使用“匿名”日志格式(这是 access_log 指令的格式参数),您的日志文件现在应该包含匿名 IP 地址。

关于logging - nginx 中的匿名 IP 日志记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6477239/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com