Nginx可以通过检查HTTP请求头(header)中的特定标识来进行请求分发,这是一种常见的流量控制方法。以下是几种实现方式:
http {
map $http_x_custom_header $backend {
default backend_default;
"mobile" backend_mobile;
"desktop" backend_desktop;
"api-v1" backend_api_v1;
}
upstream backend_default {
server 192.168.1.10:8080;
}
upstream backend_mobile {
server 192.168.1.11:8080;
}
upstream backend_desktop {
server 192.168.1.12:8080;
}
upstream backend_api_v1 {
server 192.168.1.13:8080;
}
server {
listen 80;
location / {
proxy_pass http://$backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
}
server {
listen 80;
location / {
if ($http_x_custom_header = "mobile") {
proxy_pass http://backend_mobile;
}
if ($http_x_custom_header = "desktop") {
proxy_pass http://backend_desktop;
}
proxy_pass http://backend_default;
}
}
server {
listen 80;
server_name ~^(?<subdomain>.+)\.example\.com$;
location / {
if ($http_x_custom_header = $subdomain) {
proxy_pass http://backend_$subdomain;
}
proxy_pass http://backend_default;
}
}
http {
split_clients "${http_x_user_id}" $variant {
50% backend_a;
50% backend_b;
}
upstream backend_a {
server 192.168.1.20:8080;
}
upstream backend_b {
server 192.168.1.21:8080;
}
server {
listen 80;
location / {
proxy_pass http://$variant;
}
}
}
变量格式:$http_
前缀后跟header名称,其中-
需要替换为_
(例如X-Custom-Header
对应$http_x_custom_header
)
性能考虑:map指令比if条件更高效,推荐优先使用map
安全性:确保header值被正确验证,防止注入攻击
默认处理:总是为未匹配的情况提供默认后端
日志记录:考虑记录分发决策以便调试
通过以上方法,你可以灵活地基于HTTP请求头中的各种标识(如设备类型、API版本、用户ID等)进行请求分发。