只用Tomcat,不用Nginx搭建Web服务,行不行?曾经提出的愚蠢问题,今天详细给自己解释下,为什么必须用Nginx!
不用Nginx,只用Tomcat的Http请求流程
浏览器处理一个Http请求时,会首先通过DNS服务器找到域名关联的IP地址,然后请求到对应的IP地址。以阿里云域名管理服务为例,一个域名可以最多绑定三个IP地址,这三个IP地址需要是公网IP地址,所以首先需要在三个公网Ip服务器上部署Tomcat实例。
此时将面临的麻烦如下
-
由于DNS域名管理绑定的IP地址有限,最多三个,你如果想要扩容4台Tomcat,是不支持的。无法满足扩容的诉求
-
如果你有10个服务,对应10套Tomcat集群,就需要10 * 3台公网Ip服务器。成本还是蛮高的。
-
10个服务需要对应10个域名,分别映射到对应的Tomcat集群
-
10个域名花不起这个钱啊!(其实可以用二级域名配置DNS映射)
-
公网服务器作为接入层需要有防火墙等安全管控措施,30台公网服务器,网络安全运维,搞不定。
-
公网IP地址需要额外从移动联通运营商或云厂商购买,30个公网IP价格并不便宜。
-
前后端分离的情况,Tomcat无法作为静态文件服务器,只能用Nginx或Apache
以上几个问题属于成本、安全、服务扩容等方面。
如果Tomcat服务发布怎么办
Tomcat在服务发布期间是不可用的,在发布期间Http请求打到发布的服务器,就会失败。由于DNS 最多配置3台服务器,也就是发布期间是 1/3 的失败率。会被老板枪毙,用加特林!!!!
DNS不能自动摘掉故障的IP地址吗?
不能,DNS只是负责解析域名对应的IP地址,他并不知道对应的服务器状态,更不会知道服务器上Tomcat的状态如何。DNS只是解析IP,并没有转发Http请求,所以压根不知道哪台服务器故障率高。更无法自动摘掉IP地址。
能手动下掉故障的IP地址吗?
这个能,但是还是会有大量请求失败。以阿里云为例,配置域名映射时,可以下掉对应的IP地址,但需要指定域名映射的缓存时间,默认10分钟。换句话说,就算你在上线前,摘掉了对应的IP,依然要等10分钟,所有的客户端才会拿到最新的DNS解析地址。
那么把TTL缓存时间改小,可以吗?可以的,但是改小了,就意味更多的请求被迫从DNS服务器拿最新的映射,整体请求耗时增加,用户体验下降!被老板发现,会骂我们。
节点突然挂掉怎么办?
虽然可以在DNS管理后台手动下掉IP地址,但是节点突然宕机、Tomcat Crash等因素导致的突然故障,是来不及下掉对应IP地址的,只能打电话告诉老板,“线上服务崩了,你等我10分钟改点东西”。
如果这时候有个软件能 对Tomcat集群健康检查和故障重试,那就太好了。
恰好,这是 Nginx 的长处!
Nginx可以健康检查和故障重试
而Tomcat没有。
例如有两台Tomcat节点,在Nginx配置故障重试策略
upstream test {
server 127.0.0.1:8001 fail_timeout=60s max_fails=2; ## Server A
server 127.0.0.1:8002 fail_timeout=60s max_fails=2; ## Server B
}
当A节点出现 connect refused时(端口关闭或服务器挂了),说明服务不可用,可能是服务发布,也可能是服务器挂了。此时nginx会把失败的请求自动转发到B节点。假设第二个请求 请求到A还是失败,正好累计2个失败了,那么Nginx会自动把A节点剔除存活列表 60 秒,然后继续把请求2 转发到B节点进行处理。60秒后,再次尝试转发请求到A节点…… 循环往复,直至A节点活过来……
而这一过程客户端是感知不到失败的。因为两次请求都二次转发到B节点成功处理了。客户端并不会感知到A节点的处理失败,这就是Nginx 反向代理的好处。即客户端不用直连服务端,加了个中间商,服务端的个别节点宕机或发布,对客户端都毫无

最低0.47元/天 解锁文章
1580

被折叠的 条评论
为什么被折叠?



