我经常在 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;