只用Tomcat,不用Nginx搭建Web服務(wù),行不行?我曾經(jīng)提出的愚蠢問(wèn)題,今天詳細(xì)給自己解釋下,為什么必須用Nginx!
不用Nginx,只用Tomcat的Http請(qǐng)求流程
瀏覽器處理一個(gè)Http請(qǐng)求時(shí),會(huì)首先通過(guò)DNS服務(wù)器找到域名關(guān)聯(lián)的IP地址,然后請(qǐng)求到對(duì)應(yīng)的IP地址。以阿里云域名管理服務(wù)為例,一個(gè)域名可以最多綁定三個(gè)IP地址,這三個(gè)IP地址需要是公網(wǎng)IP地址,所以首先需要在三個(gè)公網(wǎng)Ip服務(wù)器上部署Tomcat實(shí)例。
此時(shí)我將面臨的麻煩如下
由于DNS域名管理綁定的IP地址有限,最多三個(gè),你如果想要擴(kuò)容4臺(tái)Tomcat,是不支持的。無(wú)法滿足擴(kuò)容的訴求
如果你有10個(gè)服務(wù),對(duì)應(yīng)10套Tomcat集群,就需要10 * 3臺(tái)公網(wǎng)Ip服務(wù)器。成本還是蠻高的。
10個(gè)服務(wù)需要對(duì)應(yīng)10個(gè)域名,分別映射到對(duì)應(yīng)的Tomcat集群
10個(gè)域名我花不起這個(gè)錢啊?。ㄆ鋵?shí)可以用二級(jí)域名配置DNS映射)
公網(wǎng)服務(wù)器作為接入層需要有防火墻等安全管控措施,30臺(tái)公網(wǎng)服務(wù)器,網(wǎng)絡(luò)安全運(yùn)維,我搞不定。
公網(wǎng)IP地址需要額外從移動(dòng)聯(lián)通運(yùn)營(yíng)商或云廠商購(gòu)買,30個(gè)公網(wǎng)IP價(jià)格并不便宜。
前后端分離的情況,Tomcat無(wú)法作為靜態(tài)文件服務(wù)器,只能用Nginx或Apache
以上幾個(gè)問(wèn)題屬于成本、安全、服務(wù)擴(kuò)容等方面。
如果Tomcat服務(wù)發(fā)布怎么辦
Tomcat在服務(wù)發(fā)布期間是不可用的,在發(fā)布期間Http請(qǐng)求打到發(fā)布的服務(wù)器,就會(huì)失敗。由于DNS 最多配置3臺(tái)服務(wù)器,也就是發(fā)布期間是 1/3 的失敗率。 我會(huì)被老板槍斃,用加特林
DNS不能自動(dòng)摘掉故障的IP地址嗎?
不能,DNS只是負(fù)責(zé)解析域名對(duì)應(yīng)的IP地址,他并不知道對(duì)應(yīng)的服務(wù)器狀態(tài),更不會(huì)知道服務(wù)器上Tomcat的狀態(tài)如何。DNS只是解析IP,并沒(méi)有轉(zhuǎn)發(fā)Http請(qǐng)求,所以壓根不知道哪臺(tái)服務(wù)器故障率高。更無(wú)法自動(dòng)摘掉IP地址。
我能手動(dòng)下掉故障的IP地址嗎?
這個(gè)我能,但是還是會(huì)有大量請(qǐng)求失敗。以阿里云為例,配置域名映射時(shí),我可以下掉對(duì)應(yīng)的IP地址,但需要指定域名映射的緩存時(shí)間,默認(rèn)10分鐘。換句話說(shuō),就算你在上線前,摘掉了對(duì)應(yīng)的IP,依然要等10分鐘,所有的客戶端才會(huì)拿到最新的DNS解析地址。
那么把TTL緩存時(shí)間改小,可以嗎? 可以的,但是改小了,就意味更多的請(qǐng)求被迫從DNS服務(wù)器拿最新的映射,整體請(qǐng)求耗時(shí)增加,用戶體驗(yàn)下降!被老板發(fā)現(xiàn),會(huì)罵我。
節(jié)點(diǎn)突然掛掉怎么辦?
雖然可以在DNS管理后臺(tái)手動(dòng)下掉IP地址,但是節(jié)點(diǎn)突然宕機(jī)、Tomcat Crash等因素導(dǎo)致的突然故障,我是來(lái)不及下掉對(duì)應(yīng)IP地址的,我只能打電話告訴老板,“線上服務(wù)崩了,你等我10分鐘改點(diǎn)東西”。
如果這時(shí)候有個(gè)軟件能 對(duì)Tomcat集群健康檢查和故障重試,那就太好了。
恰好,這是 Nginx 的長(zhǎng)處!
Nginx可以健康檢查和故障重試
而Tomcat沒(méi)有。
例如有兩臺(tái)Tomcat節(jié)點(diǎn),在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 }
當(dāng)A節(jié)點(diǎn)出現(xiàn) connect refused時(shí)(端口關(guān)閉或服務(wù)器掛了),說(shuō)明服務(wù)不可用,可能是服務(wù)發(fā)布,也可能是服務(wù)器掛了。此時(shí)nginx會(huì)把失敗的請(qǐng)求自動(dòng)轉(zhuǎn)發(fā)到B節(jié)點(diǎn)。 假設(shè)第二個(gè)請(qǐng)求 請(qǐng)求到A還是失敗,正好累計(jì)2個(gè)失敗了,那么Nginx會(huì)自動(dòng)把A節(jié)點(diǎn)剔除存活列表 60 秒,然后繼續(xù)把請(qǐng)求2 轉(zhuǎn)發(fā)到B節(jié)點(diǎn)進(jìn)行處理。60秒后,再次嘗試轉(zhuǎn)發(fā)請(qǐng)求到A節(jié)點(diǎn)…… 循環(huán)往復(fù),直至A節(jié)點(diǎn)活過(guò)來(lái)……
而這一過(guò)程客戶端是感知不到失敗的。因?yàn)閮纱握?qǐng)求都二次轉(zhuǎn)發(fā)到B節(jié)點(diǎn)成功處理了??蛻舳瞬⒉粫?huì)感知到A節(jié)點(diǎn)的處理失敗,這就是Nginx 反向代理的好處。即客戶端不用直連服務(wù)端,加了個(gè)中間商,服務(wù)端的個(gè)別節(jié)點(diǎn)宕機(jī)或發(fā)布,對(duì)客戶端都毫無(wú)影響。
而Tomcat只是Java Web容器,并不能做這些事情。
10個(gè)服務(wù),10個(gè)Tomcat集群,就要10個(gè)域名,30個(gè)公網(wǎng)IP嗎?
以阿里云為例,域名管理后臺(tái)是可以配置二級(jí)域名映射,所以一個(gè)公網(wǎng)域名拆分為10個(gè)二級(jí)域名就可以了。
所以只用Tomcat,不用Nginx。需要1個(gè)公網(wǎng)域名,10個(gè)二級(jí)域名,30臺(tái)服務(wù)器、30個(gè)公網(wǎng)IP。
當(dāng)我和老板提出這些的時(shí)候,他跟我說(shuō):“你XX瘋了,要不滾蛋、要不想想別的辦法。老子沒(méi)錢,你看我腦袋值幾個(gè)錢,拿去換公網(wǎng)IP吧”。
DNS映射到Tomcat的IP地址,必須要公網(wǎng),成本實(shí)在hold不住。心里苦啊,要是能有一個(gè)軟件,能幫我把一個(gè)域名分別映射到30個(gè)內(nèi)網(wǎng)IP就好了。
恰好 Nginx可以!
Nginx 虛擬主機(jī)和反向代理
例如把多個(gè)二級(jí)域名映射到不同的文件目錄,例如
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; } } }
例如把不同的二級(jí)域名或者URL路徑 映射到不同的 Tomcat集群
分別定義 serverGroup1、serverGroup2 兩個(gè)Tomcat集群
分別把路徑group1、group1 反向代理到serverGroup1、serverGroup2
upstream serverGroup1 { # 定義負(fù)載均衡設(shè)備的ip和狀態(tài) server 192.168.225.100:8080 ; # 默認(rèn)權(quán)重值為一 server 192.168.225.101:8082 weight=2; # 值越高,負(fù)載的權(quán)重越高 server 192.168.225.102:8083 ; server 192.168.225.103:8084 backup; # 當(dāng)其他非backup狀態(tài)的server 不能正常工作時(shí),才請(qǐng)求該server,簡(jiǎn)稱熱備 } upstream serverGroup2 { # 定義負(fù)載均衡設(shè)備的ip和狀態(tài) server 192.168.225.110:8080 ; # 默認(rèn)權(quán)重值為一 server 192.168.225.111:8080 weight=2; # 值越高,負(fù)載的權(quán)重越高 server 192.168.225.112:8080 ; server 192.168.225.113:8080 backup; # 當(dāng)其他非backup狀態(tài)的server 不能正常工作時(shí),才請(qǐng)求該server,簡(jiǎn)稱熱備 } server { # 設(shè)定虛擬主機(jī)配置 listen 80; # 監(jiān)聽的端口 server_name picture.itdragon.com; # 監(jiān)聽的地址,多個(gè)域名用空格隔開 location /group1 { # 默認(rèn)請(qǐng)求 ,后面 "/group1" 表示開啟反向代理,也可以是正則表達(dá)式 root html; # 監(jiān)聽地址的默認(rèn)網(wǎng)站根目錄位置 proxy_pass http://serverGroup1; # 代理轉(zhuǎn)發(fā) index index.html index.htm; # 歡迎頁(yè)面 deny 127.0.0.1; # 拒絕的ip allow 192.168.225.133; # 允許的ip } location /group2 { # 默認(rèn)請(qǐng)求 ,后面 "/group2" 表示開啟反向代理,也可以是正則表達(dá)式 root html; # 監(jiān)聽地址的默認(rèn)網(wǎng)站根目錄位置 proxy_pass http://serverGroup2; # 代理轉(zhuǎn)發(fā) index index.html index.htm; # 歡迎頁(yè)面 deny 127.0.0.1; # 拒絕的ip allow 192.168.225.133; # 允許的ip } error_page 500 502 503 504 /50x.html;# 定義錯(cuò)誤提示頁(yè)面 location = /50x.html { # 配置錯(cuò)誤提示頁(yè)面 root html; } }
經(jīng)過(guò)以上的教訓(xùn),我再也不會(huì)犯這么愚蠢的錯(cuò)誤了,我需要Tomcat,也需要Nginx。
當(dāng)然如果錢足夠多、資源無(wú)限豐富,公網(wǎng)IP、公網(wǎng)服務(wù)器、域名無(wú)限…… 服務(wù)發(fā)布,網(wǎng)站崩潰,無(wú)動(dòng)于衷,可以不用Nginx。
-
Web
+關(guān)注
關(guān)注
2文章
1276瀏覽量
70561 -
防火墻
+關(guān)注
關(guān)注
0文章
425瀏覽量
36005 -
HTTP
+關(guān)注
關(guān)注
0文章
516瀏覽量
32284 -
DNS
+關(guān)注
關(guān)注
0文章
221瀏覽量
20184 -
nginx
+關(guān)注
關(guān)注
0文章
161瀏覽量
12442
原文標(biāo)題:Nginx 虛擬主機(jī)和反向代理
文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
使用nginx實(shí)現(xiàn)tomcat負(fù)載均衡
主要學(xué)習(xí)下nginx的安裝配置
展示一下nginx的學(xué)習(xí)模塊
Nginx和Tomcat負(fù)載均衡實(shí)現(xiàn)session共享

http請(qǐng)求 get post
nginx和tomcat區(qū)別

HTTP請(qǐng)求方式有哪些
HTTP請(qǐng)求報(bào)文:GET和POST的區(qū)別
基于Nginx配置origin限制跨域請(qǐng)求

如何測(cè)試HTTP請(qǐng)求示例

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

評(píng)論