Nginx从1.2.7升级至1.12.x时upstream配置报错求助
Nginx 1.12.x中upstream
check指令无效的解决方案 你遇到的这个问题很典型——check指令并不是Nginx官方核心发行版自带的功能,它来自一个叫nginx_upstream_check_module的第三方模块。你在旧版本1.2.7里能正常使用,应该是当时编译Nginx的时候已经把这个模块加进去了,但升级到1.12.x时,如果你没有重新编译并包含这个模块,Nginx就会识别不了这个指令,直接报错。
下面给你两种可行的解决方案,你可以根据自己的需求选择:
方案一:重新编译Nginx 1.12.x,加入第三方健康检查模块
如果你需要完全保留原来的主动健康检查逻辑,就需要把这个第三方模块重新编译进新的Nginx版本里:
- 先下载适配Nginx 1.12.x的
nginx_upstream_check_module源码(注意要找对应版本的分支,避免兼容性问题) - 编译Nginx时,在configure命令里加上
--add-module=/path/to/nginx_upstream_check_module参数,替换成你实际的模块路径 - 编译完成后,替换掉旧的Nginx二进制文件,重启服务即可
方案二:改用Nginx官方原生的健康检查方案
Nginx 1.9.0及以上版本(你的1.12.x完全符合)提供了原生的健康检查能力,虽然和第三方模块的主动检查逻辑略有不同,但能满足大部分场景需求:
被动健康检查(HTTP上游通用)
这是最常用的原生方案,它会在请求失败时自动标记服务器为不可用,并切换到其他上游节点,配置示例如下:
upstream a_trusted { server 10.19.81.182:10094; keepalive 1024; } server { # 这里保留你原来的server配置,比如监听端口、根目录等 location / { proxy_pass http://a_trusted; # 指定哪些情况会触发切换到下一个上游服务器 proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504; # 设置重试的最大次数 proxy_next_upstream_tries 3; # 设置重试的超时时间 proxy_next_upstream_timeout 10s; } }
这种方式不需要额外编译模块,完全依赖Nginx核心的ngx_http_proxy_module实现。
主动健康检查(仅适用于TCP/UDP上游,开源版)
如果你的上游是TCP服务,Nginx 1.9.0+的ngx_stream_upstream_module提供了原生的主动健康检查,配置逻辑和你原来的check指令类似;但如果是HTTP上游的主动检查,开源版Nginx没有原生支持,只能选择方案一或者升级到Nginx Plus(商业版)。
补充说明:原来的check指令功能
你原来的配置里,check指令是用来做主动健康检查的:
interval=5000:每5秒检查一次上游服务器rise=1:只要1次检查成功,就标记服务器为可用fall=3:连续3次检查失败,标记服务器为不可用timeout=1000:检查请求超时时间为1秒check_http_send:指定发送的健康检查请求内容check_http_expect_alive:指定认为服务器健康的响应状态码范围
内容的提问来源于stack exchange,提问作者MrDuk
相关产品推荐
相关产品推荐

