首页 > 解决方案 > LB 后面的 Nginx:http_x_forwarded_for 未用于 limit_req_zone

问题描述

我正在尝试根据客户端 IP 设置速率限制,但遇到了问题。我在一个 ip 为 10.0.0.1 的负载均衡器后面。交通是

clients ---> (internet) ---> LB ---> Nginx ---> MyApp

我使用的是官方的 nginx docker 镜像版本 1.19.6

我使用了以下配置,基于官方 nginx 文档https://www.nginx.com/blog/rate-limiting-nginx/

limit_req_dry_run on;

geo $limit {
    default 1;
    192.168.0.0/24 0;
}

map $limit $limit_key {
    0 "";
    1 $http_x_forwarded_for;
}

limit_req_zone $limit_key zone=limit_all:10m rate=1r/s;

我也使用以下日志格式:

log_format logFormat '$http_x_forwarded_for - $remote_user [$time_local] '
'"$request" $status $request_length $body_bytes_sent "$http_referer" "$http_user_agent" '
'rt=$request_time msec=$msec cid=$cid';

但是配置不起作用:Nginx 似乎忽略了 http_x_forwarded_for 并使用负载均衡器的 IP 作为客户端 IP。我有以下试运行日志(我匿名了一些信息):

021/05/17 16:47:28 [error] 22#22: *164 limiting requests, dry run, excess: 0.300 by zone "limit_all", client: 10.0.0.1, server: XXXX, request: "GET /favicon.ico HTTP/1.1", host: "XXXX", referrer: "my/route"

奇怪的是,日志显示了客户端的正确源 IP(日志格式的第一个参数是 '$http_x_forwarded_for):

176.185.151.XXX- - [17/May/2021:16:47:28 +0200] "GET /favicon.ico HTTP/1.1" 200 1152 138173 "https://my/route/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36" rt=0.005 msec=1621262848.720 cid=

为什么 http_x_forwarded_for 在 nginx 日志中有正确的值,但在速率限制配置中没有?你能指出我在这里缺少什么吗?多谢 !

标签: nginxrate-limiting

解决方案


推荐阅读