要根据客户端IP地址的最后一段(即IP地址的第四部分)进行分流,可以使用Nginx的$remote_addr
变量结合map
指令或if
条件判断来实现。以下是几种配置方法:
http {
map $remote_addr $backend {
default backend_default;
"~\.1$" backend_group1; # IP末位是1的
"~\.2[0-4]$" backend_group2; # IP末位20-24的
"~\.(25[0-5]|2[0-4][0-9]|[0-1]?[0-9][0-9])$" backend_group3; # 其他IP
}
upstream backend_default {
server 10.0.0.1:80;
}
upstream backend_group1 {
server 10.0.0.2:80;
}
upstream backend_group2 {
server 10.0.0.3:80;
}
upstream backend_group3 {
server 10.0.0.4:80;
}
server {
listen 80;
location / {
proxy_pass http://$backend;
}
}
}
server {
listen 80;
set $backend "backend_default";
# 提取IP最后一段
if ($remote_addr ~* \.(\d+)$) {
set $last_octet $1;
}
# 根据最后一段分配后端
if ($last_octet ~* ^[1-9]$) {
set $backend "backend_group1";
}
if ($last_octet ~* ^1[0-9]$) {
set $backend "backend_group2";
}
if ($last_octet ~* ^2[0-4]$) {
set $backend "backend_group3";
}
location / {
proxy_pass http://$backend;
}
}
upstream backend_default {
server 10.0.0.1:80;
}
upstream backend_group1 {
server 10.0.0.2:80;
}
upstream backend_group2 {
server 10.0.0.3:80;
}
upstream backend_group3 {
server 10.0.0.4:80;
}
server {
listen 80;
location / {
access_by_lua_block {
local last_octet = ngx.var.remote_addr:match("(%d+)$")
if tonumber(last_octet) <= 50 then
ngx.var.backend = "backend_group1"
else
ngx.var.backend = "backend_group2"
end
}
proxy_pass http://$backend;
}
}
$remote_addr
获取的是直接与Nginx建立连接的客户端IP,如果Nginx前面有代理服务器,需要使用$http_x_forwarded_for
或其他真实IP获取方式
使用if条件判断时要注意Nginx的if指令的限制,避免在location中使用过多的if
对于复杂的IP分流规则,建议使用map指令或Lua脚本实现
配置完成后,使用nginx -t
测试配置语法,然后nginx -s reload
重新加载配置
可以使用Nginx的log_format
记录客户端IP和后端选择情况,便于调试
log_format routing '$remote_addr - $backend [$time_local] "$request"';
access_log /var/log/nginx/routing.log routing;
以上配置可以根据实际需求调整IP分段规则和后端服务器地址。