在 Nginx 中,根据客户端 IP 地址 ($remote_addr
) 进行分发是一个常见的需求,可以用于负载均衡、灰度发布、区域访问控制等场景。以下是几种实现方式:
http {
# 定义 IP 到分组的映射
map $remote_addr $group {
default "default";
"192.168.1.1" "group1";
"192.168.1.2" "group1";
"10.0.0.1" "group2";
# 可以继续添加更多IP映射
}
server {
listen 80;
location / {
# 根据分组转发到不同的上游服务器
proxy_pass http://backend_$group;
}
}
# 定义上游服务器组
upstream backend_group1 {
server 10.1.1.1:8080;
}
upstream backend_group2 {
server 10.1.1.2:8080;
}
upstream backend_default {
server 10.1.1.3:8080;
}
}
server {
listen 80;
location / {
if ($remote_addr = "192.168.1.1") {
proxy_pass http://backend1;
}
if ($remote_addr = "192.168.1.2") {
proxy_pass http://backend2;
}
proxy_pass http://default_backend;
}
}
http {
# 定义IP范围到变量的映射
geo $client_group {
default default;
192.168.1.0/24 group1;
10.0.0.0/8 group2;
}
server {
listen 80;
location / {
proxy_pass http://backend_$client_group;
}
}
}
http {
# 根据IP和User-Agent分发
map "$remote_addr:$http_user_agent" $backend {
default "default";
"192.168.1.1:Mozilla/5.0" "backend1";
"192.168.1.2:~*mobile" "mobile_backend";
}
server {
listen 80;
location / {
proxy_pass http://$backend;
}
}
}
IP 地址获取准确性:
$remote_addr
会显示代理服务器的 IPX-Forwarded-For
头:$http_x_forwarded_for
性能考虑:
IP 列表维护:
geo $client_group {
include /etc/nginx/conf.d/ip_ranges.conf;
default default;
}
日志记录:
log_format custom '$remote_addr - $client_group [$time_local]';
以上方案可以根据实际需求组合使用,实现灵活的基于 IP 地址的分发策略。