之前nginx+tomcat集群配置是简单的轮询机制
upstream servers{
#server 172.25.67.29:9091 weight=1 max_fails=1 fail_timeout=50;
server 172.25.67.29:9091;
server 172.25.67.27:9091;
server 172.25.67.27:8380;
}
如上图。这样做的话重启其中一台tomcat没啥问题。但是启动的时候由于服务比较大 加载比较快。然后tomcat又是一启动就初始化端口导致项目启动一半时,如果用户访问就可能造成请求等待响应。
这个时候用户一般都是懵逼的情况。然后估计就打电话说系统慢了。。。搞不好一些关键的请求 例如 支付等等会出现问题。
那么怎么做才能在服务启动的时候让nginx把这台服务down呢?
upstream servers{
#server 172.25.67.29:9091 weight=1 max_fails=1 fail_timeout=50;
server 172.25.67.29:9091 max_fails=10 fail_timeout=100;
server 172.25.67.27:9091 max_fails=10 fail_timeout=100;
server 172.25.67.27:8380 max_fails=10 fail_timeout=100;
#max_fails 表示访问服务出现多少次错误就然后服务down掉 fail_timeout 时间。 这个就是 出现10次错误 就让服务down掉100秒 不配置 默认是1次
#max_fails 究竟哪些错误会算到max_fails 呢 目前试了一个[error] 26726#0: *130141 connect() failed (111: Connection refused) while connecting to upstream。和upstream timed out (110: Connection timed out) while reading response header from upstrea 就是服务停了或者超时 端口访问不到的情况
}
location ^~ /servers {
proxy_pass http://servers;
proxy_redirect off;
# proxy_redirect http:// https://;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 50m;
client_body_buffer_size 256k;
proxy_connect_timeout 300s; #与服务器连接超时。一般内网个的这个都没啥用
proxy_send_timeout 300s; #后端服务器数据回传时间_就是在规定时间之内后端服务器必须传完所有的数据 这个一般返回大量数据的时候有用。一般也没啥用
proxy_read_timeout 100s; #可以说是后端服务器处理请求的时间。 超过这个时间后端没返回就抛504还是502来着?
proxy_buffer_size 16k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
#proxy_next_upstream error timeout http_504 http_500; 不定义重发错误了。没必要 都出现500了 别的服务器也不好说
}
上面这样做有一个问题 就是 这个重试时间很难定义。 万一服务10s就启动了 那就还得空等90s 。不太好。 还有些请求时间很长超时了 但是服务并没有问题。这样也会将服务down掉。 万一用户瞎搞 不停的点 不停的超时。那就把所有服务都搞挂了。 百度了一堆也没啥解决方案。
nginx解决了。tomcat的问题还没解决。 服务里有很多很慢的请求。那么关闭tomcat 这些请求也就中断了。
百度了一下 都说使用 kill -15 进程号 或者 shutdown.sh 但是 测试过并不好使 。确实优雅 但是 也不会等请求处理完毕了才关闭。没一会服务就会关了。但是会触发事务回滚。 短一点的请求还能返回。长一点的基本没戏。
自己偷偷想了个方案。 用服务器防火墙来弄。 关闭服务的时候把服务端口用防火墙禁用掉。 等启动完成了再将端口放开。。这个方法也是有够麻烦的。
首先需要写shell脚本。 关闭tomcat服务之前先禁用端口。等个60秒 然后再关闭服务,这样基本上就不会有服务停止然后请求中断的问题了。然后服务启动后再开放端口。这样加上nginx用户基本是无感知的