nginx 检查连接数限制时出现错误 IP

nginx 检查连接数限制时出现错误 IP

我经常在 nginx 错误日志中看到以下行。这导致网站访问者看到 50x 错误。我们有一个多语言网站,其 URL 为 language.example.com

[error] 25720#0: *2716 limiting connections by zone "slimits", client: 127.0.0.1, server: localhost, request: .......

客户端总是显示为 127.0.0.1,这非常可疑。

有一个使用本地主机和另一台服务器的负载平衡。上游 nginx 配置:

upstream example.com {
    server 127.0.0.1:8082 weight=3 max_fails=3 fail_timeout=2;
    server otherserver.example.net:8082 max_fails=3 fail_timeout=2;
}

限制值现在设置为 40

limit_conn slimits 40;

据我所知,这个限制应该是远程用户能够打开的连接数限制。我猜想远程用户的 IP 地址没有正确地传递给 nginx。

这是站点的定义:

server {
    listen   80 default_server;
    server_name localhost;

    allow   all;
}


server {
    listen   80;
    server_name *.example.com;    
    # stop   subdomains like  everything.example.com
    deny all;
}
server {
    listen   80;
    server_name server.com www.example.com;
    location / {
        proxy_pass   http://example.com;
    }
}
server {
    listen   80;
    server_name fr.example.com;
    location / {
        proxy_pass   http://fr.example.com;
        proxy_set_header        Host            $host;
        proxy_set_header        X-Real-IP       $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

Nginx版本为:1.0.12。

答案1

OP 表示在评论中这个设置解决了错误IP的问题。

real_ip_header X-Forwarded-For;
set_real_ip_from 0.0.0.0/0; 

但是,set_real_ip_from 0.0.0.0/0将来可能会出现麻烦。基本上,nginx 信任所有通过X-Forwarded-For标头提供真实 IP 地址的互联网主机,即使是来自欺骗性请求。例如(归功于此主题):

curl --header "X-Forwarded-For: 1.2.3.4" "http://localhost/"

上述请求是通过 localhost 的 curl 生成的,而不是来自 nginx 负载均衡器。

目前,欺骗问题有点困难,因为服务器仅位于 127.0.0.1,但它可以作为安全预防措施。

因此,我们对其进行更改,以便 nginx 仅信任来自负载均衡器 IP 地址 127.0.0.1 的 X-Forwarded-For

real_ip_header X-Forwarded-For;
set_real_ip_from 127.0.0.1; 

相关内容