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 @ 2024-01-11 21:14  NetRookieX  阅读(148)  评论(0编辑  收藏  举报