Nginx的geo
模块是一个强大的IP地址匹配工具,它可以根据客户端的IP地址创建变量,常用于基于地理位置的路由、访问控制等场景。
geo [$address] $variable {
default default_value;
include file_or_mask;
ranges;
IP1 value1;
IP2 value2;
subnet1 value3;
...
}
geo $geo {
default 0;
192.168.1.0/24 1;
10.1.0.0/16 2;
}
geo $country_code {
default unknown;
203.0.113.0/24 US;
198.51.100.0/24 UK;
}
geo $region {
ranges;
default 0;
10.0.0.0-10.0.0.255 1;
10.0.1.0-10.0.1.255 2;
}
geo $continent {
include /etc/nginx/conf.d/geo-continent.conf;
default unknown;
}
geo模块可以与upstream模块结合实现基于地理位置的负载均衡。
geo $backend_selector {
default backend_default;
192.168.1.0/24 backend_eu;
10.0.0.0/8 backend_us;
}
upstream backend_default {
server 10.1.1.1;
server 10.1.1.2;
}
upstream backend_eu {
server 10.2.2.1;
server 10.2.2.2;
}
upstream backend_us {
server 10.3.3.1;
server 10.3.3.2;
}
server {
location / {
proxy_pass http://$backend_selector;
}
}
geo $client_region {
default unknown;
include geo/regions.conf;
}
map $client_region $backend_pool {
us-east backend_us_east;
us-west backend_us_west;
eu-central backend_eu;
asia backend_asia;
default backend_default;
}
upstream backend_us_east {
server 10.1.1.1:80 weight=3;
server 10.1.1.2:80;
}
upstream backend_us_west {
server 10.2.1.1:80;
server 10.2.1.2:80;
}
upstream backend_eu {
server 10.3.1.1:80;
server 10.3.1.2:80;
}
server {
location / {
proxy_pass http://$backend_pool;
}
}
geo $is_internal {
default 0;
10.0.0.0/8 1;
192.168.0.0/16 1;
}
upstream internal_backend {
server 192.168.100.1;
server 192.168.100.2;
}
upstream external_backend {
server 203.0.113.1;
server 203.0.113.2;
}
server {
set $backend_scheme http;
if ($is_internal) {
set $backend_scheme "http://internal_backend";
}
if ($is_internal = 0) {
set $backend_scheme "http://external_backend";
}
location / {
proxy_pass $backend_scheme;
}
}
ranges
可以提高匹配效率nginx -t
测试配置geoip2
模块替代ranges
指令优化连续IP范围查找include
指令包含外部文件,然后定期更新该文件nginx -s reload
重新加载配置通过合理配置geo模块,可以实现高效、灵活的地理位置感知负载均衡,优化用户体验和系统性能。