为确保RESTful接口的稳定可用,可通过Nginx的ngx_http_upstream_module内置模块实现对集团服务的健康检测。该方案采用被动式检查机制,即当客户端请求到达Nginx后,Nginx在转发请求过程中对后端服务的连通性进行检测,从而实现服务状态的动态感知与故障转移。

被动式检查原理

被动式检查依赖 Nginx 在处理客户端请求时的转发逻辑:

  • 当客户端请求通过Nginx转发至后端集团服务时,Nginx会实时检查服务的响应状态。
  • 对于RESTful接口,支持通过proxyStatusCheck参数触发错误状态转换:当该参数设为true时,集团服务会将RESTful接口的内部错误(如服务不可用、处理异常等)转化为HTTP 503(Service Unavailable)状态码。
  • Nginx捕获到HTTP 503错误后,会根据预设配置将后续请求转发至其他健康的后端服务,并在指定时间内暂停向故障服务发送请求,实现自动故障转移。

Nginx配置说明

以下是基于ngx_http_upstream_module模块的健康检测配置实例,核心配置包括后端服务集群定义、请求转发规则及错误处理策略:

worker_processes  1;

events {
    worker_connections  1024;
}

http {
    upstream group {
        # 后端服务地址及端口,多个服务用空格分隔
        # max_fails:允许请求失败的次数(超过该次数则标记服务为不可用)
        # fail_timeout:标记服务为不可用的持续时间(超时后重新检测)
        server 192.168.1.1:8274  max_fails=1 fail_timeout=30s;
        server 192.168.1.2:8274  max_fails=1 fail_timeout=30s;
    }

    server {
        listen      80; 

        # 针对RESTful接口的转发配置(路径以/rest开头)
        location /rest {
            # 重写URL,添加proxyStatusCheck=true参数,触发集团服务的错误状态转换
            rewrite ^(.*)$ $1?$args&proxyStatusCheck=true break;
            # 将请求转发至后端服务集群
            proxy_pass  http://group;

            # 配置故障转移策略:当出现以下情况时,自动转发至下一个后端服务
            # error:连接错误;timeout:超时;http_503:服务返回503错误;non_idempotent:非幂等请求也允许重试
            proxy_next_upstream error timeout http_503 non_idempotent;
        }

        # 其他路径的请求转发配置(非RESTful接口)
        location / {
            proxy_pass  http://group;
        }
    }
}

关键参数说明

  1. upstream模块参数
  • max_fails:在fail_timeout时间内,允许请求失败的最大次数。例如max_fails=1表示1次失败即标记服务不可用。
  • fail_timeout:服务被标记为不可用后,暂停转发请求的时间(如30s),超时后Nginx会重新尝试连接该服务。
  1. location模块参数
  • rewrite:通过添加proxyStatusCheck=true参数,确保集团服务将内部错误转换为HTTP 503,便于Nginx识别。
  • proxy_next_upstream:定义触发故障转移的条件,包括连接错误、超时、503错误等,确保请求自动转发至健康服务。

注意事项

  1. 需确保集团服务版本支持proxyStatusCheck参数(最低使用14.4.0及以上版本),否则无法将内部错误转化为HTTP 503。
  2. max_fails和fail_timeout的取值需根据业务场景调整:高可用场景可降低max_fails、缩短fail_timeout,加快故障转移速度;稳定性优先场景可适当增大参数值,避免误判。
  3. 对于非RESTful接口的路径(如/),可根据实际需求决定是否启用健康检测逻辑,示例中未添加proxyStatusCheck参数,即不触发特殊错误处理。