nginx中多个server块共用upstream会相互影响吗

背景

nginx中经常有这样的场景,多个server块共用一个域名。
如:upstream有2个以上的域名,nginx配置两个server块,共用一个upstream配置。
那么,如果其中一个域名发生"no live upstreams while connecting to upstream"错误,会不会影响另一个域名呢?

先说结论

会。导致另一个域名会返回5xx,并且也报错"no live upstreams while connecting to upstream"

模拟错误"no live upstreams"

环境

机器 ip 作用
test1 192.168.10.129 nginx代理服务器
test2 192.168.10.130、192.168.10.150 upstream服务器(用nginx模拟)

test1配置(角色:nginx代理)

配置域名解析:

vim /etc/hosts
	# 将域名解析到本机,待会儿在本机测试
	127.0.0.1 test1.com
	127.0.0.1 test2.com

nginx配置:

error_log /var/log/nginx/error.log;
server {
	listen       80;
	listen       [::]:80;
	server_name  test1.com;
	location /test {
		proxy_set_header Host $host;
		proxy_next_upstream http_502;			# 关键配置:遇到502,则尝试下一个upstream server
		proxy_pass http://test;
	}
}
server {
	listen       80;
	listen       [::]:80;
	server_name  test2.com;
	location /test {
		proxy_set_header Host $host;
		proxy_pass http://test;
	}
}
upstream test {
	server 192.168.10.130 max_fails=1 fail_timeout=15s;
	server 192.168.10.150 max_fails=1 fail_timeout=15s;
}

test2配置(角色:upstream)

server {
	listen       80;
	listen       [::]:80;
	server_name  test1.com;
	location /test {
		return 502 "test1.com";			# 关键配置:返回502,模拟错误
	}
}
server {
	listen       80;
	listen       [::]:80;
	server_name  test2.com;
	location /test {
		return 200 "test2.com";
	}
}

测试

在哪里测试?test1

curl -i http://test2.com/test		# 快速运行多遍,发现不报错。
curl -i http://test1.com/test		# 快速运行多遍,观察/var/log/nginx/error.log会报错:"no live upstreams"
curl -i http://test2.com/test		# 报错后,立即执行此命令。发现也报错了。

得出结论:nginx中多个server块共用upstream相互影响

建议

如果影响业务,有2种解法:

  1. 将重要的服务的upstream分离出来。(实测不会相互影响)
  2. 调整max_fails和fail_timeout参数,如server 192.168.10.130 max_fails=99999 fail_timeout=5s;



那年,郭少在京城



posted @   NetRookieX  阅读(208)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示