插件窝 干货文章 如何用Nginx实现单一入口访问多个不同API系统?

如何用Nginx实现单一入口访问多个不同API系统?

system backend proxy server 71    来源:    2025-03-26

使用Nginx实现单一入口访问多个API系统

要实现通过单一入口访问多个不同的API系统,可以使用Nginx的反向代理和路由功能。以下是几种实现方案:

方案一:基于路径前缀的路由

这是最常见的方法,通过不同的URL路径前缀将请求路由到不同的后端服务。

server {
    listen 80;
    server_name api.example.com;

    location /system1/ {
        proxy_pass http://system1-backend/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    location /system2/ {
        proxy_pass http://system2-backend/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    location /system3/ {
        proxy_pass http://system3-backend/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

方案二:基于子域名的路由

如果API系统支持不同的子域名,可以使用这种方法:

server {
    listen 80;
    server_name system1.api.example.com;

    location / {
        proxy_pass http://system1-backend;
        # 其他代理设置...
    }
}

server {
    listen 80;
    server_name system2.api.example.com;

    location / {
        proxy_pass http://system2-backend;
        # 其他代理设置...
    }
}

方案三:基于请求头或参数的路由

对于更复杂的路由需求,可以使用Nginx的map指令或Lua脚本:

map $http_x_api_system $backend {
    default        http://default-backend;
    "system1"      http://system1-backend;
    "system2"      http://system2-backend;
}

server {
    listen 80;
    server_name api.example.com;

    location / {
        proxy_pass $backend;
        # 其他代理设置...
    }
}

方案四:使用Nginx Plus或OpenResty的高级路由

对于企业级需求,可以考虑:

  1. Nginx Plus:提供更强大的API网关功能
  2. OpenResty:基于Nginx的Lua脚本扩展
location / {
    access_by_lua_block {
        local path = ngx.var.uri
        if path:match("^/system1") then
            ngx.var.backend = "http://system1-backend"
        elseif path:match("^/system2") then
            ngx.var.backend = "http://system2-backend"
        else
            ngx.var.backend = "http://default-backend"
        end
    }

    proxy_pass $backend;
    # 其他代理设置...
}

最佳实践建议

  1. 统一API前缀:建议所有API系统使用统一的前缀如/api/
  2. 版本控制:考虑在路径中包含版本号,如/api/v1/system1/
  3. 负载均衡:可以为每个后端服务配置多个实例
  4. 健康检查:Nginx Plus支持主动健康检查
  5. 限流保护:使用limit_req模块保护后端服务
  6. 日志分离:为不同API系统配置不同的访问日志

负载均衡配置示例

upstream system1-backend {
    server 10.0.0.1:8080;
    server 10.0.0.2:8080;
    keepalive 32;
}

upstream system2-backend {
    server 10.0.0.3:8080;
    server 10.0.0.4:8080;
    keepalive 32;
}

server {
    location /system1/ {
        proxy_pass http://system1-backend/;
        # 其他代理设置...
    }

    location /system2/ {
        proxy_pass http://system2-backend/;
        # 其他代理设置...
    }
}

通过以上配置,你可以实现一个统一的API网关入口,将请求路由到不同的后端API系统。