在 Nginx 中,您可以通过多种方式根据 URL 路径(path)动态转发到不同的 upstream 服务器。以下是几种常见的实现方法:
这是最基本的方法,通过不同的 location 块匹配不同的路径:
upstream backend1 {
server backend1.example.com;
}
upstream backend2 {
server backend2.example.com;
}
server {
listen 80;
server_name example.com;
location /service1/ {
proxy_pass http://backend1;
}
location /service2/ {
proxy_pass http://backend2;
}
}
对于更复杂的路径匹配,可以使用正则表达式:
location ~ ^/user/(.*) {
proxy_pass http://user_service/$1;
}
location ~ ^/product/(.*) {
proxy_pass http://product_service/$1;
}
对于更复杂的路由逻辑,可以使用 map 指令:
map $uri $backend {
default default_backend;
~^/api/users user_service;
~^/api/products product_service;
~^/static/ static_servers;
}
upstream user_service {
server 10.0.0.1:8080;
}
upstream product_service {
server 10.0.0.2:8080;
}
upstream static_servers {
server 10.0.0.3:80;
}
upstream default_backend {
server 10.0.0.4:80;
}
server {
listen 80;
location / {
proxy_pass http://$backend;
}
}
如果需要更复杂的逻辑,可以集成 OpenResty 的 Lua 模块:
location / {
access_by_lua_block {
local path = ngx.var.uri
if path:match("^/user/") then
ngx.var.backend = "user_service"
elseif path:match("^/product/") then
ngx.var.backend = "product_service"
else
ngx.var.backend = "default_backend"
end
}
proxy_pass http://$backend;
}
split_clients "${remote_addr}${uri}" $variant {
50% backend1;
50% backend2;
}
server {
location / {
proxy_pass http://$variant;
}
}
proxy_pass
指令中 URL 的尾部斜杠会影响路径传递选择哪种方法取决于您的具体需求和 Nginx 配置的复杂度。对于简单路由,location 指令通常足够;对于复杂路由,map 或 Lua 可能更合适。