为确保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;
}
}
}
关键参数说明
- upstream模块参数
- max_fails:在fail_timeout时间内,允许请求失败的最大次数。例如max_fails=1表示1次失败即标记服务不可用。
- fail_timeout:服务被标记为不可用后,暂停转发请求的时间(如30s),超时后Nginx会重新尝试连接该服务。
- location模块参数
- rewrite:通过添加proxyStatusCheck=true参数,确保集团服务将内部错误转换为HTTP 503,便于Nginx识别。
- proxy_next_upstream:定义触发故障转移的条件,包括连接错误、超时、503错误等,确保请求自动转发至健康服务。
注意事项
- 需确保集团服务版本支持proxyStatusCheck参数(最低使用14.4.0及以上版本),否则无法将内部错误转化为HTTP 503。
- max_fails和fail_timeout的取值需根据业务场景调整:高可用场景可降低max_fails、缩短fail_timeout,加快故障转移速度;稳定性优先场景可适当增大参数值,避免误判。
- 对于非RESTful接口的路径(如/),可根据实际需求决定是否启用健康检测逻辑,示例中未添加proxyStatusCheck参数,即不触发特殊错误处理。