0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

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

馬哥Linux運維 ? 來源:稀土掘金技術社區(qū) ? 2023-10-17 10:54 ? 次閱讀

只用Tomcat,不用Nginx搭建Web服務,行不行?我曾經(jīng)提出的愚蠢問題,今天詳細給自己解釋下,為什么必須用Nginx!

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

瀏覽器處理一個Http請求時,會首先通過DNS服務器找到域名關聯(lián)的IP地址,然后請求到對應的IP地址。以阿里云域名管理服務為例,一個域名可以最多綁定三個IP地址,這三個IP地址需要是公網(wǎng)IP地址,所以首先需要在三個公網(wǎng)Ip服務器上部署Tomcat實例。

此時我將面臨的麻煩如下

由于DNS域名管理綁定的IP地址有限,最多三個,你如果想要擴容4臺Tomcat,是不支持的。無法滿足擴容的訴求

如果你有10個服務,對應10套Tomcat集群,就需要10 * 3臺公網(wǎng)Ip服務器。成本還是蠻高的。

10個服務需要對應10個域名,分別映射到對應的Tomcat集群

10個域名我花不起這個錢啊?。ㄆ鋵嵖梢杂枚売蛎渲肈NS映射)

公網(wǎng)服務器作為接入層需要有防火墻等安全管控措施,30臺公網(wǎng)服務器,網(wǎng)絡安全運維,我搞不定。

公網(wǎng)IP地址需要額外從移動聯(lián)通運營商或云廠商購買,30個公網(wǎng)IP價格并不便宜。

前后端分離的情況,Tomcat無法作為靜態(tài)文件服務器,只能用Nginx或Apache

以上幾個問題屬于成本、安全、服務擴容等方面。

如果Tomcat服務發(fā)布怎么辦

Tomcat在服務發(fā)布期間是不可用的,在發(fā)布期間Http請求打到發(fā)布的服務器,就會失敗。由于DNS 最多配置3臺服務器,也就是發(fā)布期間是 1/3 的失敗率。 我會被老板槍斃,用加特林

DNS不能自動摘掉故障的IP地址嗎?

不能,DNS只是負責解析域名對應的IP地址,他并不知道對應的服務器狀態(tài),更不會知道服務器上Tomcat的狀態(tài)如何。DNS只是解析IP,并沒有轉(zhuǎn)發(fā)Http請求,所以壓根不知道哪臺服務器故障率高。更無法自動摘掉IP地址。

我能手動下掉故障的IP地址嗎?

這個我能,但是還是會有大量請求失敗。以阿里云為例,配置域名映射時,我可以下掉對應的IP地址,但需要指定域名映射的緩存時間,默認10分鐘。換句話說,就算你在上線前,摘掉了對應的IP,依然要等10分鐘,所有的客戶端才會拿到最新的DNS解析地址。

那么把TTL緩存時間改小,可以嗎? 可以的,但是改小了,就意味更多的請求被迫從DNS服務器拿最新的映射,整體請求耗時增加,用戶體驗下降!被老板發(fā)現(xiàn),會罵我。

節(jié)點突然掛掉怎么辦?

雖然可以在DNS管理后臺手動下掉IP地址,但是節(jié)點突然宕機、Tomcat Crash等因素導致的突然故障,我是來不及下掉對應IP地址的,我只能打電話告訴老板,“線上服務崩了,你等我10分鐘改點東西”。

如果這時候有個軟件能 對Tomcat集群健康檢查和故障重試,那就太好了。

恰好,這是 Nginx 的長處!

Nginx可以健康檢查和故障重試

而Tomcat沒有。

例如有兩臺Tomcat節(jié)點,在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節(jié)點出現(xiàn) connect refused時(端口關閉或服務器掛了),說明服務不可用,可能是服務發(fā)布,也可能是服務器掛了。此時nginx會把失敗的請求自動轉(zhuǎn)發(fā)到B節(jié)點。 假設第二個請求 請求到A還是失敗,正好累計2個失敗了,那么Nginx會自動把A節(jié)點剔除存活列表 60 秒,然后繼續(xù)把請求2 轉(zhuǎn)發(fā)到B節(jié)點進行處理。60秒后,再次嘗試轉(zhuǎn)發(fā)請求到A節(jié)點…… 循環(huán)往復,直至A節(jié)點活過來……

而這一過程客戶端是感知不到失敗的。因為兩次請求都二次轉(zhuǎn)發(fā)到B節(jié)點成功處理了??蛻舳瞬⒉粫兄紸節(jié)點的處理失敗,這就是Nginx 反向代理的好處。即客戶端不用直連服務端,加了個中間商,服務端的個別節(jié)點宕機或發(fā)布,對客戶端都毫無影響。

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

10個服務,10個Tomcat集群,就要10個域名,30個公網(wǎng)IP嗎?

以阿里云為例,域名管理后臺是可以配置二級域名映射,所以一個公網(wǎng)域名拆分為10個二級域名就可以了。

所以只用Tomcat,不用Nginx。需要1個公網(wǎng)域名,10個二級域名,30臺服務器、30個公網(wǎng)IP。

當我和老板提出這些的時候,他跟我說:“你XX瘋了,要不滾蛋、要不想想別的辦法。老子沒錢,你看我腦袋值幾個錢,拿去換公網(wǎng)IP吧”。

DNS映射到Tomcat的IP地址,必須要公網(wǎng),成本實在hold不住。心里苦啊,要是能有一個軟件,能幫我把一個域名分別映射到30個內(nèi)網(wǎng)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和狀態(tài)
        server 192.168.225.100:8080 ;           # 默認權(quán)重值為一
        server 192.168.225.101:8082 weight=2;   # 值越高,負載的權(quán)重越高
        server 192.168.225.102:8083 ;       
        server 192.168.225.103:8084 backup;     # 當其他非backup狀態(tài)的server 不能正常工作時,才請求該server,簡稱熱備
    }


upstream serverGroup2 {                    # 定義負載均衡設備的ip和狀態(tài)
        server 192.168.225.110:8080 ;           # 默認權(quán)重值為一
        server 192.168.225.111:8080 weight=2;   # 值越高,負載的權(quán)重越高
        server 192.168.225.112:8080 ;
        server 192.168.225.113:8080 backup;     # 當其他非backup狀態(tài)的server 不能正常工作時,才請求該server,簡稱熱備
    }


    server {                                    # 設定虛擬主機配置
        listen  80;                             # 監(jiān)聽的端口
        server_name  picture.itdragon.com;      # 監(jiān)聽的地址,多個域名用空格隔開
        location /group1 {                      # 默認請求 ,后面 "/group1" 表示開啟反向代理,也可以是正則表達式
           root     html;                       # 監(jiān)聽地址的默認網(wǎng)站根目錄位置
           proxy_pass   http://serverGroup1;   # 代理轉(zhuǎn)發(fā)
           index  index.html index.htm;         # 歡迎頁面
           deny 127.0.0.1;                      # 拒絕的ip
           allow 192.168.225.133;               # 允許的ip
        }
    location /group2 {                      # 默認請求 ,后面 "/group2" 表示開啟反向代理,也可以是正則表達式
           root     html;                       # 監(jiān)聽地址的默認網(wǎng)站根目錄位置
           proxy_pass   http://serverGroup2;   # 代理轉(zhuǎn)發(fā)
           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;
        }
    }

經(jīng)過以上的教訓,我再也不會犯這么愚蠢的錯誤了,我需要Tomcat,也需要Nginx。

當然如果錢足夠多、資源無限豐富,公網(wǎng)IP、公網(wǎng)服務器、域名無限…… 服務發(fā)布,網(wǎng)站崩潰,無動于衷,可以不用Nginx。

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Web
    Web
    +關注

    關注

    2

    文章

    1255

    瀏覽量

    69292
  • 防火墻
    +關注

    關注

    0

    文章

    416

    瀏覽量

    35576
  • HTTP
    +關注

    關注

    0

    文章

    499

    瀏覽量

    30978
  • DNS
    DNS
    +關注

    關注

    0

    文章

    215

    瀏覽量

    19770
  • nginx
    +關注

    關注

    0

    文章

    142

    瀏覽量

    12154

原文標題:Nginx 虛擬主機和反向代理

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關推薦

    高性能負載均衡Tomcat集群的實現(xiàn)

    Nginx+Tomcat搭建高性能負載均衡集群
    發(fā)表于 08-21 14:31

    使用nginx實現(xiàn)tomcat負載均衡

    Nginx+tomcat+memcached實現(xiàn)負載均衡及session(交叉存儲)
    發(fā)表于 08-28 08:52

    主要學習下nginx的安裝配置

    處理。因為有了中間件,使得大型網(wǎng)站在規(guī)劃有了更好的層次性,維護上更加方便。也可以實現(xiàn)負載均衡、安全防護等。Nginx是一個開源高性能、可靠的HTTP中間件、代理服務,在目前企業(yè)中得到了很大的利用。今天
    發(fā)表于 10-19 14:12

    展示一下nginx的學習模塊

    handled requests : Nginx總共處理了13個連接,成功創(chuàng)建13次握手(證明中間沒有失敗的),總共處理了7個請求;Reading : Nginx 讀取到客戶端的Header信息數(shù)
    發(fā)表于 10-19 14:16

    NginxTomcat負載均衡實現(xiàn)session共享

    NginxTomcat負載均衡實現(xiàn)session共享
    發(fā)表于 09-05 10:40 ?9次下載
    <b class='flag-5'>Nginx</b>和<b class='flag-5'>Tomcat</b>負載均衡實現(xiàn)session共享

    http請求 get post

    Http請求類 packagewzh.Http; importjava.io.BufferedReader; importjava.io.IOException
    發(fā)表于 09-27 10:36 ?16次下載

    nginxtomcat區(qū)別

    Tomcat是Apache 軟件基金會的Jakarta 項目中的一個核心項目,由Apache、Sun 和其他一些公司及個人共同開發(fā)而成。Nginx (engine x) 是一個高性能的HTTP和反向代理服務器,也是一個IMAP/
    的頭像 發(fā)表于 02-12 15:37 ?1w次閱讀
    <b class='flag-5'>nginx</b>和<b class='flag-5'>tomcat</b>區(qū)別

    如何發(fā)起 HTTP 請求流程

    OSI體系結(jié)構(gòu)TCP/IP相關協(xié)議結(jié)構(gòu)應用層HTTP,Telnet,F(xiàn)TP等表示層會話層傳輸層TCP,UDP網(wǎng)絡層IP數(shù)據(jù)鏈路層物理層
    發(fā)表于 01-01 14:00 ?4904次閱讀
    如何發(fā)起 <b class='flag-5'>HTTP</b> <b class='flag-5'>請求</b><b class='flag-5'>流程</b>

    HTTP請求方式有哪些

    相信大家在不管是學習、工作或者面試中,肯定會碰到或被問到?HTTP??相關的知識。今天我們來聊聊有哪些?HTTP?請求方式,以及區(qū)別吧! 小伙伴們寫過接口或者使用過網(wǎng)頁開發(fā)者模式的,肯定對以下的內(nèi)容
    的頭像 發(fā)表于 09-02 09:21 ?4544次閱讀

    nginx-http-flv-module音視頻傳輸模塊

    ./oschina_soft/nginx-http-flv-module.zip
    發(fā)表于 06-22 09:44 ?0次下載
    <b class='flag-5'>nginx-http</b>-flv-module音視頻傳輸模塊

    修改應用名稱以及http請求

    修改應用名稱以及http請求
    的頭像 發(fā)表于 12-07 08:48 ?1371次閱讀
    修改應用名稱以及<b class='flag-5'>http</b><b class='flag-5'>請求</b>

    HTTP請求報文:GET和POST的區(qū)別

    GET 和 POST 其實都是 HTTP請求方法。除了這 2 個請求方法之外,HTTP 還有 HEAD、PUT、DELETE、TRACE、CONNECT、OPTIONS 這 6 個
    發(fā)表于 04-10 10:11 ?2204次閱讀

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

    Header 中指定 Origin 請求頭,看是否可以請求成功。 能夠請求成功,說明未對請求頭進行控制,有漏洞。 ? curl?-H?'Origin//test.com'?
    的頭像 發(fā)表于 06-26 10:49 ?1285次閱讀
    基于<b class='flag-5'>Nginx</b>配置origin限制跨域<b class='flag-5'>請求</b>

    如何測試HTTP請求示例

    電子發(fā)燒友網(wǎng)站提供《如何測試HTTP請求示例.zip》資料免費下載
    發(fā)表于 07-13 11:35 ?1次下載
    如何測試<b class='flag-5'>HTTP</b><b class='flag-5'>請求</b>示例

    Nginx 如何實現(xiàn)高性能低消耗

    Nginx 是一個輕量級的HTTP 服務程序,相比其他服務器程序如Apache,Nginx占用內(nèi)存少,穩(wěn)定性高,并發(fā)處理能力強。同時Nginx 還是一個反向代理服務程序,和郵件代理服務
    的頭像 發(fā)表于 11-11 11:31 ?544次閱讀
    <b class='flag-5'>Nginx</b> 如何實現(xiàn)高性能低消耗