Nginx动态更新upstream可以通过以下几种方式实现:

1. 使用Nginx Plus

Nginx Plus是Nginx的商业版本,支持动态更新upstream配置,无需重启Nginx服务。可以通过API动态添加、删除或修改upstream服务器。

2. 使用第三方模块

一些第三方模块如ngx_dynamic_upstreamnginx-upsync-module可以实现动态更新upstream。这些模块通常通过从外部存储(如Consul、etcd等)同步upstream配置。

3. 使用Lua脚本

通过OpenResty(基于Nginx的Lua扩展),可以使用Lua脚本动态更新upstream配置。

案例:使用Nginx Plus动态更新upstream

  1. 配置Nginx Plus
    在Nginx配置文件中定义一个upstream组:

    http {
        upstream backend {
            zone backend 64k;
            server 192.168.1.1:80;
            server 192.168.1.2:80;
        }
    
        server {
            listen 80;
    
            location / {
                proxy_pass http://backend;
            }
        }
    }
  2. 使用API动态更新upstream
    使用Nginx Plus的API动态添加或删除upstream服务器:

    # 添加新的服务器
    curl -X POST -d '{"server":"192.168.1.3:80"}' http://localhost/api/3/http/upstreams/backend/servers
    
    # 删除服务器
    curl -X DELETE http://localhost/api/3/http/upstreams/backend/servers/2

案例:使用nginx-upsync-module动态更新upstream

  1. 安装nginx-upsync-module
    编译Nginx时添加nginx-upsync-module模块。

  2. 配置Nginx
    在Nginx配置文件中定义upstream并从etcd同步配置:

    http {
        upstream backend {
            upsync 127.0.0.1:2379/v2/keys/upstreams/backend upsync_timeout=6m upsync_interval=500ms upsync_type=etcd strong_dependency=off;
            upsync_dump_path /etc/nginx/conf.d/backend.conf;
    
            include /etc/nginx/conf.d/backend.conf;
        }
    
        server {
            listen 80;
    
            location / {
                proxy_pass http://backend;
            }
        }
    }
  3. 更新etcd中的upstream配置
    通过etcd API更新upstream服务器列表:

    curl -X PUT http://127.0.0.1:2379/v2/keys/upstreams/backend -d value='[{"server":"192.168.1.1:80"},{"server":"192.168.1.2:80"}]'

通过这些方法,可以实现Nginx的upstream动态更新,无需重启服务。

本篇文章内容来源于:Nginx动态更新upstream详细说明以及案例