Redian新闻
>
有 Tomcat,为什么还要 Nginx ?

有 Tomcat,为什么还要 Nginx ?

公众号新闻

转自:掘金稀土    链接:https://juejin.cn/post/7280088532377534505

只用Tomcat,不用Nginx搭建Web服务,行不行?我曾经提出的愚蠢问题,今天详细给自己解释下,为什么必须用Nginx!

不用Nginx,只用Tomcat的Http请求流程

浏览器处理一个Http请求时,会首先通过DNS服务器找到域名关联的IP地址,然后请求到对应的IP地址。以阿里云域名管理服务为例,一个域名可以最多绑定三个IP地址,这三个IP地址需要是公网IP地址,所以首先需要在三个公网Ip服务器上部署Tomcat实例。

此时我将面临的麻烦如下

  1. 由于DNS域名管理绑定的IP地址有限,最多三个,你如果想要扩容4台Tomcat,是不支持的。无法满足扩容的诉求

  2. 如果你有10个服务,对应10套Tomcat集群,就需要10 * 3台公网Ip服务器。成本还是蛮高的。

  3. 10个服务需要对应10个域名,分别映射到对应的Tomcat集群

  4. 10个域名我花不起这个钱啊!(其实可以用二级域名配置DNS映射)

  5. 公网服务器作为接入层需要有防火墙等安全管控措施,30台公网服务器,网络安全运维,我搞不定。

  6. 公网IP地址需要额外从移动联通运营商或云厂商购买,30个公网IP价格并不便宜。

  7. 前后端分离的情况,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 Aserver 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 反向代理的好处。即客户端不用直连服务端,加了个中间商,服务端的个别节点宕机或发布,对客户端都毫无影响。

而Tomcat只是Java Web容器,并不能做这些事情。

10个服务,10个Tomcat集群,就要10个域名,30个公网IP吗?

以阿里云为例,域名管理后台是可以配置二级域名映射,所以一个公网域名拆分为10个二级域名就可以了。

所以只用Tomcat,不用Nginx。需要1个公网域名,10个二级域名,30台服务器、30个公网IP。

当我和老板提出这些的时候,他跟我说:“你XX疯了,要不滚蛋、要不想想别的办法。老子没钱,你看我脑袋值几个钱,拿去换公网IP吧”。

DNS映射到Tomcat的IP地址,必须要公网,成本实在hold不住。心里苦啊,要是能有一个软件,能帮我把一个域名分别映射到30个内网IP就好了。

恰好 Nginx可以!

Nginx 虚拟主机和反向代理

例如把多个二级域名映射到不同的文件目录,例如

  1. bbs.abc.com,映射到 html/bbs

  2. blog.abc.com 映射到 html/blog

http {include mime.types;default_type application/octet-stream;sendfile on;keepalive_timeout 65;server {listen 80;server_name www.abc.com;location / {root html/www;index index.html index.htm; } }
server {listen 80;server_name bbs.abc.com;location / { root html/bbs;index index.html index.htm; } }
server {listen 80;server_name blog.abc.com;location / { root html/blog;index index.html index.htm; } } }

例如把不同的二级域名或者URL路径 映射到不同的 Tomcat集群

  1. 分别定义 serverGroup1、serverGroup2 两个Tomcat集群

  2. 分别把路径group1、group1 反向代理到serverGroup1、serverGroup2

upstream serverGroup1 { # 定义负载均衡设备的ip和状态server 192.168.225.100:8080 ; # 默认权重值为一server 192.168.225.101:8082 weight=2; # 值越高,负载的权重越高server 192.168.225.102:8083 ; server 192.168.225.103:8084 backup; # 当其他非backup状态的server 不能正常工作时,才请求该server,简称热备 }
upstream serverGroup2 { # 定义负载均衡设备的ip和状态server 192.168.225.110:8080 ; # 默认权重值为一server 192.168.225.111:8080 weight=2; # 值越高,负载的权重越高server 192.168.225.112:8080 ;server 192.168.225.113:8080 backup; # 当其他非backup状态的server 不能正常工作时,才请求该server,简称热备 }
server { # 设定虚拟主机配置listen 80; # 监听的端口server_name picture.itdragon.com; # 监听的地址,多个域名用空格隔开location /group1 { # 默认请求 ,后面 "/group1" 表示开启反向代理,也可以是正则表达式root html; # 监听地址的默认网站根目录位置proxy_pass http://serverGroup1; # 代理转发index index.html index.htm; # 欢迎页面deny 127.0.0.1; # 拒绝的ipallow 192.168.225.133; # 允许的ip }location /group2 { # 默认请求 ,后面 "/group2" 表示开启反向代理,也可以是正则表达式root html; # 监听地址的默认网站根目录位置proxy_pass http://serverGroup2; # 代理转发index index.html index.htm; # 欢迎页面deny 127.0.0.1; # 拒绝的ipallow 192.168.225.133; # 允许的ip }
error_page 500 502 503 504 /50x.html;# 定义错误提示页面 location = /50x.html { # 配置错误提示页面root html; } }

经过以上的教训,我再也不会犯这么愚蠢的错误了,我需要Tomcat,也需要Nginx。

当然如果钱足够多、资源无限丰富,公网IP、公网服务器、域名无限…… 服务发布,网站崩溃,无动于衷,可以不用Nginx。

END

官方站点:www.linuxprobe.com

Linux命令大全:www.linuxcool.com

刘遄老师QQ:5604215

Linux技术交流群:2636170

(新群,火热加群中……)

想要学习Linux系统的读者可以点击"阅读原文"按钮来了解书籍《Linux就该这么学》,同时也非常适合专业的运维人员阅读,成为辅助您工作的高价值工具书!


微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
这套轻量 Nginx 日志解决方案,真香!一百三十五 揭盘手机性能都这么强了,为什么还有人在搞安卓掌机?那么荒谬的阴谋论和谎言,为什么还是有人会信?Kubernetes 中 Nginx 配置热加载NGINX 模块现在可以用 Rust 编写了FastDFS+Nginx - 本地搭建文件服务器同时实现在外远程访问「端口映射」Nginx 是如何解决惊群效应的?亿万富翁家庭为什么还要带货?30平米的“巢”:互相折磨的两代人,为什么还要住在一起留学的性价比极低,为什么还有那么多人前赴后继?明明什么都没干,为什么还会这么累?既然有了Kubernetes,为什么还需要 Istio?冲奥数还是学AMC?AMC有哪些备考规划分享?新加坡已经很拥挤了,为什么还要增加人口?流云的告白一天开店近8家,为什么还是难成“火锅界的蜜雪冰城荷兰政府部分撤销了此前颁发的NXT:2050i和NXT:2100i两个型号光刻机的出口许可证FastDFS+Nginx本地搭建文件服务器同时实现在外远程访问「端口映射」The Bookstore Giving Shanghai’s Women a Room of Their Own《 爵 》Nginx的配置文件如何设置头信息保留真实IP不丢失羊绒这么贵,为什么还有人买?几百元和上万块的毛衣差在哪?流云的告白都实名了,为什么还抓不到骗子?有Tomcat,为什么还要Nginx?人性厮杀!盛老爷那么爱林小娘,为什么还是亲手打死她?FastDFS+Nginx,轻轻松松搭建一个本地文件服务器Nginx 代理 MySQL 连接,并限制可访问 IP我不是虎妈—另类哈佛妈妈与女儿一起长大(二)英语句子什么时候用to do something,什么时候用doing something?中国好,为什么还那么多人移民?这是真问题吗?意大利饮食健康的秘密:爱吃碳水的意大利人,为什么还能保有好身材?自动生成prompt:Automatic prompt engineering前后端都用得上的 Nginx 日常使用经验
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。