首先能够确定的是Nginx在一个tomcat节点彻底宕机的状况下,是不会再去把请求分发过去的。html
它是由upstream中server的参数决定的nginx
server address [weight=number] [max_fails=number] [fail_timeout=time] [slow_start=time] [backup] [down];web
其中max_fails默认为1,fail_timeout=time默认为10s,这两个参数配置起来使用.含义是:在fail_timeout的时间内,nignx与upstream中某个server的链接尝试失败了max_fails次,则nginx会认为该server已经失效。在接下来的 fail_timeout时间内,nginx再也不将请求分发给失效的server。
可是若是我写一段延迟很是长的模拟代码会如何呢tomcat
@RestController public class TestController { @GetMapping("/set") public String home() throws InterruptedException { Thread.sleep(600000); return "Two! Yes"; } }
其配置端口号为9090app
配合一段正常代码server
@RestController public class TestController { @GetMapping("/set") public String home() { return "One!"+new Date(); } }
配置端口号为8080htm
对Nginx的配置为io
upstream web_services {
server 172.18.98.46:9090;
server 172.18.98.47:8080;
}class
server {
listen 8090;
server_name localhost;stream
location ~ /set {
proxy_pass http://web_services;
}
error_page 404 /;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
此时咱们访问8090端口,Nginx的负载到8080端口时
One!Fri Feb 15 18:10:26 CST 2019
可是当负载到9090端口时,会无响应。
此时咱们须要在nginx增长配置
server {
listen 8090;
server_name localhost;
location ~ /set {
proxy_pass http://web_services;
proxy_connect_timeout 2s;
proxy_read_timeout 3s;
proxy_send_timeout 5s;
}
error_page 404 /;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
其中proxy_read_timeout 3s指的是当响应超过3秒后,会从新负载到新的Server上去,在咱们这里就是9090没法响应,3秒后会负载到8080端口上去,并默认在10秒后才会从新访问9090端口,以此循环。固然这些时间能够根据实际状况自由搭配的。