當前位置: 妍妍網 > 碼農

既然有了Tomcat,為什麽還要Nginx?

2024-06-27碼農

掃碼關註 後端架構師 」,選擇 星標 公眾號

重磅幹貨,第一時間送達!

責編:架構君 | 來源:五陽

連結: juejin.cn/post/7280088532377534505

上一篇好文:

正文

大家好,我是後端架構師。

只用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。

    你還有什麽想要補充的嗎?

    最後給大家推薦一個ChatGPT 4.0國內網站,是我們團隊一直在使用的,我們對接是OpenAI官網的帳號,給大家打造了一個一模一樣ChatGPT,很多粉絲朋友現在也都透過我拿這種號,價格不貴,關鍵還有售後。

    一句話說明:用官方一半價格的錢,一句話說明:用跟官方 ChatGPT4.0 一模一樣功能,無需魔法,無視封號,不必擔心次數不夠。

    最大優勢:可實作會話隔離!突破限制:官方限制每個帳號三小時可使用40次4.0本網站可實作次數上限之後,手動切換下一個未使用的帳號【相當於一個4.0帳號,同享受一百個帳號輪換使用許可權】

    最後,再次推薦下我們的AI星

    為了跟上AI時代我幹了一件事兒,我建立了一個知識星球社群:ChartGPT與副業。想帶著大家一起探索 ChatGPT和新的AI時代

    有很多小夥伴搞不定ChatGPT帳號,於是我們決定,凡是這三天之內加入ChatPGT的小夥伴,我們直接送一個正常可用的永久ChatGPT獨立帳戶。

    不光是增長速度最快,我們的星球品質也絕對經得起考驗,短短一個月時間,我們的課程團隊釋出了 8個專欄、18個副業計畫

    簡單說下這個星球能給大家提供什麽:

    1、不斷分享如何使用ChatGPT來完成各種任務,讓你更高效地使用ChatGPT,以及副業思考、變現思路、創業案例、落地案例分享。

    2、分享ChatGPT的使用方法、最新資訊、商業價值。

    3、探討未來關於ChatGPT的機遇,共同成長。

    4、幫助大家解決ChatGPT遇到的問題。

    5、 提供一整年的售後服務,一起搞副業

    星球福利:

    1、加入星球4天後,就送ChatGPT獨立帳號。

    2、邀請你加入ChatGPT會員交流群。

    3、贈送一份完整的ChatGPT手冊和66個ChatGPT副業賺錢手冊。

    其它福利還在籌劃中... 不過,我給你大家保證,加入星球後,收獲的價值會遠遠大於今天加入的門票費用 !

    本星球第一期原價 399 ,目前屬於試營運,早鳥價 149 ,每超過50人漲價10元,星球馬上要來一波大的漲價,如果你還在猶豫,可能最後就要以 更高價格加入了 。。

    早就是優勢。 建議大家盡早以便宜的價格加入!

    歡迎有需要的同學試試,如果本文對您有幫助,也請幫忙點個 贊 + 在看 啦!❤️

    在 還有更多優質計畫系統學習資源,歡迎分享給其他同學吧!

    PS:如果覺得我的分享不錯,歡迎大家隨手點贊、轉發、在看。

    最後給讀者整理了一份BAT大廠面試真題,需要的可掃碼加微信備註:「面試」獲取。

    版權申明:內容來源網路,版權歸原創者所有。除非無法確認,我們都會標明作者及出處,如有侵權煩請告知,我們會立即刪除並表示歉意。謝謝!

    END

    最近面試BAT,整理一份面試資料【Java面試BAT通關手冊】,覆蓋了Java核心技術、JVM、Java並行、SSM、微服務、資料庫、數據結構等等。在這裏,我為大家準備了一份2021年最新最全BAT等大廠Java面試經驗總結。

    別找了,想獲取史上最全的Java大廠面試題學習資料

    掃下方二維碼回復面試就好了

    歷史好文:

    掃碼關註後端架構師」,選擇星標公眾號

    重磅幹貨,第一時間送達