只用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
+關注
關注
2文章
1286瀏覽量
71080 -
防火墻
+關注
關注
0文章
431瀏覽量
36139 -
HTTP
+關注
關注
0文章
524瀏覽量
32609 -
DNS
+關注
關注
0文章
225瀏覽量
20366 -
nginx
+關注
關注
0文章
169瀏覽量
12547
原文標題:Nginx 虛擬主機和反向代理
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
主要學習下nginx的安裝配置
展示一下nginx的學習模塊
http請求 get post
nginx和tomcat區別

HTTP請求方式有哪些
HTTP請求報文:GET和POST的區別
基于Nginx配置origin限制跨域請求

Nginx 如何實現高性能低消耗

評論