如何配置Nginx 1.13.10:gRPC上游主机不存在时不崩溃
我之前在维护老版本Nginx的gRPC配置时也遇到过这个坑!当直接用grpc_pass指向未启动的后端服务时,1.13.x版本的Nginx会因为无法建立初始连接直接崩溃,根本等不到后续的请求处理。下面是亲测有效的解决办法:
核心思路
通过upstream块统一管理gRPC后端服务,配置连接失败的容错参数,让Nginx在后端未启动时不会直接崩溃,而是进入“尝试重连”的容错逻辑。
修改后的完整配置
events { multi_accept on; worker_connections 16384; use epoll; } http { log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent"'; # 定义gRPC后端的upstream块,配置容错规则 upstream foo_grpc_backend { server foo:8088; # 连续失败max_fails次后,标记后端不可用10秒,之后自动重试 max_fails 3; fail_timeout 10s; } server { listen 80 http2; access_log /dev/stdout main; location /foo.test { grpc_pass grpc://foo_grpc_backend; # 可选:当请求遇到错误/超时,自动重试(单后端时也能避免请求直接挂掉) grpc_next_upstream error timeout; } } }
关键配置说明
upstream块:把后端连接逻辑抽离出来后,Nginx启动时不会因为单个后端不可用就崩溃,而是会按照配置的规则尝试后续重连。max_fails&fail_timeout:这两个参数配合使用,max_fails设置连续失败的次数阈值,fail_timeout设置标记后端不可用的时长,超时后Nginx会自动尝试重新连接后端服务。grpc_next_upstream:可选配置,当请求遇到错误或超时的时候,会触发重试逻辑(即使只有一个后端,也能让请求返回标准的gRPC错误,而不是导致Nginx进程崩溃)。
这个配置在Nginx 1.13.10上完全适用,能让Nginx在后端服务未启动的情况下正常启动运行,等后端服务上线后自动恢复转发。
内容的提问来源于stack exchange,提问作者RODNEY ZHANG
相关产品推荐
相关产品推荐

