0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

马哥Linux运维 来源:稀土掘金技术社区 2023-10-17 10:54 次阅读

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

而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 虚拟主机和反向代理

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

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

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集群

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

分别把路径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;                      # 拒绝的ip
           allow 192.168.225.133;               # 允许的ip
        }
    location /group2 {                      # 默认请求 ,后面 "/group2" 表示开启反向代理,也可以是正则表达式
           root     html;                       # 监听地址的默认网站根目录位置
           proxy_pass   http://serverGroup2;   # 代理转发
           index  index.html index.htm;         # 欢迎页面
           deny 127.0.0.1;                      # 拒绝的ip
           allow 192.168.225.133;               # 允许的ip
        }


        error_page   500 502 503 504  /50x.html;# 定义错误提示页面     
        location = /50x.html {                  # 配置错误提示页面
            root   html;
        }
    }

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

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

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Web
    Web
    +关注

    关注

    2

    文章

    1255

    浏览量

    69325
  • 防火墙
    +关注

    关注

    0

    文章

    416

    浏览量

    35588
  • HTTP
    +关注

    关注

    0

    文章

    501

    浏览量

    31053
  • DNS
    DNS
    +关注

    关注

    0

    文章

    217

    浏览量

    19792
  • nginx
    +关注

    关注

    0

    文章

    143

    浏览量

    12161

原文标题:Nginx 虚拟主机和反向代理

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    高性能负载均衡Tomcat集群的实现

    Nginx+Tomcat搭建高性能负载均衡集群
    发表于 08-21 14:31

    使用nginx实现tomcat负载均衡

    Nginx+tomcat+memcached实现负载均衡及session(交叉存储)
    发表于 08-28 08:52

    主要学习下nginx的安装配置

    处理。因为有了中间件,使得大型网站在规划有了更好的层次性,维护上更加方便。也可以实现负载均衡、安全防护等。Nginx是一个开源高性能、可靠的HTTP中间件、代理服务,在目前企业中得到了很大的利用。今天
    发表于 10-19 14:12

    展示一下nginx的学习模块

    handled requests : Nginx总共处理了13个连接,成功创建13次握手(证明中间没有失败的),总共处理了7个请求;Reading : Nginx 读取到客户端的Header信息数
    发表于 10-19 14:16

    NginxTomcat负载均衡实现session共享

    NginxTomcat负载均衡实现session共享
    发表于 09-05 10:40 9次下载
    <b class='flag-5'>Nginx</b>和<b class='flag-5'>Tomcat</b>负载均衡实现session共享

    http请求 get post

    Http请求类 packagewzh.Http; importjava.io.BufferedReader; importjava.io.IOException
    发表于 09-27 10:36 16次下载

    nginxtomcat区别

    Tomcat是Apache 软件基金会的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。Nginx (engine x) 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/
    的头像 发表于 02-12 15:37 1w次阅读
    <b class='flag-5'>nginx</b>和<b class='flag-5'>tomcat</b>区别

    如何发起 HTTP 请求流程

    OSI体系结构TCP/IP相关协议结构应用层HTTP,Telnet,FTP等表示层会话层传输层TCP,UDP网络层IP数据链路层物理层
    发表于 01-01 14:00 4920次阅读
    如何发起 <b class='flag-5'>HTTP</b> <b class='flag-5'>请求</b><b class='flag-5'>流程</b>

    HTTP请求方式有哪些

    相信大家在不管是学习、工作或者面试中,肯定会碰到或被问到 HTTP  相关的知识。今天我们来聊聊有哪些 HTTP 请求方式,以及区别吧! 小伙伴们写过接口或者使用过网页开发者模式的,肯定对以下的内容
    的头像 发表于 09-02 09:21 4560次阅读

    nginx-http-flv-module音视频传输模块

    ./oschina_soft/nginx-http-flv-module.zip
    发表于 06-22 09:44 0次下载
    <b class='flag-5'>nginx-http</b>-flv-module音视频传输模块

    修改应用名称以及http请求

    修改应用名称以及http请求
    的头像 发表于 12-07 08:48 1393次阅读
    修改应用名称以及<b class='flag-5'>http</b><b class='flag-5'>请求</b>

    HTTP请求报文:GET和POST的区别

    GET 和 POST 其实都是 HTTP请求方法。除了这 2 个请求方法之外,HTTP 还有 HEAD、PUT、DELETE、TRACE、CONNECT、OPTIONS 这 6 个
    发表于 04-10 10:11 2254次阅读

    基于Nginx配置origin限制跨域请求

    Header 中指定 Origin 请求头,看是否可以请求成功。 能够请求成功,说明未对请求头进行控制,有漏洞。   curl -H 'Origin//test.com' 
    的头像 发表于 06-26 10:49 1296次阅读
    基于<b class='flag-5'>Nginx</b>配置origin限制跨域<b class='flag-5'>请求</b>

    如何测试HTTP请求示例

    电子发烧友网站提供《如何测试HTTP请求示例.zip》资料免费下载
    发表于 07-13 11:35 1次下载
    如何测试<b class='flag-5'>HTTP</b><b class='flag-5'>请求</b>示例

    Nginx 如何实现高性能低消耗

    Nginx 是一个轻量级的HTTP 服务程序,相比其他服务器程序如Apache,Nginx占用内存少,稳定性高,并发处理能力强。同时Nginx 还是一个反向代理服务程序,和邮件代理服务
    的头像 发表于 11-11 11:31 556次阅读
    <b class='flag-5'>Nginx</b> 如何实现高性能低消耗